我有一段代码,我有一个问题,减少了圈复杂度。由于必须匹配的多个条件,我不确定进一步分解它的最佳方法。使问题复杂化的是,在2个案例中创建了一个新对象,但在第三个案例中却没有(它调用另一个方法)。这是伪代码:
if (!cond3 && !cond1 && cond2 && cond4) {
// actions to perform
calculateValues();
return result;
} else if (!cond1 && cond2 && cond3) {
// actions to perform
Object result = new Result();
return result;
} else if (!cond4 && cond3 && cond1 && cond5) {
// actions to perform
Object result = new Result();
return result;
} else {
// throw error because inputs are invalid
}
答案 0 :(得分:6)
您应该重构该代码,使用方法来抽象这些条件,高圈数表明代码需要重构。例如,假设:private boolean loggedUserHasCar() {
return !cond4 && cond3 && cond1 && cond5;
}
测试记录的用户是否有汽车,那么您应该将这些条件组合重构为方法:
if
对其他条件做同样的事情。具有4个条件的sum(CAST(TXN AS BIGINT))
语句很难阅读。提取这些语句会降低方法的圈复杂度并使代码更具可读性
答案 1 :(得分:2)
我对您的问题非常感兴趣,并尝试提出早期的解决方案,并提取条件来分隔此类方法
{{1}}
降低Cyclometric Complexity的结果在这里(我使用MetricsReloaded IntelliJ IDEA plugin)。它通过在主要和辅助方法之间传播复杂性来实现:)
P.S。有趣的是:我试图将你的条件提取为局部变量,并没有像我最初预期的那样降低方法的复杂性。
答案 2 :(得分:1)
您可以将方程式复杂度降低到11,将方程式的常见部分提取为新变量
boolean common = !cond1 && cond2;
...
if (!cond3 && common && cond4) {
// actions to perform
calculateValues();
return result;
} else if (common && cond3) {
// actions to perform
Object result = new Result();
return result;
} else if (!cond4 && cond3 && cond1 && cond5) {
// actions to perform
Object result = new Result();
return result;
} else {
// throw error because inputs are invalid
}