天天看點

重構:改善既有代碼的設計 讀書筆記2

- Large Class(巨大的類):如果希望寫一個類來做很多的事情,那麼最終勢必導緻重複和混亂的代碼。類的設計應當遵循單一職責原則(SRP)。重構一個巨大的類可以使用抽取接口的方式來搞清楚這個類應該如何分解。

- Long Parameter List(長參數清單):這個對于做過Windows程式設計或者用過MFC(Microsoft Foundation Class)的程式員來說再熟悉不過了,Windows函數和MFC中的方法那些長得變态的參數清單對程式員來說都是惡夢。重構的方式很多,比較常見的是将相關的參數組織成一個對象來替換掉這些參數。

- Divergent Change(分散的可變性)和Shotgun Surgery(散彈式手術):這兩種壞味道前者講的是新功能難以加入,後者說的是某種變化會引發多個細節的修改。簡單的說如果程式中的可變因素散落在代碼的各個角落中,那麼代碼的維護将是一場惡夢。重構的方法是找到特定原因造成的所有變化,然後将它們抽取到另一個類中。設計模式中的橋梁模式就是為了解決這一問題而提供的解決方案。

- Feature Envy:這個真沒想到如何翻譯會比較容易了解,簡單的說就是一個方法從另一個類的對象那裡擷取許多的值,重構的方案是将該方法移到另一個類中。聽起來很簡單,但是在實踐的時候卻經常會忘了這麼做。

- Data Clumps(資料群集):狀況類似于長參數清單。

- Primitive Obsession(基本類型偏執)。一個類中如果有很多基本類型的成員,通常可以考慮将不同的基本類型分散組裝成對象,就像Hibernate中的組合映射那樣,将一個類的對象嵌入到另一個類中作為其成員而不是隻寫一個類,裡面有很多基本資料類型的成員。

- Switch Statements(重複的switch語句):面向對象程式的一個明顯特征就是用多态替換掉switch結構,因為這種switch結構會在多個地方重複。

- Parallel Inheritance Hierarchies(平行繼承結構):情況跟Shortgun Surgery差不多,可以使用橋梁模式進行重構。

- Lazy Class(備援類):如果一個類不值得存在,那麼它就應該消失。

- Speculative Generality(投機通用性):如果你的抽象類、委托、方法的參數沒有實際的作用,那麼就應當被移除掉。

- Temporary Field(臨時字段):類中某個字段隻為某些特殊情況而設定。

- Message Chains(消息鍊):我個人并沒有感覺到這個有多麼壞。

- Middle Man(中間人):如果一個類的很多功能都通過委托給其他類來完成,那麼就不如去掉這些中間人直接和真正負責的對象打交道。