Target
Refactoring book 閱讀筆記
Action Items
- CH 6 Composing Methods
- CH 7 Moving Features Between Objects
- CH 8 Organizing Data
- ch 9 Simplifying Conditional Expressions
- CH 10 Making Method Calls Simpler
Quick Start
CH 6 Composing Methods
6.2 Inline Method
Motivation
某些函式,其內部的程式碼和函式名稱同樣清晰易讀。
去掉函式,直接使用該程式碼。
將那些無用的間接層消除。Mechanics
檢查函式,確定它不具多型特性。
6.6 Split Temporary Variable
如果暫時變數承擔多個責任,它就應該被替換為多個暫時變數,
每個變數只承擔一個責任。
CH 7 Moving Features Between Objects
7.1 Move Method
如果一個 class 與另一個 class 有太多合作而形成高度耦合(highly coupled),
我就會搬移函式。Mechanics
檢查source class 的 subclass 和 superclass,看看是否有該函式的其他宣告。
- 如果出現其他宣告,你或許無法進行搬移,除非 target class 也同樣表現出多形性(polymorphism)。
決定「刪除 source method 」或將它當作一個 delegating method 保留下來。- 如果你經常要在 source object 中引用 target method,那麼將 source method 作為 delegating method 保留下來會比較簡單。
7.3 Extract Class
建立一個新的 class,將相關的欄位和函式從舊 class 移至新 class。
Motivation
一個 class 應該是一個清楚的抽象性(abstract),處理一些明確的責任。
CH 8 Organizing Data
8.1 Self Encapsulate Field
存取欄位,使用 get / set method。
使用時機:
想存取 superclass 中的一個欄位,卻又想在 subclass 中將『對這個變數的存取』改為一個計算後的值。
物件產生後,才能使用 get / set method。
Mechanics
最後將該欄位宣告為private
8.3 Change Value to Reference
將 value object,變成一個 reference object。
8.14 Replace Type Code with Subclass
有不可變的(immutable)type code,會影響 class 的行為。
以一個 subclass 取代這個 type code。Motivation
宿主類別中,只與具備的 type code 之物件相關。
好處:對不同行為的瞭解,從 class 使用者移至 class 本身。以下兩種情況,不能使用 Replace Type Code with Subclass:
- type code -> encapsulate 封裝 -> factory method。
- create subclass -> override type code (get) method。
- super class -> abstract type code (get) method。
8.15 Replace Type Code with State / Strategy
以 state object(專門用來描述狀態的物件) 取代 type code。
Mechanics
-『type code 的值在物件生命週期中發生變化』
-『其他原因使得宿主類別不能被subclassing 』
CH 9 Simplifying Conditional Expressions
- 多型之所以更好,是因為呼叫者無須瞭解條件行為的細節,因此條件的擴展更為容易。
- 消除 switch -> Replace Conditional with Polymorphism.
- Polymorphism 使用 Introduce Null Object -> 去除對 null value 檢驗。
9.6 Replace Conditional with Polymorphism
動機:當條件式=> 型別 -> 行為
作法:將條件式的每個分支放進一個 subclass 內的覆寫函式中,然後將原始函式宣告為抽象函式。
CH 10 Making Method Calls Simpler
10.1 Rename Method
如果你看到一個函式名稱不能很好地表達它的用途,應該馬上加以修改。
10.2 Add Parameter
- 為此函式添加一個物件參數,讓該物件帶進函式所需資訊。
- 長參數列往往伴隨著壞味道Data Clumps。
10.3 Remove Parameter
將該參數移除。
多餘的參數不會引起任何問題,
但函數呼叫者必須為每一個參數操心要傳入什麼值,
最後導致多費心力。
10.4 Separate Query from Modifier
某個函式既傳回物件狀態值,又修改物件狀態。
建立兩個不同的函式,負責查詢、修改。
10.5 Parameterize Method
Motivation
多個函式,它們做著類似的工作,但因少數幾個值致使動作略有不同。
Mechanics
建一個帶有參數的函式,用來替換重複性的函式。
10.7 Preserve Whole Object
使用傳遞整個物件。
Motivation
使用:
- 可讀性。
- 減少過長的參數列。
不使用:
『參數物件』和『被函式呼叫所在物件』之間,有了依存關係,
如果這會使你的依存結構惡化,那就不該使用Preserve Whole Object。
10.9 Introduce Parameter Object
以一個物件取代這些參數。
Motivation
縮短參數列的長度。
Mechanics
新建一個 class,用以表現你想替代的一組參數,將這個 class 設為不可變的(不可被修改的)。
10.12 Replace Constructor with Factory Method
將 constructor 替換為 factory method。
Motivation
subclassing 過程中以 factory method 取代 type code。