重構(名詞):對軟件內部結構的一種調整,目的是在不改變軟件可觀察行爲的前提下,提升其可理解性,下降其修改爲本。算法
重構(動詞): 使用一系列重構手法,在不改變軟件可觀察行爲的前提下,調整其結構。編程
1. 重構改進軟件設計數組
2.重構使軟件更容易理解ide
3. 重構提升編程速度函數
1.添加功能 時重構測試
若是你發現本身須要爲程序添加一個特性,而代碼結構使你沒法很方便地達成目的,那就先重構那個程序,使特性的添加比較容易進行,而後再添加特性。spa
2.修補錯誤時重構.net
3.複審代碼時重構設計
1. 重構以前,首先檢查本身是否有一套可靠的測試機制。這些測試必須有自我檢測能力。orm
2. 找 出代碼的邏輯泥團並用Extract Method (Alt + Shift + R) 把它提煉到獨立的函數中。
2.1 首先找到函數內的局部變量和參數,任何不會被修改的變量均可以被當作參數傳入新的函數,而會被修改的變量就須要格外當心。
Tips:重構技術就是以微小的步伐修改程序。若是你犯下錯誤,很容易即可發現它。
2.2 修改難以理解的變量名稱,提升代碼的清晰度。
2.3 查看代碼段是否放錯了位置。絕大多數狀況下,函數應該放在它所使用的數據的所屬對象內。移動可使用Move Method(Alt + Shift + V)先把代碼複製到新類 調整代碼而後從新編譯。
2.4 找出程序中對於舊函數的全部引用點,並修改它們,讓它們改用新函數。作完以後,去掉舊函數。進行測試。
有時候也能夠保留舊函數,讓它調用新函數。若是舊函數是一個public函數,而你又不想修改其餘類的接口,這即是一個有用的手法。
從新組織函數
Introduce Explaining Variable (引入解釋性變量)
Split Temporary Variable (分解臨時變量)
Remove Assignments to Parameters (移除對參數的賦值)
Replace Method with Method Object (以函數對象取代函數)
在對象之間搬移特性
Introduce Foreign Method (引入外加函數)
Introduce Local Extension (引入本地擴展)
從新組織數據
Self Encapsulate Field (自封裝字段)
Replace Data Value with Object (以對象取代數據值)
Change Value to Reference (將值對象改成引用對象)
Change Reference to Value (將引用對象改成值對象)
Replace Array with Object (以對象取代數組)
Duplicate Observed Data (複製「被監視數據」)
Change Unidirectional Association to Bidirectional (將單向關聯改成雙向關聯)
Change Bidirectional Association to Unidirectional (將雙向關聯改成單向關聯)
Replace Magic Number with Symbolic Constant (以字面常量取代魔法數)
Replace Record with Data Class (以數據取代記錄)
Replace Type Code with Class (以類取代類型碼)
Replace Type Code with Subclasses (以子類取代類型碼)
Replace Type Code with State/Strategy (以State/Strategy取代類型碼)
Replace Subclass with Fields (以字段取代子類)
簡化條件表達式
Decompose Conditional (分解條件表達式)
Consolidate Conditional Expression (合併條件表達式)
Consolidate Duplicate Conditional Fragments (合併重複的條件片斷)
Replace Nested Conditional with Guard Clauses (以衛語句取代嵌套條件表達式)
Replace Conditional with Polymorphism (以多態取代條件表達式)
Introduce Null Object (引入Null對象)
簡化函數調用
Separate Query from Modifier (將查詢函數和修改函數分離)
Replace Parameter with Explicit Methods (以明確函數取代參數)
Preserve Whole Object (保持對象完整)
Replace Parameter with Methods (以函數取代參數)
Introduce Parameter Object (引入參數對象)
Remove Setting Method (移除設值函數)
Replace Constructor with Factory Method (以工廠函數取代構造函數)
Replace Error Code with Exception (以異常取代錯誤碼)
Replace Exception with Test (以測試取代異常)
處理歸納關係
Pull Up Field (字段上移)
Pull Up Method (函數上移)
Pull Up Constructor Body (構造函數本體上移)
Push Down Method (函數下移)
Push Down Field (字段下移)
Extract Subclass (提煉子類)
Extract Superclass (提煉超類)