在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 :(得分:0)
可以为每个条件填充boolean flags并在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
则执行ACTION#1,否则做行动#2)。
答案 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