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)記會降低代碼的可讀性,使用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)語句代碼邏輯清晰很多研侣,這正是我們的目的谱邪。
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)。
通過兩者對比可以發(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)每添加一種運算類型時候积蜻,都需要重新檢查并修改代碼闯割。
當(dāng)換成簡單工廠模式后,具體代碼如下竿拆,當(dāng)需要新增type時宙拉,只需要重新添加新的operation的子類,并統(tǒng)一在操作工廠中添加邏輯丙笋。