close

從大學期間,一直很常看到繼承相關的介紹

當時比較少接觸大專案大框架的我,常常也會覺得,幹嘛搞得這麼麻煩等等.

但近期工作上接觸到很實際有效益的應用,也藉由這次機會,分享給大家

 

這次的實際case是在,我們的PaintByNumber專案中,有許多相似但又不相同的Cell,類似Android的AdapaterView.

我們在不同的頁面中,都會需要一些Cell選單讓使用者選擇要進行的遊戲,但在不同的頁面中,有些Cell要顯示VIP Tag, 有些要顯示廣告Tag, 有些要NewTag, 有些什麼都不要諸如此類.

而這些Cell 卻又有公同的東西, 像是預覽圖, 點擊後的Loading animation, 白色邊框, 灰色陰影等等.

 

當然最差的方法就是每一個不同的Cell都複製一份, 但想當然爾後續的維護成本將會高的難以駕馭,只要有一個新增的功能就需要每一個Class都去調整.

而其次是早期我們想到的方法, 在Inin時使用不同的Enum, 判定Enum後再去對應顯示不同的Tag,這方法解決了大部分重複使用Code的問題, 但卻不是很適合IOS/Android使用Recycle時, 因為RecycleView等使用的邏輯時,先Init出所有的View,再藉由show/hide去控制顯示, 如果今天有100種case, 而我們只需要其中1種, 會導致init出99種完全用不到的東西, 雖然對現在高階手機來講可能不痛不癢, 但記憶體這東西, 一定是越省越好.

而最後我們採用的方法是運用繼承, 把共同的Code全部丟給Parent, 而不一樣的地方生成不同的Child, 統一繼承Parent, 像是上面提到的預覽圖,邊框等等需求, 全部都用Parent處理, Child只要針對各自的Cell需求進行即可, 以最近一次的額外需求為例, 我們要將"所有"的Child增加完成的標籤, 這就很簡單, 在Parent上針對是否完成追加這樣的設定即可, 下面7個Child完全不用動, 這樣的需求就能短時間完成, 並且維持高度的維護性.

 

以上圖為例, 每個箭頭為繼承, 最下方的Cell就能針對不同需求進行調整, 而剛剛提到的當所有的GameCell 都要新增完成標籤時, 統一加在Game Cell 即可.

arrow
arrow
    全站熱搜

    蔥哥 發表在 痞客邦 留言(0) 人氣()