【问题标题】:Cyclomatic Complexity in Visual StudioVisual Studio 中的圈复杂度
【发布时间】:2019-03-08 15:47:02
【问题描述】:

我使用 Visual Studio Code Metrics 进行了一些测试。因为我可以计算圈复杂度,每个ifwhilefor - 运算符都会将复杂度增加 1。我有下一个简单的方法:

static bool ContainsNegative(int a, int b, int c, int d)
    {
        if (a < 0 || b < 0 || c < 0 || d < 0) return false;
        return true;
    }

但是对于它,圈复杂度是 5,而不是 2(1 代表方法 + 1 代表 if)。 我的问题是 - 这是因为代码度量将if 运算符中的每个条件计算为不同的if? IE。我的方法相当于:

static bool ContainsNegative(int a, int b, int c, int d)
    {
        if (a < 0) return false;
        if (b < 0) return false;
        if (c < 0) return false;
        if (d < 0) return false;
        return true;
    }

这是一个显示结果的屏幕:

另外,有没有详细描述所有规则的列表?

谢谢!

【问题讨论】:

  • 这是一个非常简单的度量,它计算代码中的分支。既然你用了||而不是 | (短路运算符)你永远不会少于 4。实际上在这种情况下可以生成更快的代码,但往往会产生太多来自读者的 wtf 惊呼。这几乎是正确使用该工具的关键,您只需寻找危险信号并查看代码是否真的存在可读性问题。没有,继续。

标签: c# visual-studio code-metrics cyclomatic-complexity


【解决方案1】:

圈复杂度测量通过函数的路径数。正如您所建议的那样,这意味着为每个控制流语句添加 1,并为每个条件中的每个逻辑 NOT、AND 和 OR 添加 1。

5 的值告诉您的是,您需要 5 次单元测试才能获得 100% 的函数代码覆盖率。

【讨论】:

  • OP 的困惑是可以理解的,因为 Cyclomatic Complexity 以不同的方式定义。还有几种类型的代码覆盖率; CC 提供了实现基本路径覆盖所需的测试数量的上限(这是一个上限,因为某些路径可能无法遍历)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
相关资源
最近更新 更多