【讀書】代碼壞味道-《重構》

Martin Fowler也在其著作《重構:改善即有代碼的設計》提到:“代碼壞味道(Bad Code Smells)”是低質量的代碼設計和實現所顯現的“症狀”。書中羅列了22種代碼壞味道以及對應的重構手法。

  • 1 Duplicated Code --(重複代碼)難維護。

[解決方法]:同一個類中則提取公共函數,不同類中可以函數提煉獨立類,或者提到父類。

  • 2 Long Method --(函數長)難理解。

[解決方法]:拆分成若干函數,消除函數內的臨時變量,從而使函數體變短。

  • 3 Large Class --(類大)難理解。

[解決方法]:拆分成若干類,將相關性比較高的屬性或方法放到一個新的類。

  • 4 Long Parameter List --(參數多)難用,難理解。

[解決方法]:將參數封裝成結構或者類。

  • 5 Divergent Change --(萬能類)發散式修改,一個類受多種變化的影響,好多需求的修改,都會動他。

[解決方法]:將總是一起變化的東西拆到一個新的類。

  • 6 Shotgun Surgery --(天女散花的邏輯)散彈式修改,改某個需求的時候,要改很多類。

[解決方法]:將各個修改點,集中起來,合成一個新類。

  • 7 Feature Envy --(紅杏出牆的函數)使用了大量其他類的成員

[解決方法]:將這個函數挪到那個類裡面。

  • 8 Data Clumps --(數據團)常一起出現的一坨數據。

[解決方法]:他們那麼有基情,就在一起吧,給他們一個新的類。

  • 9 Primitive Obsession --(偏愛基本類型)熱衷於使用int,long,String等基本類型。

[解決方法]:反覆出現的一組變量,完全可以用對象來代替這些變量。

  • 10 Switch Statements --(switch語句)switch驚悚現身

[解決方法]:多數情況下簡單的多態就可以解決,或者是枚舉可以解決。另外就是state/strategy模式。

  • 11 Parallel Inheritance Hierarchies --(平行繼承)增加A類的子類ax,B類也需要相應的增加一個bx。

[解決方法]:應該有一個類是可以去掉繼承關係的,繼承改為組合。

  • 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 --(純數據類)類很簡單,僅有公共成員變量,或簡單操作函數。

[解決方法]:將相關操作封裝進去,減少public成員變量(映射了數據庫的對象除外)。

  • 21 Refused Bequest --(繼承過多)父類裡面方法很多,子類只用有限幾個。

[解決方法]:用委託替代繼承關係。

  • 22 Comments --(太多註釋)這裡指代碼太難懂了,不得不用註釋解釋。

[解決方法]:避免用註釋解釋代碼,而是說明代碼的目的,背景等。好代碼會說話。

  • 注:

作為一本很多年前的書,其中關注的Java語言與軟件工程方法論已經發展了,有部分“壞味道”需要發展的眼光來看。


分享到:


相關文章: