2017-02-14 76 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