重構——改善既有代碼的設計

學習的道路「知識,理論,智慧」。設計模式是很一種優雅的「智慧」,但對於咱們初學者來講還僅僅是留存於文字的「知識」。把「知識」融合到本身的開發中,在不斷探索和總結中造成本身「理論」,再應用到實際中,那麼這纔是是真正屬於咱們本身的「智慧」。重構偏偏是由「知識」到「理論」的必經之路,而書中的各類重構方法無疑是這條路上清晰的路標。算法

代碼的壞味道你們一看都不會陌生,絕對是在咱們的編程中如影隨形的數據庫

 

《重構》爲咱們帶來了一種改進代碼的高效過程,從而完全改變了面向對象設計的方式: 編程

     1)改進軟件設計(整理代碼)
     2)提升代碼質量和可讀性,使軟件系統更易理解和維護
     3)幫助儘早的發現錯誤
     4)提升編程速度
     改善設計、提升可讀性、減小缺陷都是爲了穩住陣腳。良好的設計是成功的一半,停下來經過重構改進設計,或許會在當前減緩速度,但它帶來的後發優點倒是不可低估的。
設計模式

 

友情提示:下面所列出的不是公式,不是別的重構方法不能用,也不是非要重構到相應的設計模式,由於不管是重構仍是應用設計模式,一切的目的都是爲了軟件構架的「優雅」,而不是炫耀技術。另外,兩位做者在描述重構步驟的時候,都不斷重複着「編譯並經過測試」的步驟,這無疑是在強調測試的重要性,和重構的遞進性,切不可一措而蹴。數組

代碼的壞味道 通常重構方法 使用模式重構
重複代碼 提煉方法
提取類
方法上移
替換算法
鏈構造方法
構造Template Method
以Composite取代一/多之分
引入Null Object
用Adapter統一接口
用Fatory Method引入多態建立
過長方法 提取方法
組合方法
以查詢取代臨時變量
引入參數對象
保持對象完整
轉移彙集操做到Vistor
以Strategy取代條件邏輯
以Command取代條件調度程序
轉移彙集操做到Collecting Parameter
過長參數列 以方法取代參數
引入參數對象
保持對象完整
 
條件邏輯過分複雜 分解條件式
合併條件式
合併重複的條件片斷
移除控制標記
以衛語句取代嵌套條件式
以多態取代條件式
引入斷言
以Strategy取代條件邏輯
轉移裝飾功能到Decorator
以State取代狀態改變條件語句
引入Null Object
分支語句 提取方法
轉移方法
以子類取代類型代碼
以多態取代條件式
已明確方法取代參數
以State/Strategy取代類型代碼
引入Null Object
以Command替換條件調度程序
轉移彙集操做到Visitor
基本類型迷戀
程序代碼過於依賴基本類型(int,string,double,array等低層次語言要素)
以對象取代數據值
以類型取代類型代碼
以子類取代類型代碼
提取類
引入參數對象
以對象取代數組
以State取代狀態改變條件語句
以Strategy取代條件邏輯
以Composite取代隱含樹
以Interpreter取代隱式語言
轉移裝飾功能到Decorator
用Builder封裝Composite
數據泥團
在類的字段和參數列中,老是一塊兒出現的數據
提取類
引入參數對象
保持對象完整
 
使人迷惑的臨時字段 提取類 引入Null Object
組合爆炸
許多段代碼使用不一樣種類或數量的數據或對象作一樣的事情(例如使用特定條件和數據庫查詢)
  以Interpreter取代隱式語言
過大類 提取類
提取子類
提取接口
複製被監視數據
以Command取代條件調度程序
以State取代狀態改變條件語句
以Interpreter取代隱式語言
冗贅類
再也不作不少工做或沒有用的類
摺疊繼承關係
內聯Singleton
 
不恰當的暴露
在客戶代碼中不該看到類的字段和方法,倒是公開可見的
封裝字段
封裝羣集
移除設置方法
隱藏方法
用Factory封裝類
發散式變化
類常常由於不一樣的緣由在不一樣方向上發生變化,顯然是違反了單一職責原則
提取類  
霰彈式修改
若是遇到變化,必須在不一樣的類中做出相應的修改
轉移方法
轉移字段
內聯類
將建立知識搬移到Factory
依戀情結
方法對於某個類的興趣高過對本身所處的宿主類
轉移方法
提取方法
引入Strategy
引入Visitor
平行繼承體系
當爲一個類增長一個子類時,也必須在另外一個類中增長一個相應的子類
轉移方法
轉移字段
 
誇誇其談將來性 摺疊繼承關係
內聯類
移除參數
移除方法
 
過分耦合的消息連
不斷的向一個對象索求另外一個對象
隱藏委託
提取方法
轉移方法
使用抽象引入Chain Of Responsibility
中間轉手人
類接口中有不少方法都委託給其餘類
移除中間轉手人
內聯方法
以繼承取代委託
 
狎暱關係
類之間彼此依賴於其private成員
轉移方法
將雙向關聯改成單向
提取類
隱藏委託
以繼承取代委託
 
殊途同歸的類 重命名方法
轉移方法
提取超類
用Adapter統一接口
不完善的程序庫類 引入外加方法
引入本地擴展
用Adapter統一接口
用Facade封裝類
純稚的數據類
只擁有字段的數據類
封裝字段
封裝集合
移除設置方法
轉移方法
隱藏方法
 
