重構(gòu)——簡化條件表達式

1 Decompose Conditional(分解條件表達式)

從復(fù)雜表達式if-then-else三個段落中分別提煉出獨立函數(shù)锅论。
  Motivation:降低表達式邏輯復(fù)雜度赶熟,突出分支作用灭衷。
  做法:

  • 將if段落提煉出來,構(gòu)成一個獨立函數(shù)譬猫。
  • 將then段落和else段落都提煉出來,各自構(gòu)成一個獨立函數(shù)县遣。

2 Consolidate Conditional Expression(合并條件表達式)

一系列條件表達式虱咧,得到的結(jié)果相同。將這些測試合并為一個條件表達式种樱,并將這個條件表達式提煉成一個獨立函數(shù)蒙袍。
  Motivation:合并多個并列條件成一個明確的條件審查可以使檢查用意更清楚俊卤;這項重構(gòu)可以為Extract Method做準(zhǔn)備。

  • 確定這些條件語句都沒有副作用害幅。
  • 使用恰當(dāng)?shù)倪壿嫴僮鞣校瑢⒁幌盗邢嚓P(guān)條件表達式合并為一個。
  • 編譯以现,測試狠怨。
  • 對合并后的條件表達式使用Extract Method。

3 Consolidate Duplicate Conditional Fragments(合并重復(fù)條件片段)

在條件表達式中有相同代碼邑遏,將代碼提取到條件表達式之外佣赖。

4 Remove Control Flag(移除控制標(biāo)記)

在一系列布爾表達式中,某個變量帶有控制標(biāo)記作用记盒,以break或return取代控制標(biāo)記憎蛤。
  Motivation:用break和continue語句的原因是用它們跳出復(fù)雜的條件語句可以使條件變得清晰得多。
  做法:

  • 找出讓你跳出這段邏輯的判斷標(biāo)記纪吮。
  • 找出對標(biāo)記變量賦值的語句俩檬,替代以恰當(dāng)?shù)腷reak語句或continue語句。
  • 每次替換后碾盟,編譯并測試豆胸。

5 Replace Nested Conditional with Guard Clauses(以衛(wèi)語句取代嵌套條件表達式)

條件邏輯使人難以看清正常的執(zhí)行路徑。使用衛(wèi)語句表現(xiàn)所有你特殊情況巷疼。
  Motivation:條件表達式一共有兩種形式:1.所有分支都屬于正常行為晚胡。2.條件表達式提供的答案中只有一種是正常行為,其他都不常見嚼沿。如果分支都屬于正常行為估盘,使用if-else挺好的;如果某個條件極其罕見骡尽,就應(yīng)該單獨檢查該條件遣妥,并在該條件為真時立即返回。這樣單獨的檢查常常被稱為“衛(wèi)語句”攀细。衛(wèi)語句的精髓在于給一條分支以特別的重視箫踩。

  • 對于每個檢查,放進一個衛(wèi)語句谭贪。ps:衛(wèi)語句要么就從函數(shù)中返回境钟,要不就拋出一個異常。
  • 每次講條件檢查替換成衛(wèi)語句后俭识,編譯并測試慨削。

6 Replace Conditional with Polymorphism(以多態(tài)取代條件表達式)

有根據(jù)類型字段來選擇函數(shù)不同的函數(shù)行為。將這個條件表達式的每個分支放進一個子類內(nèi)的覆寫函數(shù)中,然后將原始函數(shù)聲明為抽象函數(shù)缚态。
  Motivation:使用條件表達式磁椒,使用的是硬編碼,很難對條件表達式進行變化玫芦。
  做法: 
  在做這個重構(gòu)首發(fā)之前浆熔,必須得有繼承結(jié)構(gòu),這種繼承結(jié)構(gòu)有兩種手段去建立:Replace Type Code with Subclasses 和 Replace Type Code with State/Strategy桥帆。

  • 如果要處理的條件表達式是一個更大函數(shù)中的一部分蘸拔,首先對條件表達式進行分析,然后使用extract Method把它提煉到一個獨立函數(shù)中环葵。
  • 如果有必要调窍,使用Move Method將條件表達式放置到繼承結(jié)構(gòu)的頂端。
  • 任選一個子類张遭,在其中建立一個函數(shù)邓萨,使之覆寫超類中容納條件表達式的那個函數(shù)。將與該子類先關(guān)的條件表達式分支賦值到新建函數(shù)中菊卷,并對它進行適當(dāng)調(diào)整缔恳。
  • 編譯,測試洁闰。
  • 在超類刪除到表達式內(nèi)被賦值的分支歉甚。
  • 編譯,測試扑眉。
  • 重復(fù)上述的過程纸泄,知道所有分支都被移動到子類內(nèi)。
  • 將超類之中容納條件表達式的函數(shù)聲明為抽象函數(shù)腰素。

