【问题标题】:Clarifying the manual count of Cyclomatic Complexity澄清循环复杂度的手动计数
【发布时间】:2016-12-27 14:05:39
【问题描述】:

假设我们有这样的代码:

switch(y)
{
case 1: case 2: case 3:
    function();
    break;
case 4: case 5: case 6:
    function_2();
    break;
}

我们可以在这里得到 CC 值为 6+1 吗?为什么要添加 1 的值?如果CC值为7,那是独立路径的数量吗?

如果上面考虑了失败的情况怎么办?由于可能只有两条唯一路径,2 +1 =3

以上哪一个是正确的,还是两者都正确?

【问题讨论】:

  • 有三个(不同的)路径通过这个开关,而不是两个。
  • 第 7 种情况是 y 既不是 1、2、3、4、5 也不是 6。
  • 要尝试回答这个问题,我想说 CC 必须根据代码在逻辑上执行的操作来定义,而不是处理器实际执行的操作(我们甚至不知道它会做什么大多数时候)。我们不关心2 是否会访问更少的switch 案例,因为我们肯定知道最终它将达到与3 相同的状态。我非常喜欢在这里说 CC 是 3
  • @Raphaël 圈复杂度与运行时比较或评估无关。这是一个可以静态计算的指标(在编译时)
  • 是的,3 似乎是正确的。但是如果给定的 sn-p 通过类似 RSM 的工具运行,它会输出 7 作为 CC 值。也许这两个值都是正确的?

标签: java metrics code-metrics cyclomatic-complexity


【解决方案1】:

众所周知,CC = P+1.

这里,P = 谓词节点数(条件)= 2

条件数将为 2,因为:

案例分支可以涵盖多个替代值或范围,例如 案例 1、2、5 到 10。因为他们没有引入额外的分支来决定 开,它们也不会增加圈复杂度。

来源:here

所以,CC = 2+1 = 3

【讨论】:

  • 谢谢你的解释,但是如果y=2,代码会跳过case 1,直接跳转到case 2和3,所以如果我们用IF条件写上面相同的代码,我们会得到7 的 CC。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
相关资源
最近更新 更多