重構改善既有代碼的設計---筆記


重構改善既有代碼的設計

在日常的編碼過程中,這些知識點可能是非常容易忽視或者由於編碼習慣而出差錯的地方

軟件工程的意義:希望建立完美的需求與設計,按照既有的規編寫標准划一的代碼,這是結構的美;快速迭代和RAD顛覆“全知全能”神話,用近乎刀劈斧砍的方式解決問題,在混沌的循環往復中實現需求,這是解構的美。

Duplicated Code(重復代碼)

  • 程序中兩段代碼極度類似
  1. 判斷是否表達的含義是否一致。
  2. 是否在別的地方進行引用
  3. 將其合並為一個類中的一個函數,通過調用來實現功能簡化代碼復用。
  • 對於重復代碼,需要提煉者認真思考,提煉后的函數放在那個位置更合適,保證函數的唯一性。

Long Method(過長函數)

  • 避免程序中的函數(方法)過長
  1. 短函數對象好理解,容易閱讀,美觀帶來的全部利益:
  2. 解釋能力,共享能力,選擇能力
  • 設計短函數的原則
  1. 每當感覺需要以注釋來解釋來說明點什么的時候,就把需要說明的東西寫道一個獨立的函數中,並以其用途命名。
  2. 關鍵不在於函數的長度,而在於函數“做什么”、“如何做”之間的語義距離
  • 如何設計短函數
  1. 尋找注釋

注釋能表達出此函數的具體含義,體現代碼用途和實現手法之間的語義距離;

哪怕是在函數中的一句注釋,如果此注釋只是用來說明的,也有必要將其設計提煉成一個單獨的函數

  1. 注意條件表達式和循環程序

Large Class(過大的類)

  1. 注意那些做太多事情的單個類,他們很可能就是過大的類
  2. 有太多的代碼

Long Parameter List(過長參數列)

  1. 合理利用對象的概念,並不是函數所需要的所有東西都得通過參數傳遞,只需要傳遞它當前所需要或者可以自己獲得的東西
  2. 學會使用對象進行參數傳遞(參數隱藏在對象中,方便后期維護升級)

注意:如果參數列太長或變化太頻繁,需要重新考慮自己的依賴關系。

Divergent Change(發撒式變化)

  1. 設計的軟件要能夠容易修改且修改地方要小。
  2. 針對外界變化所有的修改都只應該發生在某一類中,而這個新類內的所有內容都應該反應此變化。

含義:一個類受多種變化的影響

Shotgun Surgery(散彈式修改)

  1. 含義:表示某一處的修改需要修改程序中多處地方。
  2. 把需要修改的代碼和函數放到一個類中

Feature Envy(依戀情結)

  1. 由於數據的緣故,一個函數可能依賴很多函數才能正常運行。
  2. 將總是變化的東西放在一起。(數據和引用這些數據的行為總是一起變化的)
  3. 始終保持變化總在一個地方發生

Data Clumps(數據泥團)

  1. 注意尋找那些字段和參數特別多的類,這些就是數據泥團,需要將其進行拆分。
  2. 刪除眾多數據中的一項,為它們產生一個新的對象。
  3. 減少字段和參數的個數,適當的使用新對象進行調用。

Primitive Obsession(基本類型偏執)

  1. 結構類型允許你講數據組織成有意義的形式,基本類型則是構成結構類型的積木塊。
  2. 對象的價值:模糊了橫旦於基本數據和體積較大的類之間的界限。

Switch Statements(switch 驚悚現身)

  1. 利用多態來解決面向過程中的switch語言(switch語句的問題在於重復)

Parallel Inheritance Hierarchies(平行繼承體系)

  1. 使用一個繼承體系的實例引用另一個繼承體系實例

Message Chains(過渡耦合的消息鏈)

  1. 函數之間多的次嵌套調用,如果一個函數的變量發生變化則很多函數都需要進行變動,牽一發而動全身。
  2. 重構消息鏈上的任何對象:先觀察消息鏈最終得到的是什么,看能否將多個消息合並到一個獨立函數中進行處理。

Middle Man(中間人)

  1. 封裝:對外部世界隱藏其內部細節。

小寄語

人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。

我是哉說,感謝您的閱讀,如果對你有幫助,麻煩點贊,轉發 謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM