C#Linq的循环复杂性?

时间:2017-11-03 18:22:26

标签: c# linq cyclomatic-complexity

根据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;
}

1 个答案:

答案 0 :(得分:2)

循环复杂性不会像你的简单&#34;表达式,因为这是定义Cyclomatic复杂性的原因。

如果您的表达能够被理解/重写为:

if (something)
    your_variable = this_thing;
else
    your_variable = this_other_thing;

然后 会影响你的圈复杂度。

但是,对于LINQ,大多数使用lambdas的构造(LINQ表达式基本上都是用于创建的语法),编译器和圈复杂度分析器将会看到:

your_variable = really_complex_expression;

因此,它会将其视为代码中的一条路径。

我们是否需要采用不同的方法来衡量复杂性来处理这类事情,这对我来说是未知的,但是圈复杂度并非如此。