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

Sonarqube 为什么return语句会增加复杂性?,sonarqube,code-complexity,Sonarqube,Code Complexity,我将SonarQube用于一个Java项目,但复杂性计算对我来说并不清楚。对于以下示例,复杂性值为3: 公共布尔偶数(int i){ 如果(i%2==0){ 返回true; } 返回false; } 根据公式,复杂度计算如下:“它是圈复杂度,也称为McCabe度量。每当函数的控制流分裂时,复杂度计数器将增加1。每个函数的最小复杂度为1。”在详细描述中提到,return语句将复杂性值增加1(如果它不是方法中的最后一条语句)。我不明白为什么return语句会分割控制流。在我看来,在控制流中的每个r

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

公共布尔偶数(int i){
如果(i%2==0){
返回true;
}
返回false;
}

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

您的示例的控制流图包含5条边(E),5个节点(N) 和一个连接组件(P)

根据复杂性的定义(M=E-N+2P),正确的
复杂性值为2。

这不是返回后的控制流,而是控制流在两个方法出口点之间分割的事实

考虑以下两种方法:

public boolean isAdult(int age) {
  boolean overEighteen = false;
  if (i > 18) {
     overEighteen = true;
  }
  return overEighteen;
}

如果循环复杂度计算没有为
isAdultComplex
方法中的早期返回添加一个循环复杂度,那么这两个方法将具有相同的循环复杂度。但第二个问题显然更为复杂,因为它有两个出口点


在这样一个简短的方法中,这个问题通常看起来微不足道,但是想象一下在一个150行的方法中提前返回。这在精神上变得更加难以理解。

各位,这个讨论涉及到。我确认SonarQube报告的复杂度暂时混合了“圈复杂度”和“基本复杂度”。

return(1%2)==0远没有上面的代码复杂。这就解释了吗?为什么它与SonarQube计算的3不同?因为据我所知,SonarQube为每个返回增加了一个额外的返回。@titi我可以通过查看复杂性来确认这一点访客:如果你将早期返回替换为其他非最终变量,150行怪物可能会变得更糟。但是想象一下,超过40行的任何方法都无法通过代码审查并提交。问题已经解决了。
public boolean isAdultComplex(int age) {
  boolean overEighteen = false; // not used, but keeping methods identical
  if (i > 18) {
     return true;
  }
  return false;
}