为什么return语句增加了复杂性?

时间:2014-04-30 06:38:32

标签: sonarqube code-complexity

我将SonarQube用于Java项目,但复杂度计算对我来说并不清楚。以下示例的复杂度值为3:

public boolean even(int i) {
  if (i % 2 == 0) {
    return true;
  }
  return false;
}

根据User Guide,复杂性计算如下:“这是圈复杂度,也称为McCabe度量。每当函数的控制流分裂时,复杂度计数器就会增加1。每个函数的最小复杂度为1.“在详细描述中,提到return语句将复杂度值增加一(如果它不是方法中的最后一个语句)。我不明白为什么return语句拆分控制流。在我看来,在控制流中的每个return语句之后只有一种可能的方式。

3 个答案:

答案 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”。以及"基本复杂性"。