程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 【重構學習】02 何處重構?,重構學習02

【重構學習】02 何處重構?,重構學習02

編輯:C#入門知識

【重構學習】02 何處重構?,重構學習02


1、重復代碼

  解決方案:

  • 重復代碼位於同一個類:提煉成新函數進行調用
  • 重復代碼位於不同的子類:提煉成函數放進父類
  • 重復代碼位於完全不相干的類:提煉出一個新的類,將重復代碼放進新的類中
  • 重復代碼並非完全相同,存在些微差異性:用模版方法的設計模式解決

2、函數過長和參數列過長

  修改點:

  • 有注釋的地方就可能有修改點,因為一個地方既然值得你去寫注釋,那麼就已經存在將其提煉出來的可能性,即使它只有一行代碼
  • 條件表達式和循環處:將分支邏輯和實現細節分離,都可以函數化。而循環可以放到單獨的一個函數裡。 

  解決方案:

  • 不存在太多參數和臨時變量的情況:提煉成新函數進行調用(有太多臨時變量和參數,會導致提煉出來的函數可讀性可能並不會得到提升)
  • 臨時變量多:將臨時變量替換成查詢方法,再進行提煉
  • 參數過多:參考參數列過長的處理辦法
  • 依然存在很多臨時變量和參數:用方法對象替代方法,簡單地說搞一個類,臨時變量作為這個的字段,然後代碼提煉為裡面的方法

3、過大的類

  解決方案:提煉新的獨立類或者子類

4、參數列過長

  解決方案:

  • 對象替代法:將多個參數放入一個參數對象中,再進行傳遞(不僅提高可讀性,因為傳遞的只是引用所以會少開辟棧空間,提高性能)
  • 函數替代法:看能否將這些參數用函數替代,簡單的說就是將這些參數的計算部分放到一個函數裡,返回結果再傳值

5、發散式變化(一個類受多種變化影響,貌似就是單一職責原則)目標:外界變化和需要修改的類一一對應

  修改點:軟件一旦發生多種變化,但是都修改同一個類,說明此類職責重復

  解決方案:找出某種特殊原因造成的所有變化,然後將它們提取到另一個類裡面

6、霰彈式修改(一個變化修改多個類)目標:外界變化和需要修改的類一一對應

  修改點:軟件一旦發生變化,造成要修改很多類

  解決方案:找出某種變化引起的不同類中的眾多修改點,將各個類中修改點放到一個類中

7、依戀情節

  修改點:

  當一個類的函數為了計算經常調用另一個類的一大堆的函數時就表示出現了依戀情節。

  1和0的世界裡面出現了如此具有文藝氣質的詞,那麼我們就用文藝的手法去理解:你們家的女朋友經常去找別人家的漢子時,你多多少少需要知道壞了。

  解決方案:

  如果這段代碼完全依戀另一個類,那麼將此部分出現依戀情節的代碼提煉成函數放到另一個類裡面(這告訴我們當一個女人完全不愛你的時候要學會放手?)

  然而很多時候並非這麼簡單,它兩個類都有依戀呢?(然而很多時候並非這麼簡單,她兩個都愛呢?)

  那就判斷哪個類擁有最多被此函數使用的數據,然後就把此函數和那些數據擺在一起。(判斷她愛哪個的優點多一點,就讓她去找誰吧?)

  難怪大家都說程序員都是好男人@_@

  然而Martin大神多說了一句:

  如果先提取方法將這段代碼分割成不同的數個較小的獨立函數上述步驟會簡單很多。(請恕我直言,左腿和左手我要了,刀交給你了,你隨意?)

  --太可怕了,我先冷靜冷靜,明天繼續

8、數據泥團

9、基本類型偏執

10、Switch驚悚現身

11、平行繼承體系

12、冗贅類

13、誇誇其談未來性

14、令人迷惑的暫時字段

15、過度耦合的消息鏈

16、中間人

17、狎昵關系

18、異曲同工的類

19、不完美的庫類

20、純稚的數據類

21、被拒絕的遺贈

22、過多的注釋

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved