您的编辑后:
“上面的代码的复杂性是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
为什么你关心圈复杂性?如果您可以减少圈复杂度,您是否愿意降低可读性? –
据我所知,圈复杂度是通过代码的线性独立路径的数量。减少的一个简单方法是使用'|'而不是'||',因为每次都会强制评估所有条件。不过,我很难看到改进。 –