1. Duplicated Code(重複代碼) session
2. Long Method (過長函數) app
包含太多信息,這些信息又被函數錯綜複雜的邏輯掩蓋,不易鑑別。 函數
如何肯定該提煉哪一段代碼呢?一個很好的技巧是:尋找註釋。它們一般能指出代碼用途和實現手法之間的語義距離。若是代碼前方有一行註釋,就是在提醒你:能夠將這段代碼替換成一個函數,並且能夠在註釋的基礎上給這個函數命名。就算只有一行代碼,若是須要以註釋來講明,那也值得將它提煉到獨立函數去。 對象
3. Large Class(過大的類) 繼承
4. Long Parameter List(過長參數列) it
5. Divergent Change(發散式變化) io
針對某一外界變化的全部相應修改,都只應該發生在單一類中,而這個新類內的全部內容都應該反應此變化。爲此,你應該找出某特定緣由而形成的全部變化,而後運用Extract Class 將它們提煉到另外一個類中。 基礎
6. Shotgun Surgery(霰彈式修改) sed
Shotgun Surgery 與Divergent Change偏偏相反。若是每遇到某種變化,你都必須在許多不一樣的類內作出許多小修改,你所面臨的壞味道就是Shotgun Surgery。這種狀況下你應該使用Move Method 和Move Field 把全部須要修改的代碼放進同一個類。若是眼下沒有合適的類能夠安置這些代碼,就創造一個。一般能夠運用Inline Class把一系列相關行爲放進同一個類。這可能會形成少許Divergent Change,但你能夠輕易處理她。 List
7. Feature Envy (依戀情結)
8. Data Clumps(數據泥團)
縮短參數列,簡化函數調用。一個好的評判辦法是:刪掉衆多數據中的一項。這麼作,其餘數據有沒有於是失去意義?若是它們再也不有意義,這就是個明確信號:你應該爲它們產生一個新對象。
9. Primitive Obsession(基本類型偏執)
10. Switch Statements(switch 驚悚現身)
11. Parallel Inheritance Hierarchies (平行繼承體系)
Parallel Inheritance Hierarchies 實際上是Shotgun Surgery 的特殊狀況。在這種狀況下,每當你爲某個類增長一個子類,必須也爲另外一個類相應增長一個子類。若是你發現某個繼承體系的類名稱前綴和另外一個繼承體系的類名稱前綴徹底相同,即是問到了這種壞味道。
消除這種重複性的通常策略是:然一個集成體系的實例引用另外一個繼承體系的實例。
12. Lazy Class (冗贅類)
13 Speculative Generality(誇誇其談將來性)
14 Temporary Field (使人迷惑的暫時字段)
15 Message Chains (過分耦合的消息鏈)
16 Middle Man(中間人)
17 Inappropriate Intimacy(狎暱關係)
18 Alternative Classes with Different Interfaces(殊途同歸的類)
19 Incomplete Library Class(不完美的庫類)
20 Data Class(純稚的數據類)
21 Refused Bequest (被拒絕的遺贈)
22 comments (過多的註釋)