1.胖球產生的原因:
胖球反模式本身是很簡單,但可能由於疏忽,後期沒加以控制,系統急於上線等等原因而出現了。
胖球反模式通過描述一個或幾個類不斷的膨脹,以至吞食掉整個面向對象架構。一般胖球的出現是由於一個類壟斷了處理過程,而其他的類只是數據的封裝體。
雖然OOA&D 提出了很久,但有些人的思維還停留在過程式的設計上,他們習慣把過程和數據分開,而不是OO中把融合了方法和數據的對象進行職責分割。胖球可能是需求分析不當的結果,也可能是系統不斷演進,迭代,新功能和新人員的加入而使部分構件異常龐大而沒有進行有效的職責分割,於是某個類成了構件或整個系統的主宰。
總的來說,出現此種問題的原因主要是缺乏面向對象架構,缺乏對架構的實施和干預以及過程式需求的錯誤引導。
2.症狀和後果:
(1)單個類擁有大量的屬性或操作。
(2)單個類中封裝了異類的、不相關的屬性和操作集。
(3)單個控制器類和幾個簡單的數據對象聯系在一起。
(4)缺乏面向對象的設計,一個控制器類幾乎封裝了所有的應用功能。
(5)控制器類通常過於復雜,無法復用和測試。
(6)把這麼個大類加載如內存中的代價可能會很高。
3.重構方案:
胖球重構的方法很簡單,就是把一些行為重新分配到某些封裝了數據的對象上,並對對象之間的關系從新調整(構件和連接件關系調整)。
(1)確定代表契約的關系操作和屬性集合,也就是把相關的屬性和方法歸類。
(2)尋找這些根據契約的到了集合的“自然的家”,並把它們遷移過去。
(3)移除所有的“遠耦合”或者說冗余的、間接的聯系。
(4)最後,移除所有的瞬時聯系。
總之,我們把一個控制器類變成了一個協調器類,讓開始的數據類擴充一些處理邏輯,數據類在協調類的指導下進行操作,這也只是職責的遷移。
胖球反模式有兩種形式為行為形式和數據形式,所謂行為形式及所有的處理過程都包含在一個對象中,它與系統中的大多數對象進行交互;數據形式的對象則包含的數據被系統的大部分其他對象所使用。