Wikiあたりとして:C#Linqの循環的複雑さ?
サイクロマティック複雑プログラムの 複雑さを示すために使用されるソフトウェア測定法、です。これは、プログラムのソースコードを使用して直線的に独立したパスの数を数値で表したものです。それは1976年
でトーマスJ.マッケイブ、シニアによって開発された この用語は、このようなラムダ式とC#のLINQに適用さでした:
_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が私に言っているのはなぜですか??
上記のWhere
節のロジックと同じ部分が複数if
に分割され、循環複雑度がであることが分かります。どうして?
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つの線形のパスがあります。なぜそれが「1」であってはならないと思いますか? – Amy
ここには分岐がないので、なぜそれがより複雑になると思うのか分かりません。 –
ええ、あなたは条件がありますが、 'else'がないので、パスは1つだけです。 –