Java中多個ifelse語句的替代設計

2021-09-24 07:45:43 字數 3673 閱讀 9807

ifelse是任何程式語言的重要組成部分。但是我們編寫了大量巢狀的if語句,這使得我們的**更加複雜和難以維護。

接下來,讓我們探索如何簡化**的中的ifelse語句寫法。

我們經常遇到涉及很多條件的業務邏輯,並且每個邏輯都需要不同的處理方式。以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語句並實現該操作。

可以通過設計模式,來達到我們要的效果。

很多時候,我們遇到ifelse結構,最終在每個分支中執行類似的操作。這提供了提取工廠方法的機會,該工廠方法返回給定型別的物件並基於具體物件行為執行操作。

public inte***ce operation 

複製**

該方法將兩個數字作為輸入並返回結果。讓我們定義乙個用於執行新增的類:

public class addition implements operation 

}複製**

我們現在將實現乙個工廠類,它根據給定的運算子返回operation的例項:

public class operato***ctory 

public static optionalgetoperation(string operator)

}複製**

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

複製**

在這個例子中,我們已經看到了如何將責任委託給工廠類提供的鬆散耦合物件。但是有可能巢狀的if語句只是轉移到了工廠類,這違背了我們的目的。

或者,我們可以在map中維護乙個物件儲存庫,可以查詢該儲存庫以進行快速查詢。正如我們所見,operato***ctory#operationmap服務於我們的目的。我們還可以在執行時初始化map並將它們配置為查詢。

除了使用map之外,我們還可以使用enum來標記特定的業務邏輯。之後,我們可以在巢狀的if語句或switch case 語句中使用它們。或者,我們也可以將它們用作物件的工廠並制定策略以執行相關的業務邏輯。

這樣可以減少巢狀if語句的數量,並將責任委託給單個enum值。

讓我們看看我們如何實現它。首先,我們需要定義我們的列舉:

public enum operator 

複製**

可以觀察到,這些值是不同運算子的標籤,將進一步用於計算。我們總是可以選擇在巢狀的if語句或switch case中使用這些值作為不同的條件,但讓我們設計一種將邏輯委託給enum本身的替代方法。

我們將為每個enum值定義方法並進行計算。例如:

add 

},// other operators

複製**

然後在calculator類中,我們可以定義乙個執行操作的方法:

現在,我們可以通過使用operator#valueof()方法將string值轉換為operator來呼叫該方法:

@test

public void test

() 複製**

在前面的討論中,我們已經看到使用工廠類來返回給定運算子的正確業務物件的例項。稍後,業務物件用於在計算器中執行計算。

我們還可以設計乙個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 test

() 複製**

當我們最終編寫大量巢狀if語句時,每個條件都描述了乙個業務規則,必須對其進行評估才能處理正確的邏輯。規則引擎從主**中獲取了這種複雜性。乙個ruleengine評估規則和返回基於輸入的結果。

讓我們通過設計乙個簡單的ruleengine來演示乙個例子,該ruleengine通過一組規則處理expression並返回所選規則的結果。首先,我們將定義乙個rule介面:

public inte***ce rule 

複製**

其次,讓我們實現乙個ruleengine:

public class ruleengine 

public result process(expression expression)

}複製**

所述ruleengine接受乙個表達物件,並返回結果。現在,讓我們將expression類設計為一組包含兩個integer物件的operator,它將被應用:

public class expression 

複製**

最後讓我們定義乙個自定義的addrule類,該類僅在指定add操作時進行求值:

public class addrule implements rule 

return

evalresult;

}

}複製**

我們現在將使用expression呼叫ruleengine:

@test

public void test

() 複製**

通過這些設計模式,可以作為我們的ifelse語句的替代方案,具體用哪一種可以根據你的實際業務場景來決定。

Python中的 if else 語句

引入 if else的作用,滿足乙個條件做什麼,否則做什麼。if else 語句語法結構 if 判斷條件 要執行的 else 要執行的 判斷條件 一般為關係表示式或bool型別的值 執行過程 程式執行到if處,首先判斷所帶的條件,如果條件成立,就是返回值是true,則執行下面的 如果條件不成立則返回...

if else語句使用

if else的使用場景 當條件成立完成a操作,不成立完成b操作 if else語句的語法格式 if 要判斷的條件 條件滿足,完成a操作 else 條件不滿足,完成b操作 age int input 請輸入您的年齡 input函式返回的是字串資料 print age,type age 判斷年齡是否成...

Shell中的if else語句小演示

安安靜靜學習小shell,今天看到if else 嘍 下面這個指令碼是判斷使用者執行指令碼的引數,如果是hello的話,就顯示how are you 如果什麼都沒有,就提示輸入 如果引數不是hello,就提示輸入hello 也很簡單 bin bash if 1 hello then echo how...