重構改善既有代碼的設計
在日常的編碼過程中,這些知識點可能是非常容易忽視或者由於編碼習慣而出差錯的地方
軟件工程的意義:希望建立完美的需求與設計,按照既有的規編寫標准划一的代碼,這是結構的美;快速迭代和RAD顛覆“全知全能”神話,用近乎刀劈斧砍的方式解決問題,在混沌的循環往復中實現需求,這是解構的美。
Duplicated Code(重復代碼)
- 程序中兩段代碼極度類似
- 判斷是否表達的含義是否一致。
- 是否在別的地方進行引用
- 將其合並為一個類中的一個函數,通過調用來實現功能簡化代碼復用。
- 對於重復代碼,需要提煉者認真思考,提煉后的函數放在那個位置更合適,保證函數的唯一性。
Long Method(過長函數)
- 避免程序中的函數(方法)過長
- 短函數對象好理解,容易閱讀,美觀帶來的全部利益:
- 解釋能力,共享能力,選擇能力
- 設計短函數的原則
- 每當感覺需要以注釋來解釋來說明點什么的時候,就把需要說明的東西寫道一個獨立的函數中,並以其用途命名。
- 關鍵不在於函數的長度,而在於函數“做什么”、“如何做”之間的語義距離
- 如何設計短函數
- 尋找注釋
注釋能表達出此函數的具體含義,體現代碼用途和實現手法之間的語義距離;
哪怕是在函數中的一句注釋,如果此注釋只是用來說明的,也有必要將其設計提煉成一個單獨的函數
- 注意條件表達式和循環程序
Large Class(過大的類)
- 注意那些做太多事情的單個類,他們很可能就是過大的類
- 有太多的代碼
Long Parameter List(過長參數列)
- 合理利用對象的概念,並不是函數所需要的所有東西都得通過參數傳遞,只需要傳遞它當前所需要或者可以自己獲得的東西
- 學會使用對象進行參數傳遞(參數隱藏在對象中,方便后期維護升級)
注意:如果參數列太長或變化太頻繁,需要重新考慮自己的依賴關系。
Divergent Change(發撒式變化)
- 設計的軟件要能夠容易修改且修改地方要小。
- 針對外界變化所有的修改都只應該發生在某一類中,而這個新類內的所有內容都應該反應此變化。
含義:一個類受多種變化的影響
Shotgun Surgery(散彈式修改)
- 含義:表示某一處的修改需要修改程序中多處地方。
- 把需要修改的代碼和函數放到一個類中
Feature Envy(依戀情結)
- 由於數據的緣故,一個函數可能依賴很多函數才能正常運行。
- 將總是變化的東西放在一起。(數據和引用這些數據的行為總是一起變化的)
- 始終保持變化總在一個地方發生
Data Clumps(數據泥團)
- 注意尋找那些字段和參數特別多的類,這些就是數據泥團,需要將其進行拆分。
- 刪除眾多數據中的一項,為它們產生一個新的對象。
- 減少字段和參數的個數,適當的使用新對象進行調用。
Primitive Obsession(基本類型偏執)
- 結構類型允許你講數據組織成有意義的形式,基本類型則是構成結構類型的積木塊。
- 對象的價值:模糊了橫旦於基本數據和體積較大的類之間的界限。
Switch Statements(switch 驚悚現身)
- 利用多態來解決面向過程中的switch語言(switch語句的問題在於重復)
Parallel Inheritance Hierarchies(平行繼承體系)
- 使用一個繼承體系的實例引用另一個繼承體系實例
Message Chains(過渡耦合的消息鏈)
- 函數之間多的次嵌套調用,如果一個函數的變量發生變化則很多函數都需要進行變動,牽一發而動全身。
- 重構消息鏈上的任何對象:先觀察消息鏈最終得到的是什么,看能否將多個消息合並到一個獨立函數中進行處理。
Middle Man(中間人)
- 封裝:對外部世界隱藏其內部細節。
小寄語
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。
我是哉說,感謝您的閱讀,如果對你有幫助,麻煩點贊,轉發 謝謝。