声纳圈复杂度规则问题 - 不鼓励多个返回语句

gop*_*aob 7 java cyclomatic-complexity sonarqube

对于下面的代码,sonarqube计算方法圈复杂度为9

String foo() {
    if (cond1) return a;
    if (cond2) return b;
    if (cond3) return c;
    if (cond4) return d;
    return e;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,根据计算规则http://docs.sonarqube.org/display/SONAR/Metrics+-+Complexity,9的复杂性是正确的.因此该方法的复杂性是= 4(如果)+ 4(返回)+ 1(方法)= 9

如果我有一个退出点,这种复杂性可以降低.

String foo() {
    String temp;
    if (cond1) { 
        temp = a;
    } else if (cond2) {
        temp = b;
    } else if (cond3) { 
        temp = c;
    } else if (cond4) {
        temp = d;
    } else {
        temp = e;
    }
    return temp;
}
Run Code Online (Sandbox Code Playgroud)

我相信这个代码比以前的版本更混乱,更难以理解,我觉得拥有返回保护条件的方法是一种更好的编程习惯.那么有什么理由可以考虑返回语句来计算圈复杂度?可以改变计算逻辑,使其不会促进单一退出点.

Pet*_*rey 9

我同意你应该使用一些常识,并使用你认为最简单的代码.

BTW您可以简化代码并在使用时只返回一个代码 ? :

String foo() {
    return cond1 ? a :
           cond2 ? b :
           cond3 ? c :
           cond4 ? d : e;
}
Run Code Online (Sandbox Code Playgroud)

  • 这不能解决复杂性问题,这仅仅是代码美感。 (2认同)