反模式讀書筆記之胖球(—)
摘要:反模式作為一種新視角模式,在表述和指導(dǎo)開發(fā)上與傳統(tǒng)設(shè)計(jì)模式不同,他先提出模式的反面案例,而后在給出重構(gòu)方案,這在指導(dǎo)開發(fā)人員(尤其是新手)不無(wú)裨益。本系列筆記為個(gè)人學(xué)習(xí)總結(jié),也希望沒有接觸過(guò)反模式的朋友們一起學(xué)習(xí)進(jìn)步。
正文:
1. 胖球產(chǎn)生的原因:
胖球反模式本身是很簡(jiǎn)單,但可能由于疏忽,后期沒加以控制,系統(tǒng)急于上線等等原因而出現(xiàn)了。
胖球反模式通過(guò)描述一個(gè)或幾個(gè)類不斷的膨脹,以至吞食掉整個(gè)面向?qū)ο蠹軜?gòu)。一般胖球的出現(xiàn)是由于一個(gè)類壟斷了處理過(guò)程,而其他的類只是數(shù)據(jù)的封裝體。
雖然OOA&D 提出了很久,但有些人的思維還停留在過(guò)程式的設(shè)計(jì)上,他們習(xí)慣把過(guò)程和數(shù)據(jù)分開,而不是OO中把融合了方法和數(shù)據(jù)的對(duì)象進(jìn)行職責(zé)分割。胖球可能是需求分析不當(dāng)?shù)慕Y(jié)果,也可能是系統(tǒng)不斷演進(jìn),迭代,新功能和新人員的加入而使部分構(gòu)件異常龐大而沒有進(jìn)行有效的職責(zé)分割,于是某個(gè)類成了構(gòu)件或整個(gè)系統(tǒng)的主宰。
總的來(lái)說(shuō),出現(xiàn)此種問(wèn)題的原因主要是缺乏面向?qū)ο蠹軜?gòu),缺乏對(duì)架構(gòu)的實(shí)施和干預(yù)以及過(guò)程式需求的錯(cuò)誤引導(dǎo)。
2. 癥狀和后果:
(1) 單個(gè)類擁有大量的屬性或操作。
(2) 單個(gè)類中封裝了異類的、不相關(guān)的屬性和操作集。
(3) 單個(gè)控制器類和幾個(gè)簡(jiǎn)單的數(shù)據(jù)對(duì)象聯(lián)系在一起。
(4) 缺乏面向?qū)ο蟮脑O(shè)計(jì),一個(gè)控制器類幾乎封裝了所有的應(yīng)用功能。
(5) 控制器類通常過(guò)于復(fù)雜,無(wú)法復(fù)用和測(cè)試。
(6) 把這么個(gè)大類加載如內(nèi)存中的代價(jià)可能會(huì)很高。
3. 重構(gòu)方案:
胖球重構(gòu)的方法很簡(jiǎn)單,就是把一些行為重新分配到某些封裝了數(shù)據(jù)的對(duì)象上,并對(duì)對(duì)象之間的關(guān)系從新調(diào)整(構(gòu)件和連接件關(guān)系調(diào)整)。
(1) 確定代表契約的關(guān)系操作和屬性集合,也就是把相關(guān)的屬性和方法歸類。
(2) 尋找這些根據(jù)契約的到了集合的“自然的家”,并把它們遷移過(guò)去。
(3) 移除所有的“遠(yuǎn)耦合”或者說(shuō)冗余的、間接的聯(lián)系。
(4) 最后,移除所有的瞬時(shí)聯(lián)系。
總之,我們把一個(gè)控制器類變成了一個(gè)協(xié)調(diào)器類,讓開始的數(shù)據(jù)類擴(kuò)充一些處理邏輯,數(shù)據(jù)類在協(xié)調(diào)類的指導(dǎo)下進(jìn)行操作,這也只是職責(zé)的遷移。
胖球反模式有兩種形式為行為形式和數(shù)據(jù)形式,所謂行為形式及所有的處理過(guò)程都包含在一個(gè)對(duì)象中,它與系統(tǒng)中的大多數(shù)對(duì)象進(jìn)行交互;數(shù)據(jù)形式的對(duì)象則包含的數(shù)據(jù)被系統(tǒng)的大部分其他對(duì)象所使用。
本博客為學(xué)習(xí)交流用,凡未注明引用的均為本人作品,轉(zhuǎn)載請(qǐng)注明出處,如有版權(quán)問(wèn)題請(qǐng)及時(shí)通知。由于博客時(shí)間倉(cāng)促,錯(cuò)誤之處敬請(qǐng)諒解,有任何意見可給我留言,愿共同學(xué)習(xí)進(jìn)步。