7 Introduce Null Object(引入Null對象)

你需要再三檢查某對象是否為null聘裁。將null值替換為null對象。
  Motivation:這是踐行多態(tài)的一個非常好的方案弓千。試想衡便,如果對每個對象,都必須判斷其是否為null洋访,然后才能進行下一步的行為镣陕。那么系統(tǒng)中一定會運行大量的判斷代碼,這是就大量的重復(fù)代碼姻政。
  做法:

  • 為源類建立一個子類呆抑,使其行為就像源類的null版本。在源類和null子類中都加上isNull()扶歪,前者返回false理肺,后者返回true。
  • 編譯善镰。
  • 找出所有索求源對象卻獲得一個null的地方妹萨。修改這些地方,使它們調(diào)用isNull()函數(shù)炫欺。
  • 編譯乎完,測試。
  • 找出這樣的程序點:如果對象不是null品洛,做A動作树姨,否則B動作。
  • 對于每一個上述弟弟昂桥状,在null類中覆蓋A動作帽揪,使其行為和B相同。
  • 使用上述被覆寫的動作辅斟,然后刪除對象是否為null的條件測試转晰。編譯并測試。

tips:其實這樣的方式可以被認(rèn)為是特例類模式士飒,用特例來減少處理特例的開銷查邢。

8 Introduce Assertion

用斷言明確表明對程序狀態(tài)的假設(shè)。
  Motivation:可以幫助我們理解某些條件對程序是極其重要的酵幕。斷言可以幫助程序閱讀者閱讀代碼扰藕,可以幫助調(diào)試程序。
  做法:
  只要程序源不犯錯芳撒,斷言就應(yīng)該不會對系統(tǒng)運行造成任何影響邓深,所以加入斷言永遠(yuǎn)不會影響程序的行為。斷言一定要用來判斷一定為真的條件笔刹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庐完,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子徘熔,更是在濱河造成了極大的恐慌门躯,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酷师,死亡現(xiàn)場離奇詭異讶凉,居然都是意外死亡,警方通過查閱死者的電腦和手機山孔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門懂讯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人台颠,你說我怎么就攤上這事褐望±兆” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵瘫里,是天一觀的道長实蔽。 經(jīng)常有香客問我,道長谨读,這世上最難降的妖魔是什么局装? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮劳殖,結(jié)果婚禮上铐尚,老公的妹妹穿的比我還像新娘。我一直安慰自己哆姻,他們只是感情好宣增,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著矛缨,像睡著了一般统舀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劳景,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天誉简,我揣著相機與錄音,去河邊找鬼盟广。 笑死闷串,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的筋量。 我是一名探鬼主播烹吵,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼桨武!你這毒婦竟也來了肋拔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤呀酸,失蹤者是張志新(化名)和其女友劉穎凉蜂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體性誉,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡窿吩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了错览。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纫雁。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖倾哺,靈堂內(nèi)的尸體忽然破棺而出轧邪,到底是詐尸還是另有隱情刽脖,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布忌愚,位于F島的核電站曲管,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏菜循。R本人自食惡果不足惜翘地,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一申尤、第九天 我趴在偏房一處隱蔽的房頂上張望癌幕。 院中可真熱鬧,春花似錦昧穿、人聲如沸勺远。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胶逢。三九已至,卻和暖如春饰潜,著一層夾襖步出監(jiān)牢的瞬間初坠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工彭雾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碟刺,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓薯酝,卻偏偏與公主長得像半沽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吴菠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

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

  • 1 Rename Method(函數(shù)改名) 修改函數(shù)名字以良好表達函數(shù)的用途者填。Motivation:各種大師特別推...
    hklbird閱讀 526評論 0 0
  • 簡化條件表達式 9.1 Decompose Conditional (分解條件表達式) 你有一個復(fù)雜的條件表達式語...
    rxdxxxx閱讀 496評論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法做葵,內(nèi)部類的語法占哟,繼承相關(guān)的語法,異常的語法酿矢,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • 潔凈光芒 墻上白色無暇 自影子 呼吸和黑夜來了 墻有了年齡般在積累長大 樓梯一層一層 樹葉一疊一疊 沉重和腐化 我...
    零溫度閱讀 170評論 0 3
  • 有時候 我看見你眼里的憂傷 你總把我當(dāng)任性的孩子 有時候 我看見你的腳步匆匆忙忙 你說那只是一種習(xí)慣 有時候 我看...
    DinoF閱讀 234評論 0 1