Refactoring Read Note (2)

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。

  • value object 實物,ex: 客戶。
  • reference object 資料,ex: 日期。
    Motivation
    value 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,在物件創建後,發生修改。
  • type code 宿主,已經有了 subclass。
    Mechanics
  1. type code -> encapsulate 封裝 -> factory method。
  2. create subclass -> override type code (get) method。
  3. 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

使用:

  1. 可讀性。
  2. 減少過長的參數列。

不使用:
『參數物件』和『被函式呼叫所在物件』之間,有了依存關係,
如果這會使你的依存結構惡化,那就不該使用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。

未完成…

文章目录
  1. 1. Target
  2. 2. Action Items
  3. 3. Quick Start
    1. 3.1. CH 6 Composing Methods
      1. 3.1.1. 6.2 Inline Method
        1. 3.1.1.1. Motivation
        2. 3.1.1.2. Mechanics
      2. 3.1.2. 6.6 Split Temporary Variable
    2. 3.2. CH 7 Moving Features Between Objects
      1. 3.2.1. 7.1 Move Method
        1. 3.2.1.1. Mechanics
      2. 3.2.2. 7.3 Extract Class
        1. 3.2.2.1. Motivation
    3. 3.3. CH 8 Organizing Data
      1. 3.3.1. 8.1 Self Encapsulate Field
        1. 3.3.1.1. Mechanics
      2. 3.3.2. 8.3 Change Value to Reference
        1. 3.3.2.1. Motivation
      3. 3.3.3. 8.14 Replace Type Code with Subclass
        1. 3.3.3.1. Motivation
        2. 3.3.3.2. Mechanics
      4. 3.3.4. 8.15 Replace Type Code with State / Strategy
        1. 3.3.4.1. Mechanics
    4. 3.4. CH 9 Simplifying Conditional Expressions
      1. 3.4.1. 9.6 Replace Conditional with Polymorphism
    5. 3.5. CH 10 Making Method Calls Simpler
      1. 3.5.1. 10.1 Rename Method
      2. 3.5.2. 10.2 Add Parameter
      3. 3.5.3. 10.3 Remove Parameter
      4. 3.5.4. 10.4 Separate Query from Modifier
      5. 3.5.5. 10.5 Parameterize Method
        1. 3.5.5.1. Motivation
        2. 3.5.5.2. Mechanics
      6. 3.5.6. 10.7 Preserve Whole Object
        1. 3.5.6.1. Motivation
      7. 3.5.7. 10.9 Introduce Parameter Object
        1. 3.5.7.1. Motivation
        2. 3.5.7.2. Mechanics
      8. 3.5.8. 10.12 Replace Constructor with Factory Method
        1. 3.5.8.1. Motivation
  4. 4. 未完成…
,