Java中如何消除過多條件判斷

2021-09-12 06:52:49 字數 3339 閱讀 3809

條件判斷結構是任何語言中的關鍵內容。但是如果編寫了大量巢狀if語句,會使得**更加複雜和難以維護。本文提供多種方式代替巢狀if語言,使**更簡潔。

通常我們遇到涉及很多條件的業務邏輯,每個條件需要處理不同邏輯。為了演示方便,我們使用calculator類,其中計算方法帶兩個運算元和乙個操作符作為輸入引數並返回操作結果:

public int calculate(int a, int b, string operator)  else if ("multiply".equals(operator))  else if ("divide".equals(operator))  else if ("subtract".equals(operator)) 

return result;

}

我們使用switch語句代替:

public int calculateusingswitch(int a, int b, string operator) 

return result;

}

大多數場景中,if語言會隨著業務擴充至更多更複雜,當有複雜條件時,switch也不適合。另外過多條件判斷結構的缺點是難以維護,例如,如果我們增加乙個新的操作,則需要增加新的if語言並實現其處理邏輯。

讓我們看看如何替代複雜的if語句,使其更簡單且**易維護。

public inte***ce operation
該方法包括兩個運算元作為輸入引數並返回操作結果。然後我們定義累加操作的實現:

public class addition implements operation 

}

現在實現工廠類,基於給定的操作返回相應operation的例項:

public class operato***ctory 

public static optionalgetoperation(string operator)

}

calculator類中查詢工廠獲得相應操作並執行數值計算:

public int calculateusingfactory(int a, int b, string operator)
通過在map中維護多個物件實現快速查詢。在執行時初始化map並配置相應值用於查詢,請看operato***ctory.getoperation(operator)方法。

我們看到把責任委託給工廠類避免過度耦合。但有可能把if語句簡單地轉移至工廠類,這不是我們的目的。

除了使用map,我們也可以使用列舉(enum)標籤化特定業務邏輯,然後可以在if或switch語句中使用。當然也可以在物件工廠中使用並執行相關業務邏輯。這樣也可以減少if語句數量並委託責任給各個列舉值。下面請看示例如何實現,我們需要定義列舉:

public enum operator
我們看到每個值代表不同操作的標籤用於後續計算。可以在if或switch語句中使用,但也可以直接把責任委託給列舉自己,下面我們給每個列舉值訂乙個方法實現相應計算:

public enum operator 

},multiply

},subtract

};// ...

}

在calculator類中,定義方法執行計算操作:

public int calculate(int a, int b, operator operator)
通過operator.valueof()方法把轉換字串值轉成operation列舉型別執行方法:

@test

public void whencalculateusingenumoperator_thenreturncorrectresult()

在前面的示例中,我們看到使用工廠類並根據給定操作返回相應業務邏輯物件,然後在calculator中業務邏輯物件則用於執行計算。

我們也可以設計calculator#calculate 方法接收命令介面型別作為輸入被執行,這是消除if語句的另一種方案,請看command介面:

public inte***ce command
addcommand的實現:

public class addcommand implements command 

@override

public integer execute()

}

最後在calculator類中引入新的方法,接收並執行command:

public int calculate(command command)
這時,我們可以例項化addcommand物件傳送給calculator#calculate並執行計算:

@test

public void whencalculateusingcommand_thenreturncorrectresult()

當消除大量if語句時,每個條件描述乙個業務規則,根據條件處理正確的邏輯。使用規則引擎可以消除主要複雜**,規則引擎評估規則並基於輸入返回結果。

下面通過示例進行說明,設計簡單的ruleengine類,其通過一組rule處理expression並返回每個規則的執行結果。首先定義rule介面:

public inte***ce rule
其次,實現ruleengine:

public class ruleengine 

public result process(expression expression)

}

ruleengine接收expression物件並返回result。expression類包括兩個integer物件和operator物件。

public class expression
public class addrule implements rule 

return evalresult;

}@override

public result getresult()

}

最後使用expression物件測試執行ruleengine:

@test

public void whennumbersgiventoruleengine_thenreturncorrectresult()

本文我們**多種方法消除複雜**,學習有效使用設計模式代替複雜的if語句。

Handlebar如何多條件判斷

最近公司讓做專案的基本資訊的增刪改查 然後前端用的框架是handlebar 有乙個問題就是 後端傳過來的資料是數字 但是在前台展示的時候需要把數字換成對應的字句進行展示 儲存的時候需要存對應的數字 資料庫儲存如下 前台回顯的時候是這樣的 對應的js是 handlebars.registerhelpe...

Nginx中if語句的判斷條件與多條件判斷詳解

一 if語句中的判斷條件 nginx 介紹 1 正規表示式匹配 等值比較 與指定正規表示式模式匹配時返回 真 判斷匹配與否時區分字元大小寫 與指定正規表示式模式匹配時返回 真 判斷匹配與否時不區分字元大vfjwwxi小寫 與指定正規表示式模式不匹配時返回 真 判斷匹配與否時區分字元大小寫 與指定正規...

django中如何實現多條件查詢

一 使用字典儲存查詢條件 獲取查詢條件 start date request.post.get start date end date request.post.get end date order type request.post.get order type order nature requ...