簡化條件表達式
9.1 Decompose Conditional (分解條件表達式)
你有一個復雜的條件表達式語句
從if,then,else三個段落中分別提煉出獨立函數
將大型的的邏輯判斷, 抽取出來成獨立的函數, 并賦予函數相應的名稱突出行為.
9.2 Consolidate Conditional Expression (合并條件表達式)
你有一系列條件測試, 都得到相同的結果
將這些測試合并為一個條件表達式, 并將這個條件表達式提煉成為一個獨立函數.
重要原因:
- 合并后的表達式代碼會告訴你
實際上只有一次條件檢查, 只不過有多個并列條件需要檢查而已
, 從而使這一次檢查的用意更清晰
- 合并后的表達式代碼會告訴你
- 這項重構往往可以為你使用
Extract Method
做好準備.
- 這項重構往往可以為你使用
注意: 如果你認為這些檢查彼此獨立, 的確不應該視為同一次檢查, 那就不要使用本項重構. 因為你的代碼已經清楚的表達出自己的意義.
9.3 Consolidate Duplicate Conditional Fragments (合并重復的條件片段)
在條件表達式的每個分支上有著相同的一段代碼
將這段重復代碼搬移到條件表達式之外
9.4 Remove Control Flag (移除控制標記)
在一系列布爾表達式中, 某個變量帶有控制標記
(control flag)的作用
以break語句或return語句取代控制標記
函數有一個入口, 但是可以有多個出口, 不要局限自己的思路.
9.5 Replace Nested Conditional with Guard Clauses (以衛語句取代嵌套條件表達式)
函數中的條件邏輯使人難以看清正常的執行路徑
使用衛語句表現所有特殊情況
條件表達式通常有兩種表現形式.
第一種: 所有分支都屬于正常行為.
第二種: 條件表達式提供的答案中只有一種是正常行為, 其他都是不常見的情況
如果兩條分支都是正常行為, 那應該使用形如: if...else...的條件表達式
如果某個條件表達式極其罕見, 那就應該單獨檢查條件, 并在該條件為真時立即從函數中返回. 這樣單獨檢查常常被稱為衛語句
- 其精髓就是給予某條分支特別的重視
9.6 Replace Conditional with Polymorphism
你手上有個條件表達式, 它根據對象類型的不同而選擇不同的行為.
將這個條件表達式的每個分支放進一個子類內的覆寫函數中, 然后將原始函數聲明為抽象函數.
使用本項重構之前, 首先必須有一個繼承結構,如果沒有, 現在就需要建立它.
要建立繼承結構, 有兩種選擇用子類取代類型碼
和用狀態/策略模式取代類型碼
. 前一種做法比較簡單, 因此應該盡可能使用它. 但如果你需要在對象創建好后修改類型碼, 就不能使用繼承手法, 只能使用狀態/策略模式
. 此外,如果由于其他原因, 要重構的類已經有了子類, 那么也得使用用狀態/策略模式
. 記住, 如果若干switch語句針對的是同一個類型碼, 你只需要對這個類型碼建立一個繼承結構就行了.
9.7 Introduce Null Object (引入Null對象)
你需要再三檢查某對象是否為Null
將null值替換為null對象
多態的最根本好處就在于: 你不必再向對象詢問"你是什么類型"而后根據得到的答案調用對象的某個行為 --- 你只管調用該行為就是了, 其他的一切多態機制會為你安排妥當.
減少對象是否存在的判斷機制.
你可以查看 Null Object模式.
9.8 Introduce Assertion (引入斷言)
某一段代碼需要對程序狀態做出某種假設
以斷言明確表現這種假設
實際上, 程序最后的成品往往將斷言統統刪除.