學習的道路「知識,理論,智慧」。設計模式是很一種優雅的「智慧」,但對於咱們初學者來講還僅僅是留存於文字的「知識」。把「知識」融合到本身的開發中,在不斷探索和總結中造成本身「理論」,再應用到實際中,那麼這纔是是真正屬於咱們本身的「智慧」。重構偏偏是由「知識」到「理論」的必經之路,而書中的各類重構方法無疑是這條路上清晰的路標。算法
代碼的壞味道你們一看都不會陌生,絕對是在咱們的編程中如影隨形的數據庫
《重構》爲咱們帶來了一種改進代碼的高效過程,從而完全改變了面向對象設計的方式: 編程
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. Decompose Conditional 分解條件表達式