您的編輯後:
「上面的代碼的複雜性是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
- 被分開分組條件語句,而這可能是一個單一的聲明
- 退出該方法的條件時允許這樣做,而不是等待爲單個出口點。
你應該表現出更多的代碼,因爲該代碼有沒有圈複雜度:你有一個單一的路徑。 – davidxxx
爲什麼你關心圈複雜性?如果您可以減少圈複雜度,您是否願意降低可讀性? –
據我所知,圈複雜度是通過代碼的線性獨立路徑的數量。減少的一個簡單方法是使用'|'而不是'||',因爲每次都會強制評估所有條件。不過,我很難看到改進。 –