被拒絕的遺贈
繼承父類時,子類想要選擇繼承的成員
以委託取代繼承  
過多的註釋
爲糟糕的代碼寫大量的註釋
使用一塊兒重構方法,使方法自己達到自說明的效果,讓註釋顯得多餘  
怪異解決方案
在同一系統中使用不一樣的方式解決同一問題
替換算法 用Adapter統一接口

 

 

1.   編寫代碼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 基本類型偏執
10. Switch Statement (switch 驚悚現身)
11. Parallel Inheritance Hierarchies 平衡繼承體系
12. Lazy Class(冗贅類)
13. Speculative Generality(誇誇其談將來性)
14. Temporary Field(使人迷惑的暫時值域)
16. Middle Man(中間轉手人)
17. Inappropriate Intimacy(狎暱關係) 
18. Alternative Classes with Different Interfaces(殊途同歸的類) 
19. Incomplete Library Class(不完善的庫類)       
20. Local Extension (引入本地擴展) 。
21. Data Class(純稚的數據類)
22. Refused Bequest(被拒絕的遺贈)

 

 

2.  從新組織函數的九種方法

1.  Extract Method 提煉函數
2.  Inline Method 內聯函數
3.  Inline Temp 內聯臨時變量
4.  Replace Temp with Query 以查詢代替臨時變量
5.  Introduce Explaining Variable 引入解釋性變量
6.  Split Temporary Variable 分解臨時變量
7.  Remove Assigments to Parameters 移除對參數的賦值
8.  Replace Method with Method object 函數對象取代函數
9.  Substitute Algorithm 替換算法

 

 

3.  對象之間移動特性的八種方法

1.  Move Method 移動函數
2.  Move Field 搬移字段
3.  Extract Class提煉類
4.  Inline Class 將類內聯化
5.  Hide Delegate 隱藏委託關係
6.  Remove middle Man 移除中間人
7.  Introduce Foreign Method 引入外加函數
8.  Introduce Local Extension 引入本地擴展

 

4.  從新組織數據的16種方法

1.  Self Encapsulate Field 自封裝字段
2.  Replace Data Value with Object 對象取代數據值
3.  Change value to Reference 將值對象改成引用對象
4.  Change Reference to Value 將引用對象改成值對象
5.  Replace Array with Object 以對象取代數組
6.  Duplicate Observed data 複製被監視數據
7.  Change Unidirection Association to Bidirectional 將單向關聯改成雙向關聯
8.  Change Bidirectional  Association to Unidirection將雙向關聯改成單向關聯
9.  Replace Magic Number with Symbolic Constant字面常量取代魔法數
10. Encapsulate Field 封裝字段
11. Encapsulate Coolection 封裝集合
12. Replace Record with Data Class 以數據類取代記錄
13. Replace Type Code with Class 以類來取代類型碼
14. Replace Type Code with Subclasses 以子類來取代類型碼
15. Replace Type Code with State/Strategy 以狀態/策略取代類型碼
16. Replace Subclass with Fieldls 以字段取代子類

 

 

5.  簡化條件表達式

 

1.  Decompose Conditional 分解條件表達式
2.  Consolidate Conditional Expression 合併條件表達式
3.  Consolodate Duplicate Conditional Fragments 合併重複的條件片斷
4.  Remove Control Flag 移除控制標記
5.  Replace Nested Conditional with Guard Clauses 以衛語句取代嵌套條件表達式
6.  Replace Conditional with Polymorphism 以多態取代條件表達式
7.  Introduce Null Object 引入Null對象
8.  Introduce Assertion 引入斷言

 

 

6.  簡化函數調用

1.  Rename Method 函數更名
2.  Add Parameter 添加參數
3.  Remove Parameter 移除參數
4.  Separate Query from Modifier 將查詢函數和修改函數分離
5.  Parameterize Method 令函數攜帶參數
6.  Replace Parameter with Explicit Methods 以明確函數取代參數
7.  Preserve whole object 保持對象完整
8.  Replace Parameter with Methods 以函數取代參數
9.  Introduce Parameter Object 引入參數對象
10.  Remove setting Method 移除設置函數
11.  Hide Method 隱藏函數
12.  Replace Constructor with Factory Method 以工廠函數取代構造函數
13.  Encapsulate Downcast 封裝向下轉型
14.  Replace Error Code with Exception 以異常取代錯誤碼
15.  Replace Exception with Test 以測試取代異常

 

 

7.  處理歸納關係

1.  Pull Up Field 字段上移
2.  Pull up Method 函數上移
3.  Pull up Constructor Body 構造函數本體上移
4.  Push down Method 函數下移
5.  Push down Fiedld 字段下移
6.  Extract Subclass 提煉子類
7.  Extract Superclass 提煉超類
8.  Extract Interface 提煉接口
9.   Collapse Hierarchy 摺疊繼承體系
10.  From TemPlate Method 塑造模板函數
11.  Replace Inheritance with delegation 以委託取代繼承
12.   Replace delegation with Inheritance 以繼承代替委託

 

 

8.  大型重構

1.  Tease apart Inheritance 梳理並分解繼承體系
2.  Convert Procedural design to Objects 將過程化設計轉化爲對象設計
3.  Separate Domain from from Presention 將領域和表述/顯示分離
4.  Extract Hierarchy 提煉繼承體系
相關文章
相關標籤/搜索