優(yōu)化Java分支結(jié)構(gòu)代碼

java有兩種分支結(jié)構(gòu):if else結(jié)構(gòu),switch case結(jié)構(gòu)

在項目開發(fā)過程中,涉及到部分邏輯特別復(fù)雜官地,可能需要寫很長的if else結(jié)構(gòu)或者switch case結(jié)構(gòu),特別是相同的邏輯判斷出現(xiàn)在很多地方時,這樣的代碼可讀性和可維護性非常的差鳖谈,本文主要講述如何簡化這些結(jié)構(gòu),使代碼邏輯更加清晰阔涉。本文的一個前提觀念是缆娃,if else結(jié)構(gòu)和switch case 結(jié)構(gòu)完全消除是不可能的,只能是進行簡化瑰排。下面介紹幾種簡化if else結(jié)構(gòu)的方式贯要。

1.條件表達式的分解與合并

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

程序之中,大型函數(shù)會使代碼可讀性下降椭住,邏輯復(fù)雜的代碼更加難以閱讀崇渗。應(yīng)該將它分解成多個獨立的函數(shù),根據(jù)每小塊的功能命名函數(shù)京郑,將原來對應(yīng)的代碼換成函數(shù)調(diào)用宅广,從而清晰的表達自己的意圖。將每一個分支條件分解形成新函數(shù)些举,還可以突出條件邏輯跟狱,更清楚的表明分支的作用。

表達式分解之前
表達式分解之后

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

有時你會發(fā)現(xiàn)這樣一串條件檢查:檢查條件各不相同金拒,最終行為卻一致兽肤。如果發(fā)現(xiàn)這種情況,就應(yīng)該使用“邏輯或”和“邏輯與”將它們合并為一個條件表達式绪抛,并將這個條件表達式提煉為一個函數(shù)资铡。

條件表達式合并前
條件表達式合并后

以上是使用邏輯與進行合并,邏輯或與之類似幢码,合并后的代碼告訴我們“實際上只有一次檢查笤休,只不過一次檢查中要并列檢查多個條件而已”,從而使這一次的檢查用意更加清晰症副,相反店雅,原代碼要表達的信息則是“這里有一些條件檢測政基,它們之間沒什么關(guān)系,只是恰好發(fā)生而已”闹啦。

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

假設(shè)在一組條件表達式中沮明,每個條件表達式都執(zhí)行了相同的代碼片段,那么窍奋,我們應(yīng)該將這段代碼搬到條件表達式外面去荐健,這樣才能更清晰的看出來哪些東西隨條件的變化而變化,哪些是固定不變的琳袄。

(4)移除控制標(biāo)記(remove control flag)

在一系列條件表達式中江场,可能會出現(xiàn)控制標(biāo)記用以控制程序的流程,如果出現(xiàn)這種情況窖逗,可以使用break址否、continue、return關(guān)鍵字進行替代碎紊,用于簡化程序佑附。

原代碼
移除控制標(biāo)記之后

使用控制標(biāo)記會降低代碼的可讀性,使用break進行替代后矮慕,條件表達式的邏輯會清晰很多帮匾,雖然會造成程序有多個出口,但還是推薦這種用法痴鳄。

5)以衛(wèi)語句取代嵌套條件表達式(replase nested condition with guard clauses)

條件表達式中瘟斜,如果兩條分支都屬于正常行為,這時候直接用if else或switch結(jié)構(gòu)即可痪寻;另一種是某個條件極其罕見螺句,則應(yīng)該單獨檢查,并立即返回橡类,這就是衛(wèi)語句蛇尚。if else結(jié)構(gòu)表達的是對各個分支同等的重視程度,而衛(wèi)語句表達的則是對某單獨分支給予足夠的重視顾画,使之完成某操作取劫。

原代碼
使用衛(wèi)語句以后

明顯看出,使用衛(wèi)語句代碼邏輯清晰很多研侣,這正是我們的目的谱邪。

2.用多態(tài)取代條件表達式:用子類來替換條件表達式

首先盒音,所謂多態(tài)就是類的不同類型對象有不同的行為狀態(tài)忽冻,如果在條件表達式中,條件是對象類型棍厂,具體代碼是根據(jù)不同的類型干不同的事情,那么這個時候應(yīng)該嘗試使用多態(tài)扯俱。它的好處是讓面向過程的結(jié)構(gòu)變成面向?qū)ο蟮慕Y(jié)構(gòu)书蚪。

如下代碼,一個人要學(xué)習(xí)不同的subject迅栅,需要不同的book殊校。使用多態(tài)來消除if else結(jié)構(gòu)。

