1.重複的代碼(重複的代碼修改時需要修改多處,容易出現不一致)
如果一個類內有多個函數有重複的代碼,可以提取出來放到一個新函數中,然後讓用到這些代碼的函數調用新函數;如果互為兄弟的兩個子類中含有重複代碼,則可以提取出來放到父類中;如果其功能骨架相同,可用模版方法模式;如果毫不相干的兩個類中有重複代碼,可提取出來放到一個單獨的類中,然後通過複合調用新類。
2.過長函數(難以理解)
函數過長時可以把它分解為多個小型函數,以函數做什麼而不是怎麼做命名函數,如果函數參數列過長,可以考慮引入一個參數對象,如果還不行,就可以考慮用函數對象代替函數。
3.類的職責過多(單一職責原則)
一個類應該專心做好一件事情,不要做太多事情,如果類的職責過多,可以把相關的執行個體變數和函數提煉到一個新類中。
4.過長參數列(過長參數難以記憶,而且不易理解)
可以引進一個參數對象或者用函數對象代替函數。
5.一個類受多種變化的影響(外界的多種變化都需要修改某個類)
把每種變化可能影響的方面提煉成單獨的類,使每個類只受某一種外界變化的影響。
6.一種變化影響多個類(外界的某種變化需要修改多個類)
把這種改變的影響提煉到一個類中。
7.某個類中的函數對另外一個類依賴更多
如果某個類中的函數對另一個類的依賴大於它所在的類,可以考慮把該函數移到它依賴性最大的類中。
8.相同資料項目
如果兩個類中有多個相同的欄位或者多個函數簽名中有相同的參數列,可以把他們提取出來放到一個單獨的類中。
9.switch語句
看到switch語句,可以考慮用多態替換它,至少可以提煉到單獨的函數中。
10.平行繼承體系
兩個平行的繼承體系,修改其中一個結構中的類則要相應的修改另一個結構中的類,則可以考慮讓一個體系中的實體引用另一個體系中的實體。
11.冗餘類
如果一個類沒有存在的價值,則可以消除它。
12.夸夸其談未來性
不要對未來做出過多的假設,只要做出合理的假設。
13.令人迷惑的暫時欄位
如果某個執行個體變數只在特定情況下才需要,並不是所有執行個體都需要,則可以考慮把該執行個體變數和與其相關的代碼放到一個新類中。
14.單純的資料類
不要使用單純的資料類,應該讓他們承擔一些責任。