2017-11-03 9 views
-1

:C# Linq의 순환 적 복잡성? <a href="https://en.wikipedia.org/wiki/Cyclomatic_complexity" rel="nofollow noreferrer">Wiki</a> 당으로

된 Cyclomatic 복잡성은 프로그램의 복잡성을 나타 내기 위해 사용되는 소프트웨어 메트릭입니다. 프로그램의 소스 코드를 통해 선형으로 독립적 인 경로의 수를 나타내는 양적 측정입니다. cyclomatic complexity 무엇인가,

_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()); 

그렇다면 : 그것은이 용어는 이와 같은 람다 표현식으로 Linq는 C#에 적용 할 수있는 1976

에 미스터 토마스 J. 맥케 이브에 의해 개발 했다 이 코드와 왜 Resharper가 나에게 ... ? 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

이 코드를 통해 하나의 선형 경로가 나타납니다. 왜 그것이 '1'이 아니어야한다고 생각하니? – Amy

+1

여기에는 분기가 없으므로 왜 더 복잡 할 것으로 예상하는지 모르겠습니다. –

+1

네, 조건이 있지만 'else'가 없으므로 하나의 경로 만 있습니다. –

답변

2

된 Cyclomatic 복잡성은이 된 Cyclomatic 복잡성이 어떻게 정의되어 무엇 때문에 "간단한"표현하지만, 아무것도 당신의 LINQ 식을 잡을려고하고 있지 않다. 당신의 발현이 이해 할 수있는 경우

은/이렇게 될 재 작성 :

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

을 다음 된 Cyclomatic의 복잡성에 영향을 미칠 것의 .

your_variable = really_complex_expression; 

그래서 무슨 : (LINQ 표현은 기본적으로 만들기위한 구문입니다) 람다, 컴파일러 및 복잡성을 분석기를 사용하여

그러나

, LINQ와, 대부분의 구조는이 볼 것입니다 귀하의 코드를 통해 1 경로로 계산합니다. 우리는 이런 종류의 일을 처리하기 위해 복잡성을 측정하는 다른 방법을 필요 해요 여부


는 (나에게) 알 수없는,하지만 복잡성을가 없습니다.