原创 3.12 lazy class(冗贅類)

你所創建的每一個類,都得有人去理解它,維護它,這些工作都是要花錢的。如果一個類的所得不值其身價。它就應該消失。 某個類原本對得起自己的身價,但重構使它身形縮水,不再做那麼多工作;或開發者事前規劃了某些變化,並添加一個類來應付這些變化,但變

原创 3.15 message chains (過度耦合的消息鏈)

一個對象請求另一個,後者在請求下一個對象,....這就是消息鏈。採取這種方式,意味客戶代碼將與查找過程中的導航結構緊密耦合,一旦對象間的關係發生任何變化,客戶端就不得不做出相應修改。 這時候應該使用hide delegate。 通常更好的

原创 3.10 witch statements(switch 驚悚現身)

面向對象程序的一個最明顯特徵是:少用switch語句。 switch語句常常根據類型碼進行選擇,所以應該使用extract method將switch語句提煉到一個獨立函數中,再以move method將它搬移到需要多態性的那個類裏。此時

原创 9.7 introduce Null object (引入null對象)

需要再三檢查對象是否爲null。 將null值替換爲null對象。 動機: 當某個字段是null時,多態可以扮演另一個較不直觀的用途。 控對象一定是常量,它們的任何成分都不會發生變化。 做法: 爲源類建立一個子類,使其行爲就像是源類的nu

原创 6.2 inline method (內聯函數)

一個函數的本體與名稱同樣清楚易懂。 在函數調用點插入函數本體,然後移除該函數。 動機: 某些函數,其內部代碼和函數名稱同樣清晰易懂。可以去掉該函數。 手上有一羣組織不合理的函數,將它們都內聯到一個大型函數中,再從中提煉出組織合理的小型函數

原创 3.16 Middle Man(中間人)

過度使用委託,某個類的接口有一半的函數都委託給其他類,這樣就是過度運用。應該使用remove middle man,直接和真正負責的對象打交道。如果

原创 3.13 speculative generality (誇誇其談未來性)

如果所有裝置都會被用到,那就值得那麼做,如果用不到,就不值得。用不上的裝置只會擋你的路,所以,把它搬開。 如果某個抽象類其實沒有太大作用,請運用collapse hierarchy,不必要的委託可運用inline class除掉。如果函數

原创 3.17 inappropriateintimacy (狎暱關係)

有時會看到兩個類過於親密,花費太多時間去探究彼此的private成分。 可以採用move method和move field劃清界限。可以運用change bidrectional association to unidirectiona

原创 10.6 replace parameter with explicit methods(以明確函數取代參數)

有一個函數,完全取決於參數值而採取不同行爲。 針對該參數的每一個可能值,建立一個獨立函數。 動機: 如果某個參數有多種可能的值,而函數內又以條件表達式檢查這些參數值,並根據不同參數值做出不同的行爲,那麼就應該使用本項重構。如果以參數決定函

原创 8.15 replace type code with state/strategy (以state/strategy取代類型碼)

有一個類型碼,會影響類的行爲,但你無法通過繼承手法消除它。 以狀態對象取代類型碼。 動機: 如果類型碼的值在對象生命期中發生變化或其他原因使得宿主類不能被繼承。 如果打算在本次重構後以replace conditional with po

原创 3.18 alternative classes with different interfaces(異曲同工的類)

如果兩個函數做同一件事,卻有着不同的簽名,請運用rename method根據他們的用途重新命名。 或許可以使用extract superclass。 點贊 收藏 分享 文章舉報

原创 7.6 remove middle man(移除中間人)

某個類做了過多的簡單委託動作。 讓客戶直接調用受委託類。 動機: 隨着受託類的特性越來越多,這一過程讓你痛苦不已,服務類完全變成一箇中間人,此時應該讓客戶直接調用受託類。 做法: 建立一個函數,用以獲得受託對象。 對於每個委託函數,在服務

原创 7.5 hide delegate (隱藏委託關係)

客戶通過一個委託類來調用另一個對象。 在服務類上建立客戶所需的所有函數,用以隱藏委託關係。 動機: 封裝意味每個對象都應該儘可能少了解系統的其他部分。如此一來,一旦發生變化,需要了解這一變化的對象就會比較少。 如果某個客戶先通過服務對象的

原创 11.11 replace inheritance with delegation(以委託取代繼承)

某個子類只使用超類接口中的一部分,或是根本不需要繼承而來的數據。 在子類中新建一個字段用以保存超類;調整子類函數,令它改而委託超類;然後去掉兩者之間的繼承體系。 動機: 一開始繼承了一個類,隨後發現超類中的許多操作並不真正適用於子類。這種

原创 11.9 collapse hierarchy (摺疊繼承體系)

超類和子類之間無太大區別。 將它們合爲一體。 動機: 繼承體系很容易變的過分複雜。所謂重構繼承體系,往往是將函數和字段在體系中上下移動。完成這些動作後,很可能發現某個子類並未帶來該有的價值,因此需要把超類與子類合併起來。 做法: 選擇想移