根据Wiki:
Cyclomatic复杂度是一个软件指标,用于表示 程序的复杂性。它是数量的定量测量 通过程序源代码的线性独立路径。它是 由Thomas J. McCabe,Sr。于1976年开发。
这个术语是否适用于C#Linq,其lambda表达式如下:
_fred = fred.Where(c =>
c.IsActive &&
c.PriorityOrder.HasValue &&
(c.PriorityOrder == 0 || !(c.MinUnits == 0 && (!c.MaxUnits.HasValue || c.MaxUnits == 0))))
.GroupBy(x => x.Scope)
.ToDictionary(x => x.Key, x => x.ToList());
如果是这样,这段代码的cyclomatic complexity
是什么,为什么Resharper告诉我它是.. 1 ?
上面Where
子句分解为多个if
语句的相同逻辑显示 9 的圈复杂度。为什么呢?
private IEnumerable<Priority> FilterPriorities(IEnumerable<Priority> priorities)
{
var result = new List<Priority>();
foreach (var p in priorities)
{
if (p.IsActive == false) continue;
if (p.PriorityOrder.HasValue == false) continue;
if (p.PriorityOrder == 0)
{
result.Add(p);
continue;
}
if ((p.MinUnits == 0 && (!p.MaxUnits.HasValue || p.MaxUnits == 0)) == false)
{
result.Add(p);
}
}
return result;
}
答案 0 :(得分:2)
循环复杂性不会像你的简单&#34;表达式,因为这是定义Cyclomatic复杂性的原因。
如果您的表达能够被理解/重写为:
if (something)
your_variable = this_thing;
else
your_variable = this_other_thing;
然后 会影响你的圈复杂度。
但是,对于LINQ,大多数使用lambdas的构造(LINQ表达式基本上都是用于创建的语法),编译器和圈复杂度分析器将会看到:
your_variable = really_complex_expression;
因此,它会将其视为代码中的一条路径。
我们是否需要采用不同的方法来衡量复杂性来处理这类事情,这对我来说是未知的,但是圈复杂度并非如此。