language-agnostic - 寻求有关构建代码以降低圈复杂度的澄清

标签 language-agnostic metrics cyclomatic-complexity

最近,我们公司开始每周测量代码中函数的圈复杂度 (CC),并报告哪些函数得到了改进或恶化。因此我们开始更加关注函数的 CC。

我读到,CC 可以非正式地计算为 1 + 函数中决策点的数量(例如 if 语句、for 循环、select 等),或者也可以是通过函数的路径数...

我明白减少CC最简单的方法就是反复使用Extract Method重构...

有些事情我不确定,例如以下代码片段的CC是什么?

1)

for (int i = 0; i < 3; i++)
    Console.WriteLine("Hello");

还有

Console.WriteLine("Hello");
Console.WriteLine("Hello");
Console.WriteLine("Hello");

它们都做同样的事情,但是第一个版本是否因为 for 语句而具有更高的 CC?

2)

if (condition1)
    if (condition2)
        if (condition 3)
            Console.WriteLine("wibble");

还有

if (condition1 && condition2 && condition3)
    Console.WriteLine("wibble");

假设该语言进行短路求值,例如 C#,那么这两个代码片段具有相同的效果...但是第一个片段的 CC 是否更高,因为它有 3 个决策点/if 语句?

3)

if (condition1)
{
    Console.WriteLine("one");

    if (condition2)
        Console.WriteLine("one and two");
}

还有

if (condition3)
    Console.WriteLine("fizz");

if (condition4)
    Console.WriteLine("buzz");

这两个代码片段做不同的事情,但是它们有相同的CC吗?或者第一个片段中的嵌套 if 语句是否具有更高的 CC?即嵌套的 if 语句在心理上更难以理解,但这是否反射(reflect)在 CC 中?

最佳答案

  1. 是的。您的第一个示例有决策点,而第二个示例没有,因此第一个示例具有更高的 CC。
  2. 是的 - 也许您的第一个示例有多个决策点,因此具有更高的 CC。 (请参阅下面的解释。)
  3. 是的——也许吧。显然他们的决策点数量相同,但是计算CC的方式不同,这意味着……

...如果您的公司正在以特定方式测量 CC,那么您需要熟悉该方法(希望他们正在使用工具来执行此操作)。对于不同的情况(case 语句、 bool 运算符等)有不同的计算 CC 的方法,但无论使用哪种约定,您都应该从度量中获得相同类型的信息。

更大的问题是其他人提到的,你们公司似乎更关注 CC,而不是其背后的代码。一般来说,当然,低于 5 很好,低于 10 很好,低于 20 还可以,21 到 50 应该是一个警告信号,高于 50 应该是一个很大的警告信号,但这些只是指导,而不是绝对规则。您可能应该检查 CC 高于 50 的过程中的代码,以确保它不仅仅是一大堆代码,但也许有一个特定的原因导致该过程以这种方式编写,并且它是不可行的(对于任何多个原因)来重构它。

如果您使用工具重构代码以减少 CC,请确保您了解这些工具的作用,并且它们不仅仅是将一个问题转移到另一个地方。最终,您希望您的代码几乎没有缺陷、能够正常工作并且相对易于维护。如果该代码的 CC 也较低,那就太好了。如果您的代码符合这些标准并且 CC 高于 10,也许是时候与您能找到的任何管理层坐下来捍卫您的代码(或许还可以让他们检查他们的政策)。

关于language-agnostic - 寻求有关构建代码以降低圈复杂度的澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/204369/

相关文章:

algorithm - 修改后的二叉树的有序遍历

kubernetes - 查询kubernetes指标-服务器指标值

php - 减少圈复杂度的过多 switch case 的替代方案?

Java - 当字符串不是文字而是对象时?

java - 即将将(Java)库移植到 Objective-C : Methodology?

parsing - 左分解和左递归之间的区别

java - 提取Java方法文本

google-analytics - 会将分组应用于GA中的计算指标吗?

java - 降低java方法的圈复杂度

C# :Cyclomatic Complexity of a method with FxCop sdk