第九章 簡化條件表達(dá)式

簡化條件表達(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ù).

重要原因:

    1. 合并后的表達(dá)式代碼會(huì)告訴你 實(shí)際上只有一次條件檢查, 只不過有多個(gè)并列條件需要檢查而已, 從而使這一次檢查的用意更清晰
    1. 這項(xiàng)重構(gòu)往往可以為你使用 Extract Method做好準(zhǔn)備.

注意: 如果你認(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)刪除.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惕虑,隨后出現(xiàn)的幾起案子堂鲜,更是在濱河造成了極大的恐慌砌烁,老刑警劉巖纯衍,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疫鹊,居然都是意外死亡儡陨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門辙售,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轻抱,“玉大人,你說我怎么就攤上這事圾亏∈穑” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵志鹃,是天一觀的道長夭问。 經(jīng)常有香客問我,道長曹铃,這世上最難降的妖魔是什么缰趋? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上秘血,老公的妹妹穿的比我還像新娘味抖。我一直安慰自己,他們只是感情好灰粮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布仔涩。 她就那樣靜靜地躺著,像睡著了一般粘舟。 火紅的嫁衣襯著肌膚如雪熔脂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天柑肴,我揣著相機(jī)與錄音霞揉,去河邊找鬼。 笑死晰骑,一個(gè)胖子當(dāng)著我的面吹牛适秩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播硕舆,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼秽荞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抚官?” 一聲冷哼從身側(cè)響起蚂会,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耗式,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趁猴,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刊咳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了儡司。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娱挨。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捕犬,靈堂內(nèi)的尸體忽然破棺而出跷坝,到底是詐尸還是另有隱情,我是刑警寧澤碉碉,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布柴钻,位于F島的核電站,受9級(jí)特大地震影響垢粮,放射性物質(zhì)發(fā)生泄漏贴届。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毫蚓。 院中可真熱鬧占键,春花似錦、人聲如沸元潘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翩概。三九已至牲距,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氮帐,已是汗流浹背嗅虏。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留上沐,地道東北人皮服。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像参咙,于是被迫代替她去往敵國和親龄广。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1 Decompose Conditional(分解條件表達(dá)式) 從復(fù)雜表達(dá)式if-then-else三個(gè)段落中分...
    hklbird閱讀 1,443評(píng)論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法蕴侧,類相關(guān)的語法择同,內(nèi)部類的語法,繼承相關(guān)的語法净宵,異常的語法敲才,線程的語...
    子非魚_t_閱讀 31,623評(píng)論 18 399
  • 前言 人生苦多,快來 Kotlin 择葡,快速學(xué)習(xí)Kotlin紧武! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,201評(píng)論 9 118
  • 時(shí)間很快,快到來不及去感受每一個(gè)有趣和珍貴的瞬間已添。 今天我想起來很久沒有跟媽媽打電話了妥箕,就打了個(gè)電話給媽媽,媽媽說...
    雨晴晴愛中醫(yī)閱讀 417評(píng)論 3 4
  • 圖示: 恢復(fù)滑動(dòng)返回功能** 分析:** 把系統(tǒng)的返回按鈕覆蓋1.手勢失效1.1 手勢被清空1.2 手勢代理是不是...
    麥穗0615閱讀 4,501評(píng)論 1 2