沒有特別精確的衡量標準,只能有類似的跡象
重複代碼:
同一個類的兩個函數含有相同的表達式。
兩個互爲兄弟的子類內含有相同的表達式。
過長函數:找到能提取爲子函數的方法之一是找到註釋
過大的類:分割爲子類,可以先根據調用該類的接口進行分割
過長參數列:通過對象來傳遞一些參數
發散式變化:某個類因爲不同的原因在不同的方向上發生變化,這時候可能需要分割該類了
散彈式變化:遇到變化要在不同類中修改時,把需要修改的代碼放在一個類中
依戀情結:將一些經常使用數據的函數放在和數據一個類中,判斷原則是將總是一起變化的東西放在一塊
數據泥團:將相同的對象團提煉到一個對象上
基本類型偏執:建立小的對象來包含基本類型
switch驚悚現身:大多數可以考慮多態來替換switch
平行繼承體系:問題:當你爲一個類增加一個子類的時候,也要爲另一個類增加子類,一般策略爲讓一個繼承體系的實例引用另一個繼承體系的實例。
冗贅類:當一個類值得維護它的代價,它就應該消失。
誇誇其談未來性:如果函數或類的唯一用戶就是測試用例,這就可以把這些類或者函數刪掉了。
令人迷糊的暫時字段:類中的字段只有部分情況才使用,建議將這些字段和使用的函數重新放在一個類中
過度耦合的消息鏈:當一個用戶向一個對象請求另一個對象,再通過這個對象請求另一個對象。。。這就是消息鏈。
可以將消息鏈中任一個對象重構,但這樣會把一系列對象都變成middle man。另一更好的方法:根據消息鏈最後得到的對象是幹什麼,把使用該對象的代碼提煉爲函數,將該函數推送到消息鏈中
中間人:過度運用委託時可以將該類放進調用端
狎暱關係:兩個類過度去探究彼此的private部分,可以採用提取函數,增加獨立類來達到類的獨立
異曲同工的類:當兩個函數做着相同的事卻有不同的簽名,可以重新命名,並將一些行爲移到類中。
不完美的庫類:修改庫來完成我們需要的功能
數據類:類似數據庫表對應的對象類,只有讀取寫入其他字段的函數。
被拒絕的遺贈:當子類只使用了超類的一部分數據和函數時,傳統的做法:爲子類新建一個兄弟類,將使用不到的函數下推到哪個兄弟,這是基於“所有超類都是抽象的”。建議考慮使用繼承來複用一些行爲
過多的註釋:試着重構讓註釋都顯得多餘