假設一段代碼是不穩定或者有一些潛在問題的,那么代碼往往會包括一些明顯的痕跡。
正如食物要腐壞之前,常常會發出一些異味一樣。
我們管這些痕跡叫做“代碼異味”。
參考資料:
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 -------------(純數據類)類非常easy,僅有公共成員變量,或簡單操作函數。
解決方法:將相關操作封裝進去,降低public成員變量。
- Refused Bequest --------(繼承過多)父類里面方法非常多,子類僅僅用有限幾個。
解決方法:用代理替代繼承關系。
- Comments ---------------(太多凝視)這里指代碼太難懂了,不得不用凝視解釋。
解決方法:避免用凝視解釋代碼,而是說明代碼的目的,背景等。好代碼會說話。