網頁

搜尋此網誌

2013年3月27日 星期三

Refactoring: Improving the Design of Existing Code 重構:改善既有程式的設計

什麼是重構(Refactoring)?所謂重構是這樣的一個過程:「在不改變程式碼外在行為的前提下,對程式碼做出修改,以改進程式的內部結構」。重構是一種有紀律的、經過訓練的、有條不紊的程式整理方法,可以將整理過程中不小心引入錯誤的機率降到最低。本質上說,重構就是「在程式碼寫好之後改進他的設計」。p. xvi

這是一本介紹「重構」技術的書籍,如果你想認識並瞭解這門技術,「重構:改善既有程式的設計」絕對是聖經本。一開始作者以案例方式帶領讀者進入重構的過程,第一章藉由案例認識重構的方式與準則。接著第二章說明重構的基礎知識,包括何謂重構、為何需要重構、何時應該重構...等基本問題,再來第四章用「程式的壞味道」來判斷何時應該開始重構、何時應該停止重構,第四章則是說明重要的觀念:重構的前提必須是擁有一個可靠的測試環境。大致上來說,如果你閱讀完前四章,那你對於重構技術已經有完整的認識了。


Martin Fowler等著,侯捷、熊節合譯,重構:改善既有程式的設計,台北:台灣培生教育出版:碁峰資訊發行,2008。
譯自:Refactoring: Improving the Design of Existing Code,作者群:Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts。

接著第5章至第12章則是作者在工作中整理出來的「重構名錄(catalog of refactorings)」,這些重構名錄是這本書的核心,利用這些重構名錄所記載的重構方法,我們可以很方便的改善既有程式的設計。這些重構方法如下(也就是書的目錄一部份),這些方法可分成7大類總共72個:
  • 重新組織你的函式 (Composing Methods)
    1. Extract Method (提煉函式)
    2. Inline Method (將函式內聯化)
    3. Inline Temp (將暫時變數內聯化)
    4. Replace Temp with Query (以查詢取代變數)
    5. Introduce Explaining Variable (引入解釋性變數)
    6. Split Temporary Variable (剖解暫時變數)
    7. Remove Assignments to Parameters (移除對參數的賦值動作)
    8. Replace Method with Method Object (以函式物件取代函式)
    9. Substitute Algorithm (替換你的演算法)
  • 在物件之間移動特性 (Moving Features Between Objects)
    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 (引入區域性擴展)
  • 重新組織你的資料 (Organizing Data)
    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 Unidirectional Association to Bidirectional (將單向關聯改為雙向)
    8. Change Bidirectional Association to Unidirectional (將雙向關聯改為單向)
    9. Replace Magic Number with Symbolic Constant (以符號常數/字面常數 取代魔術數字)
    10. Encapsulate Field (封裝欄位)
    11. Encapsulate Collection (封裝群集)
    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 (以 State/Strategy 取代型別代碼)
    16. Replace Subclass with Fields (以欄位取代子類別)
  • 簡化條件句 (Simplifying Conditional Expressions)
    1. Decompose Conditional (分解條件式)
    2. Consolidate Conditional Expression (合併條件式)
    3. Consolidate 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 (引入斷言)
  • 簡化函式呼叫 (Making Method Calls Simpler)
    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 Method (以函式取代參數)
    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 (以測試取代異常)
  • 處理繼承關係 (Dealing with Generalization)
    1. Pull Up Field (欄位上移)
    2. Pull Up Method (函式上移)
    3. Pull Up Constructor Body (建構式本體上移)
    4. Push Down Method (函式下移)
    5. Push Down Field (欄位下移)
    6. Extract Subclass (提煉子類別)
    7. Extract Superclass (提煉超類別)
    8. Extract Interface (提煉介面)
    9. Collapse Hierarchy (摺疊繼承體系)
    10. Form Template Method (塑造模板函式)
    11. Replace Inheritance with Delegation (以委託取代繼承)
    12. Replace Delegation with Inheritance (以繼承取代委託)
  • 大型重構 (Big Refactorings)
    1. Tease Apart Inheritance (梳理並分解繼承體系)
    2. Convert Procedural Design to Objects (將程序式設計轉化為物件設計)
    3. Separate Domain from Presentation (將領域和 表述/顯示 分離)
    4. Extract Hierarchy (提煉繼承體系)
註:侯捷先生在他的網站上有公布書中第一章至第六章的內容,有興趣的讀者可以先上網試讀!網站是http://jjhou.boolan.com/jjtbooks-refactoring.htm
###

沒有留言:

張貼留言

熱門文章