[英]How to reduce cyclomatic complexity in a if condition?
在if條件中如下:
if( condition1 || condition2 || condition3 || condition4 || condition5)
在條件彼此獨立的情況下,代碼復雜性往往很高,有沒有辦法重構這個邏輯以降低復雜性?
這里的條件可以表示進行驗證並返回布爾值的方法。
我為了清楚起見添加了一個代碼段:
public void doSomething(boolean val, boolean val2, boolean val3, boolean val4, boolean val5, boolean val6)
{
if(val || val2 || val3|| val4|| val5|| val6)
{
System.out.println("hello");
}
else{
System.out.println("hello world");
}
}
上述代碼段的復雜性為7。
我怎樣才能減少它?
可以獲取為每個條件填充的布爾標志,並在if語句中使用這些標志。 在我看來,這也會提高可讀性。
在這種特殊情況下,我會使這個代碼更通用:
public void doSomething(boolean... val) {
for (boolean v : val) {
if (v) {
System.out.println("hello");
return;
}
}
System.out.println("hello world");
}
這將允許你不在方法中攜帶大量的參數,如果你在這個方法中的邏輯真的是這個(即如果任何參數為true
,則執行ACTION#1,否則執行ACTION#2)。
編輯后:
“上述代碼片段的復雜性為7”
我認為問題是您用來衡量復雜性的工具。
如果你更換它
if(val || val2 || val3|| val4|| val5|| val6)
通過
boolean condition = val || val2 || val3|| val4|| val5|| val6;
if(condition)
現在復雜性是多少?
在開發中,圈復雜度通常是指代碼流中的潛在路徑。 它通常與嵌套條件塊有關。
我們討論具有重要圈復雜度的代碼作為箭頭代碼,因為嵌套級別繪制了一種箭頭。
在您的示例代碼中,這不是問題,因為您只有三個可能的路徑:
public void doSomething(boolean val, boolean val2, boolean val3, boolean val4, boolean val5, boolean val6)
{
if(val || val2 || val3|| val4|| val5|| val6)
{
System.out.println("hello");
}
else{
System.out.println("hello world");
}
}
if(val || val2 || val3|| val4|| val5|| val6)
else{
else
和方法結束之間的代碼 較少的代碼有可能的路徑,更容易閱讀,測試和維護它。
在您太簡單的情況下,您可以通過使用else
語句來降低復雜性。 刪除潛在路徑:
public void doSomething(boolean val, boolean val2, boolean val3, boolean val4, boolean val5, boolean val6)
{
if(val || val2 || val3|| val4|| val5|| val6)
{
System.out.println("hello");
return;
}
System.out.println("hello world");
}
但顯然,您的示例太簡單,無法表現出與復雜性相關的嚴重問題。
以下是示例代碼的修改版本,其中復雜性問題涉及重構代碼以減少圈復雜度。
public void doSomething(boolean val, boolean val2, boolean val3, boolean val4, boolean val5, boolean val6)
{
if(val || val2 || val3|| val4|| val5|| val6)
{
if (condition){
if (val8 && val9){
...
}
else {
if (condition2 && condition3){
System.out.println("hello");
}
}
}
}
else{
System.out.println("hello world");
}
}
通常,為了減少圈復雜度,您必須減少可能路徑的數量。 你可以實現它:
else
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.