《重構-改善既有代碼的設計》清單

《重構-改善既有代碼的設計》清單

重新組織你的函數

       Extract Method 將這段代碼放進一個獨立函數裏,並讓函數名稱解釋該函數的用途

       Inline Method 在函數調用點插入函數本體,然後移除該函數

       Inline Temp 將所有對該變量的引用動作,替換爲對它賦值的那個表達式自身

       Replace Temp with Query 將這個表達式提煉到一個獨立函數中

       Introduce Explaining Variable 將該複雜表達式(或其中一部分)的結果放進一個臨時變量,以此變量名稱來解釋表達式用途

       Split Temporary Variable 針對每次賦值,創造一個獨立的、對應的臨時變量

       Remove Assignments to Parameters 以一個臨時變量取代該參數的賦值結果

       Replace Method with Method Object 將這個函數放進一個單獨對象中,如此一來局部變量就成了對象內的值域,

              然後你就可以在同一個對象中將這個大型函數分解爲數個小型函數

       Substitute Algorithm 將函數本體替換爲另一個算法

 

在對象之間搬移特性

       Move Method 你的程序中,有個函數與其所駐class之外另一個class進行更多交流,調用後者,或被後者調用

       Move Filed target class建立一個new field,修改source field的所有用戶,令它們改用new field

       Extract Class 建立一個新class,將相關的值域和函數從舊class搬移到新class

       Inline Class class的所有特性搬移到另一個class中,然後移除原class

       Hide Delegate server端(某個class)建立客戶所需的所有函數,用以隱藏委託關係delegation

       Remove Middle Man 讓客戶直接調用delegate

       Introduce Forergn Method client class中建立一個函數,並以一個server class實體作爲第一引數

              你所使用的server class中需要一個額外函數,但你無法修改這個class

       Introduce Local Extension 建立一個新class,使它包含這些額外函數。

              讓這個擴展品成爲source classsubclass(子類)或wrapper(外覆類)

 

重新組織數據

       Self Encapsulate Field 爲這個值域設立gettersetter,並且只以這些函數來訪問值域

       Replace Data Value with Object 將這筆數據項變成一個對象

       Change Value to Reference 將實值對象改爲引用對象

      Change Reference to Value 將它變成一個value object

       Replace Array with Object 以對象替換數組,對於數組中的每個元素,以一個值域表示之

       Duplicate Observed Data 將該數據拷貝到一個domain object中,建立一個Observe模式,

              用以對domain objectGUI object內的重複數據進行同步控制

       Change Unidirectional Association to Bidirectional 添加一個反向指針,並使修改函數能夠同時更新兩條連接

       Change Bidirectional Association to Unidirectional 去除不必要的關聯

       Replace Magic Number with Symbolic Constant 以符號常量/字面常量取代魔法數

       Encapsulate Field 將它聲明爲private,並提供相應的訪問函數

       Encapsulate Collection 讓這個函數返回該羣集的一個只讀映件,並在這個class中提供add/remove羣集元素的函數

       Replace Record with Data Class 爲該record記錄創建一個啞數據對象dumb data object

       Replace Type Code with Class 以一個新的class替換該數值型別碼

       Replace Type Code with Subclasses 以子類取代型別碼(immutable type code

       Replace Type Code with State/Strategy State/Strategy取代型別碼

       Replace Subclass with Fields 修改這些函數,使它們返回subclass中的某個(新增)值域,然後銷燬subclass

 

簡化條件表達式

       Decompose Conditional ifthenelse三個段落中分別提煉出獨立函數

       Consolidate Conditional Expression 將這些測試合併爲一個條件式,並將這個條件式提煉成爲一個獨立函數

       Consolidate Duplicate Conditional Fragments 將這段重複代碼搬移到條件式之外

       Remove Control Flag break語句或return語句取代控制標記

       Replace Nested Conditional with Guard Clauses 使用衛語句取代嵌套條件式

       Replace Condional with Polymorphism 以多態取代條件式

       Introduce Null Object null value無效值 替換爲null object無效物

       Introduce Assertion assersion明確表現這種假設

 

簡化函數調用

       Rename Method 重新命名函數

       Add Parameter 添加參數

       Remove Parameter 移除參數

       Separate Query from Modifier 建立兩個不同的函數,其中一個負責查詢,另一個負責修改

       Parameterize Method 建立單一函數,以參數表達那些不同的值

       Replace Parameter with Explicit Methods 針對該參數的每一個可能值,建立一個獨立函數

       Preserve Whole Object 改使用傳遞整個對象

       Replace Parameter with Methods 讓參數接收者去除該項參數,並直接調用前一個函數

       Introduce Parameter Object 以一個對象取代這些參數

       Remove Setting Method class中的某個值域,應該在對象創建時被設值,然後就不再改變

       Hide Method 有一個函數,從來沒有被其他任何class用到

       Replace Constructor with Factory Method 以工廠函數取代構造函數

       Encapsulate Dowmcast 將向下轉型動作移到函數中

       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 提煉超類

       Extract Interface 提煉接口

       Collapse Hierarchy 摺疊繼承體系

       Form Template Method 塑造模板函數

       Replace Inheritance with Delegation 以委託取代繼承

       Replace Delegation with Inheritance 以繼承取代委託

 

大型重構

       Tease Apart Inheritance 梳理並分解繼承體系;

              建立兩個繼承體系,同時承擔兩項責任

       Convert Procedural Design to Objects 將過程化設計轉化爲對象設計;

              將數據記錄變成對象,將行爲分開,並將行爲移入相關對象之中

       Separate Domain from Presentation 將領域和顯示分離

              domain logic分離出來,爲它們建立獨立的domain classes

       Extract Hierarchy 提煉繼承體系

              建立繼承體系,以一個subclass表示一種特殊情況

發佈了37 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章