用if else的代碼結(jié)構(gòu)
使用多態(tài)后的代碼

通過兩者對比可以發(fā)現(xiàn)读存,使用if else箩艺,如果你想添加一種新類型,就必須查找并更新所有條件表達式宪萄。但如果使用多態(tài),只需建立一個新的子類榨惰,并在其中提供適當(dāng)?shù)暮瘮?shù)就行了拜英。類的用戶不需要了解這個子類,這就大大降低了系統(tǒng)各部分之間的依賴琅催,使系統(tǒng)升級更加容易居凶。

3.用策略模式來取代條件表達式

所謂策略模式,就是定義一組算法藤抡,把他們一個個封裝起來侠碧,并且使他們可以相互替換,策略模式同時可以獨立于使用他們的客戶端而變化缠黍。使用策略模式來取代條件表達式弄兜,其實也是使用多態(tài)來取代條件表達式的一種方式,通過多態(tài)來實現(xiàn)不同子類的選取瓷式。

未使用策略模式代碼
使用策略模式后的代碼

由代碼可知替饿,使用策略模式時必須首先創(chuàng)建一個想使用的類對象,然后將該對象作為參數(shù)傳遞進去贸典,通過該對象調(diào)用不同的算法视卢,就是說策略模式使用前需要知道具體某一個對象。

4.用簡單工廠模式來取代條件表達式

簡單工廠模式:定義了實現(xiàn)廊驼,用接口來封裝起來据过,由一個工廠類根據(jù)傳入的參數(shù),動態(tài)決定應(yīng)該創(chuàng)建哪一個產(chǎn)品類(這些產(chǎn)品類繼承自一個父類或接口)的實例妒挎。也可以使用簡單工廠模式來取代條件表達式绳锅,它也是使用多態(tài)來替換條件表達式的一種方式,相比于策略模式而言饥漫,客戶端不需要提前知道某個具體對象榨呆,只需要有相關(guān)type即可。

如下四則運算的switch case結(jié)構(gòu)代碼,當(dāng)每添加一種運算類型時候积蜻,都需要重新檢查并修改代碼闯割。

使用switch case結(jié)構(gòu)代碼

當(dāng)換成簡單工廠模式后,具體代碼如下竿拆,當(dāng)需要新增type時宙拉,只需要重新添加新的operation的子類,并統(tǒng)一在操作工廠中添加邏輯丙笋。

抽象操作類
具體實現(xiàn)類
操作工廠類
測試代碼
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谢澈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子御板,更是在濱河造成了極大的恐慌锥忿,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怠肋,死亡現(xiàn)場離奇詭異敬鬓,居然都是意外死亡,警方通過查閱死者的電腦和手機笙各,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門钉答,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杈抢,你說我怎么就攤上這事数尿。” “怎么了惶楼?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵右蹦,是天一觀的道長。 經(jīng)常有香客問我歼捐,道長嫩实,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任窥岩,我火速辦了婚禮甲献,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颂翼。我一直安慰自己晃洒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布朦乏。 她就那樣靜靜地躺著球及,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呻疹。 梳的紋絲不亂的頭發(fā)上吃引,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音,去河邊找鬼镊尺。 笑死朦佩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的庐氮。 我是一名探鬼主播语稠,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弄砍!你這毒婦竟也來了仙畦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤音婶,失蹤者是張志新(化名)和其女友劉穎慨畸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衣式,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡先口,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞳收。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡厢汹,死狀恐怖螟深,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烫葬,我是刑警寧澤界弧,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站搭综,受9級特大地震影響垢箕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜兑巾,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一条获、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒋歌,春花似錦帅掘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至府框,卻和暖如春吱窝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工院峡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兴使,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓撕予,卻偏偏與公主長得像鲫惶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子实抡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法欠母,類相關(guān)的語法,內(nèi)部類的語法吆寨,繼承相關(guān)的語法赏淌,異常的語法,線程的語...
    子非魚_t_閱讀 31,662評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理啄清,服務(wù)發(fā)現(xiàn)六水,斷路器,智...
    卡卡羅2017閱讀 134,697評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評論 25 707
  • 【題目描述】 Given a binary tree, return the zigzag level order...
    程風(fēng)破浪會有時閱讀 176評論 0 0
  • 22歲 大專畢業(yè)一年辣卒。昨天剛剛發(fā)了2月份工資掷贾。2100塊。匆匆還了還唄1702.88 理發(fā)店充值100 取現(xiàn)10...
    小_西_己閱讀 182評論 1 0