文章目錄
- Code smells
- Duplicated Code
- Long Method
- Large Class
- Long Parameter List
- Divergent Change
- Shotgun Surgery
- Feature Envy
- Data Clumps
- Primitive Obsession
- Switch Statements
- Parallel Inheritance Hierarchies
- Lazy Class
- Speculative Generality
- Temporary Field
- Message Chains
- Middle Man
- Inappropriate Intimacy
- Alternative Classes with Different Interfaces
- Incomplete Library Class
- Data Class
- Refused Bequest
- Comments
本文總結轉載、參考資料:22種代碼的壞味道,一句話概括
如果一段代碼是不穩定或者有一些潛在問題的,那麼代碼往往會包含一些明顯的痕跡。
正如食物要腐壞之前,經常會發出一些異味一樣。
我們管這些痕跡叫做“代碼異味”。
Code smells
Duplicated Code
(重複代碼)難維護。
[解決方法]:提取公共函數。
Long Method
(函數長)難理解。
[解決方法]:拆分成若干函數。
Large Class
(類大)難理解。
[解決方法]:拆分成若干類。
Long Parameter List
(參數多)難用,難理解。
[解決方法]:將參數封裝成結構或者類。
Divergent Change
(萬能類)發散試修改,改好多需求,都會動他。
[解決方法]:拆,將總是一起變化的東西放在一塊兒。
Shotgun Surgery
(天女散花的邏輯)散彈試修改,改某個需求的時候,要改很多類。
[解決方法]:將各個修改點,集中起來,抽象成一個新類。
Feature Envy
(紅杏出牆的函數)使用了大量其他類的成員
[解決方法]:將這個函數挪到那個類裏面。
Data Clumps
(數據團)常一起出現的一坨數據。
[解決方法]:他們那麼有基情,就在一起吧,給他們一個新的類。
Primitive Obsession
(偏愛基本類型)熱衷於使用int, long, String等基本類型。
[解決方法]:反覆出現的一組參數,有關聯的多個數組換成類吧。
Switch Statements
(switch語句)
[解決方法]:state/strategy 或者只是簡單的多態。
Parallel Inheritance Hierarchies
(平行繼承)增加A類的子類ax,B類也需要相應的增加一個bx。
[解決方法]:應該有一個類是可以去掉繼承關係的。
Lazy Class
(冗贅類)如果他不幹活了,炒掉他吧。
[解決方法]:把這些不再重要的類裏面的邏輯,合併到相關類,刪掉舊的。
Speculative Generality
(誇誇其談未來性)
[解決方法]:刪掉
Temporary Field
(臨時字段)僅在特定環境下使用的變量
[解決方法]:將這些臨時變量集中到一個新類中管理。
Message Chains
(消息鏈)過度耦合的纔是壞的。
[解決方法]:拆函數或者移動函數。
Middle Man
(中介)大部分都交給中介來處理了。
[解決方法]:用繼承替代委託。
Inappropriate Intimacy
(太親密)兩個類彼此使用對方的私有的東西。
[解決方法]:劃清界限拆散,或合併,或改成單項聯繫。
Alternative Classes with Different Interfaces
(相似的類,有不同接口)
[解決方法]:重命名,移動函數,或抽象子類。
Incomplete Library Class
(不完善的類庫)
[解決方法]:包一層函數或包成新的類。
Data Class
(純數據類)類很簡單,僅有公共成員變量,或簡單操作函數。
[解決方法]:將相關操作封裝進去,減少public成員變量。
Refused Bequest
(繼承過多)父類裏面方法很多,子類只用有限幾個。
[解決方法]:用代理替代繼承關係。
Comments
(太多註釋)這裏指代碼太難懂了,不得不用註釋解釋。
[解決方法]:避免用註釋解釋代碼,而是說明代碼的目的,背景等。好代碼會說話。