2017-02-14 229 views
1

在如果條件如下如何在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

+0

你應該表現出更多的代碼,因爲該代碼有沒有圈複雜度:你有一個單一的路徑。 – davidxxx

+0

爲什麼你關心圈複雜性?如果您可以減少圈複雜度,您是否願意降低可讀性? –

+0

據我所知,圈複雜度是通過代碼的線性獨立路徑的數量。減少的一個簡單方法是使用'|'而不是'||',因爲每次都會強制評估所有條件。不過,我很難看到改進。 –

回答

0

可能獲得填充每個條件的布爾標誌和在if語句使用這些標誌。在我看來,這也會提高可讀性。

+1

但是這並不能解決複雜性問題嗎? –

0

在這種特殊情況下,我會做這個代碼更加普遍:

public void doSomething(boolean... val) { 
    for (boolean v : val) { 
     if (v) { 
      System.out.println("hello"); 
      return; 
     } 
    } 

    System.out.println("hello world"); 
} 

這將使你不要攜帶的方法參數的數目,如果這個方法裏面的邏輯是真的這個(即如果任何參數是true,則執行操作#1,否則執行操作#2)。

0

您的編輯後:

「上面的代碼的複雜性是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
  • 被分開分組條件語句,而這可能是一個單一的聲明
  • 退出該方法的條件時允許這樣做,而不是等待爲單個出口點。

+0

小提示:在if塊中需要一個'return;',在沒有else的片段中保持相同的輸出。 – Linuslabo

+0

@Linuslabo確實非常重要。謝謝。 – davidxxx