簡體   English   中英

如何減少if條件下的圈復雜度?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM