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