什麼是重構(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)
- 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 (替換你的演算法)
- 在物件之間移動特性 (Moving Features Between Objects)
- Move Method (搬移函式)
- Move Field (搬移欄位)
- Extract Class (提煉類別)
- Inline Class (將類別內聯化)
- Hide Delegate (隱藏「委託關係」)
- Remove Middle Man (移除中間人)
- Introduce Foreign Method (引入外加函式)
- Introduce Local Extension (引入區域性擴展)
- 重新組織你的資料 (Organizing Data)
- 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 (以符號常數/字面常數 取代魔術數字)
- Encapsulate Field (封裝欄位)
- Encapsulate Collection (封裝群集)
- 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 (以欄位取代子類別)
- 簡化條件句 (Simplifying Conditional Expressions)
- Decompose Conditional (分解條件式)
- Consolidate Conditional Expression (合併條件式)
- Consolidate Duplicate Conditional Fragments (合併重複的條件片段)
- Remove Control Flag (移除控制旗標)
- Replace Nested Conditional with Guard Clauses (以衛述句取代巢狀條件式)
- Replace Conditional with Polymorphism. (以多型取代條件式)
- Introduce Null Object (引入Null物件)
- Introduce Assertion (引入斷言)
- 簡化函式呼叫 (Making Method Calls Simpler)
- Rename Method (重新命名函式)
- Add Parameter (添加參數)
- Remove Parameter (移除參數)
- Separate Query from Modifier (以查詢函式和修改函式分離)
- Parameterize Method (令函式攜帶參數)
- Replace Parameter with Explicit Methods (以明確函式取代參數)
- Preserve Whole Object (保持物件完整)
- Replace Parameter with Method (以函式取代參數)
- Introduce Parameter Object (引入參數物件)
- Remove Setting Method (移除設值函式)
- Hide Method (隱藏某個函式)
- Replace Constructor with Factory Method (以工廠函式取代建構式)
- Encapsulate Downcast (封裝「向下轉型」動作)
- Replace Error Code with Exception (以異常取代錯誤碼)
- Replace Exception with Test (以測試取代異常)
- 處理繼承關係 (Dealing with Generalization)
- 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 (以繼承取代委託)
- 大型重構 (Big Refactorings)
- Tease Apart Inheritance (梳理並分解繼承體系)
- Convert Procedural Design to Objects (將程序式設計轉化為物件設計)
- Separate Domain from Presentation (將領域和 表述/顯示 分離)
- Extract Hierarchy (提煉繼承體系)
註:侯捷先生在他的網站上有公布書中第一章至第六章的內容,有興趣的讀者可以先上網試讀!網站是http://jjhou.boolan.com/jjtbooks-refactoring.htm
###
沒有留言:
張貼留言