减少循环复杂性

时间:2016-02-26 23:43:49

标签: java cyclomatic-complexity

我有一段代码,我有一个问题,减少了圈复杂度。由于必须匹配的多个条件,我不确定进一步分解它的最佳方法。使问题复杂化的是,在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
    }

3 个答案:

答案 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)。它通过在主要和辅助方法之间传播复杂性来实现:)

enter image description here

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
}     
相关问题