Sonar不会增加Java中“ forEach”循环的圈复杂度得分

问题描述 投票:0回答:1

假设我有以下代码。

map.forEach((key, value) -> { //No Sonar cyclomatic complexity score

  for (String s : value) {   //Sonar lint : +2 (including 1 for nesting) 
    if (condition) {...}     //Sonar lint : +3 (including 2 for nesting)
  }

}

如上所述,对于for循环,Sonar分配了2分,同时考虑了线性结构破坏和嵌套的事实。很好

map.forEach((key, value) -> { //No Sonar cyclomatic complexity score

  value.forEach(s-> {        //No Sonar cyclomatic complexity score
    if (condition) {...}     //Sonar lint : +3 (including 2 for nesting)
  }); 

}

但是,如果我像上面那样重构forEach循环的for循环,所有针对for循环的圈复杂度的Sonar抱怨都会消失。但是正如您对if语句所看到的那样,圈复杂度是相同的。这意味着对于if语句,Sonar认为嵌套的分数相同(分数为2),这意味着它嵌套在下面2级(因为它位于两个forEach语句之下)。

我的问题是,Sonar尽管已经为if语句计算了结构和嵌套的圈复杂度,但在结构和嵌套方面都没有计算forEach循环的圈复杂度是什么逻辑?这是正确的还是SonarLint插件中的某些错误?

java sonarlint cyclomatic-complexity
1个回答
0
投票
[方法(或构造函数)的圈复杂度是数字该方法的可能线性独立的执行路径(请参阅[Wikipedia])。它最初是作为一种复杂性引入的由Thomas McCabe [McCabe]测量。

这与for-each vs for-loop无关,这仅仅是因为lambda表达式,lambda表达式使它成为匿名方法调用,因此,它不被认为是方法的循环复杂性,因为它成为您的线性路径方法。

© www.soinside.com 2019 - 2024. All rights reserved.