分解條件表達(dá)式Decompose Conditional Expression

image.png
- 動(dòng)機(jī):復(fù)雜的條件邏輯導(dǎo)致復(fù)雜度的上升。必須編寫(xiě)代碼來(lái)檢查不同的條件分支,根據(jù)不同的條件做不同的事,然后,很快就會(huì)得到一個(gè)相當(dāng)長(zhǎng)的函數(shù)。大型函數(shù)本書(shū)就會(huì)使代碼的可讀性下降,而條件邏輯則會(huì)使代碼更難閱讀。
- 做法:對(duì)條件判斷和每個(gè)條件分支分別運(yùn)用提煉函數(shù)手法。
合并條件表達(dá)式 Consolidate Conditional Expression

image.png
- 動(dòng)機(jī):有時(shí)我會(huì)發(fā)現(xiàn)這樣一串條件檢查:檢查條件各不相同,最終行為卻一致。如果發(fā)現(xiàn)這種情況,就應(yīng)該使用邏輯與邏輯或?qū)⑺鼈兒喜橐粋€(gè)條件表達(dá)式?!皩?shí)際上只有一次條件檢查,只不過(guò)有多個(gè)并列條件需要檢查而已”。而如果有多個(gè)條件,每個(gè)條件檢查后的結(jié)果不一樣,就不能合并而需要拆分了。
以衛(wèi)語(yǔ)句取代嵌套條件表達(dá)式Replace Nested Conditional with Guard Clauses

image.png

image.png
- 衛(wèi)語(yǔ)句:在多個(gè)條件表達(dá)式中,如果某個(gè)條件及其罕見(jiàn),就應(yīng)該單獨(dú)檢查該條件,并在該條件為真時(shí)立刻從函數(shù)中返回。這樣的單獨(dú)檢查常常被稱為“衛(wèi)語(yǔ)句”。
- 動(dòng)機(jī):衛(wèi)語(yǔ)句表示給某一條分支以特別的重視,如果它真的發(fā)生了,需要做一些必要的工作,然后退出。if else語(yǔ)句對(duì)分支的重視是相等的。
以多態(tài)取代條件表達(dá)式Replace Conditional with Polymorphism

image.png
- 動(dòng)機(jī):復(fù)雜的條件邏輯是編程中最難理解的東西之一,很多時(shí)候,我發(fā)現(xiàn)可以將條件邏輯拆分到不同的場(chǎng)景,從而拆解復(fù)雜的條件邏輯。這種拆分有時(shí)用條件邏輯本身的結(jié)構(gòu)就足以表達(dá),但使用類和多態(tài)能把邏輯的拆分表述的更清晰。
- 這里強(qiáng)調(diào)的是復(fù)雜邏輯,在實(shí)際開(kāi)發(fā)中,通常簡(jiǎn)單的ifelse 或switch就能解決大部分邏輯。
引入特例Introduce Special Case

image.png
- 動(dòng)機(jī):一種常見(jiàn)的重復(fù)代碼是這種情況:一個(gè)數(shù)據(jù)結(jié)構(gòu)的使用者都在檢查某個(gè)特殊的值,并且當(dāng)這個(gè)特殊值出現(xiàn)時(shí)所作的處理也都相同。如果我發(fā)現(xiàn)代碼庫(kù)中有多處以同樣方式應(yīng)對(duì)同一個(gè)特殊值,我就會(huì)想到把這個(gè)處理邏輯收攏到一處。
- 做法:使用“特例”模式:創(chuàng)建一個(gè)特例元素,用以表達(dá)對(duì)這種特例的共用行為的處理。這樣我就可以用一個(gè)函數(shù)調(diào)用取代大部分特例檢查邏輯。
- 特例有幾種表現(xiàn)形式。如果我只需要從這個(gè)對(duì)象讀取數(shù)據(jù),可以提供一個(gè)字面量對(duì)象,其中所有的值都是預(yù)先填充好的。如果還需要更多行為,就需要?jiǎng)?chuàng)建一個(gè)特殊對(duì)象,其中包括所有共用行為所對(duì)應(yīng)的函數(shù)。特例對(duì)象可以由一個(gè)封裝類來(lái)返回。
引入斷言Introduce Assertion

image.png
- 如果你發(fā)現(xiàn)代碼假設(shè)某個(gè)條件始終為真,就加入一個(gè)斷言明確說(shuō)明這種情況。
Replace Control Flag with Break

image.png
- 動(dòng)機(jī)