2017-11-03 1 views
-1

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つの線形のパスがあります。なぜそれが「1」であってはならないと思いますか? – Amy

+1

ここには分岐がないので、なぜそれがより複雑になると思うのか分かりません。 –

+1

ええ、あなたは条件がありますが、 'else'がないので、パスは1つだけです。 –

答えて

2

サイクロマティック複雑さは、それはサイクロマティック複雑さが行うことに定義されているものだから、「シンプル」という表現以外のものとして、あなたのLINQの式をキャッチするつもりはありません。

あなたの表現は次のように書き換え/理解することができる場合は、次の

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

その後、があなたのサイクロマティック複雑さに影響を与えるために起こっています。

your_variable = really_complex_expression; 

だから、それが起こっている:(LINQ式は基本的に作成するための構文です)ラムダ、コンパイラ、および循環的複雑度アナライザを使用して

しかし

、LINQと、ほとんどの構築物は、これを見に行きますさあなたのコードを1パスとして数えます。


我々はこの種のものを処理するために複雑さを測定する別の方法が必要としているかどうかは(私に)知られていないが、循環的複雑度はそれではありません。

関連する問題