最近我们公司开始每周测量我们代码中函数的圈复杂度(CC),并报告哪些函数得到了改进或恶化。所以我们开始更加关注函数的CC。
我读过 CC 可以非正式地计算为 1 + 函数中的决策点数(例如 if 语句、for 循环、选择等),或者通过函数的路径数......
我知道减少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 语句在心理上更难理解,但这反映在 CC 中吗?