【发布时间】:2014-05-22 09:33:24
【问题描述】:
对于下面这段代码,sonarqube 计算方法的圈复杂度为 9
String foo() {
if (cond1) return a;
if (cond2) return b;
if (cond3) return c;
if (cond4) return d;
return e;
}
我理解根据计算规则http://docs.sonarqube.org/display/SONAR/Metrics+-+Complexity 9 的复杂度是正确的。 所以方法的复杂度是 = 4 (if) + 4 (return) + 1 (method) = 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;
}
我相信这段代码比以前的版本更加混乱和不可读,我觉得拥有返回保护条件的方法是一种更好的编程实践。那么,是否有充分的理由考虑使用 return 语句来计算圈复杂度?是否可以更改计算逻辑,使其不提升单个退出点。
【问题讨论】:
-
我必须同意你的看法。多重回报确实没有任何本质上的错误。正如您所看到的here,这个想法背后有历史原因,但在更现代的语言中使用它们应该没有任何问题。但是,我不知道如何更改计算方法,因此将保留评论。
标签: java sonarqube cyclomatic-complexity