我将SonarQube用于Java项目,但复杂度计算对我来说并不清楚。以下示例的复杂度值为3:
public boolean even(int i) {
if (i % 2 == 0) {
return true;
}
return false;
}
根据User Guide,复杂性计算如下:“这是圈复杂度,也称为McCabe度量。每当函数的控制流分裂时,复杂度计数器就会增加1。每个函数的最小复杂度为1.“在详细描述中,提到return语句将复杂度值增加一(如果它不是方法中的最后一个语句)。我不明白为什么return语句拆分控制流。在我看来,在控制流中的每个return语句之后只有一种可能的方式。
答案 0 :(得分:3)
示例的控制流图包含5个边(E),5个节点(N) 和一个连通组件(P)。
根据复杂性的定义(M = E-N + 2P)是正确的 复杂度值为2。
答案 1 :(得分:0)
返回后不是控制流,而是控制流在两个方法出口点之间分开的事实。
考虑以下两种方法:
public boolean isAdult(int age) {
boolean overEighteen = false;
if (i > 18) {
overEighteen = true;
}
return overEighteen;
}
和
public boolean isAdultComplex(int age) {
boolean overEighteen = false; // not used, but keeping methods identical
if (i > 18) {
return true;
}
return false;
}
如果循环复杂度计算没有为isAdultComplex
方法中的早期返回添加一个,则这两种方法将具有相同的循环复杂度。但是第二个通过两个退出点肯定更复杂。
这个问题在这样的简短方法中经常显得微不足道,但想象一下150行方法的早期回归。精神上的跟随变得更加困难。
答案 2 :(得分:0)
仅供参考,这个讨论与https://jira.codehaus.org/browse/SONARJAVA-75有关。我确认目前,SonarQube报告的复杂性混合了“循环复杂性”和“34”。以及"基本复杂性"。