지나치게 복잡하게 만들지 마십시오.
업데이트: 2007년 11월
TypeName |
AvoidExcessiveComplexity |
CheckId |
CA1502 |
범주 |
Microsoft.Maintainability |
변경 수준 |
주요 변경 아님 |
원인
메서드가 과도한 순환 복잡성을 갖습니다.
규칙 설명
순환 복잡성(cyclomatic complexity)은 메서드를 통과하는 선형 독립 경로의 수를 측정하며 조건부 분기의 수와 복잡성에 의해 결정됩니다. 낮은 순환 복잡성은 대개 쉽게 이해하고 테스트하고 유지 관리할 수 있는 메서드를 나타냅니다. 순환 복잡성은 메서드의 제어 흐름 그래프에서 계산되며 다음과 같이 지정됩니다.
순환 복잡성 = 에지(edge) 수 - 노드 수 + 1
여기서 노드는 논리 분기점을 나타내고 에지(edge)는 노드 사이의 선을 나타냅니다.
순환 복잡성이 25를 넘으면 규칙이 위반을 보고합니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 메서드를 리팩터링하여 순환 복잡성을 줄입니다.
경고를 표시하지 않는 경우
복잡성을 쉽게 줄일 수 없고 메서드가 이해하고 테스트하고 유지 관리하기 쉬우면 이 규칙에서 경고를 표시하지 않아도 안전합니다. 특히 switch(Visual Basic에서는 Select) 문이 많이 포함된 메서드는 제외할 수 있습니다. 코드 리팩터링으로 유지 관리의 이점을 얻는 것보다는 개발 주기의 뒷부분에서 코드 베이스가 불안정하게 되거나 이전에 제공된 코드에서 런타임 동작이 예기치 않게 변경되지 않도록 하는 것이 더 중요합니다.
순환 복잡성을 계산하는 방법
기본적으로 순환 복잡성은 다음 항목에 1을 더하여 계산됩니다.
분기 수(if, while 및 do 등)
switch 내의 case 문 수
다음 예제에서는 다양한 순환 복잡성이 포함된 메서드를 보여 줍니다.
예제
순환 복잡성 1
Public Sub Method()
Console.WriteLine("Hello World!")
End Sub
public void Method()
{
Console.WriteLine("Hello World!");
}
void Method()
{
Console::WriteLine("Hello World!");
}
순환 복잡성 2
Public Sub Method(ByVal condition As Boolean)
If (condition) Then
Console.WriteLine("Hello World!")
End If
End Sub
void Method(bool condition)
{
if (condition)
{
Console.WriteLine("Hello World!");
}
}
void Method(bool condition)
{
if (condition)
{
Console::WriteLine("Hello World!");
}
}
순환 복잡성 3
Public Sub Method(ByVal condition1 As Boolean, ByVal condition2 As Boolean)
If (condition1 OrElse condition2) Then
Console.WriteLine("Hello World!")
End If
End Sub
public void Method(bool condition1, bool condition2)
{
if (condition1 || condition2)
{
Console.WriteLine("Hello World!");
}
}
void Method(bool condition1, bool condition2)
{
if (condition1 || condition2)
{
Console::WriteLine("Hello World!");
}
}
순환 복잡성 4
Public Sub Method(ByVal day As DayOfWeek)
Select Case day
Case DayOfWeek.Monday
Console.WriteLine("Today is Monday!")
Case DayOfWeek.Tuesday
Console.WriteLine("Today is Tuesday!")
Case DayOfWeek.Wednesday
Console.WriteLine("Today is Wednesday!")
Case DayOfWeek.Thursday
Console.WriteLine("Today is Thursday!")
Case DayOfWeek.Friday
Console.WriteLine("Today is Friday!")
Case DayOfWeek.Saturday
Console.WriteLine("Today is Saturday!")
Case DayOfWeek.Sunday
Console.WriteLine("Today is Sunday!")
End Select
End Sub
public void Method(DayOfWeek day)
{
switch (day)
{
case DayOfWeek.Monday:
Console.WriteLine("Today is Monday!");
break;
case DayOfWeek.Tuesday:
Console.WriteLine("Today is Tuesday!");
break;
case DayOfWeek.Wednesday:
Console.WriteLine("Today is Wednesday!");
break;
case DayOfWeek.Thursday:
Console.WriteLine("Today is Thursday!");
break;
case DayOfWeek.Friday:
Console.WriteLine("Today is Friday!");
break;
case DayOfWeek.Saturday:
Console.WriteLine("Today is Saturday!");
break;
case DayOfWeek.Sunday:
Console.WriteLine("Today is Sunday!");
break;
}
}
}
void Method(DayOfWeek day)
{
switch (day)
{
case DayOfWeek::Monday:
Console::WriteLine("Today is Monday!");
break;
case DayOfWeek::Tuesday:
Console::WriteLine("Today is Tuesday!");
break;
case DayOfWeek::Wednesday:
Console::WriteLine("Today is Wednesday!");
break;
case DayOfWeek::Thursday:
Console::WriteLine("Today is Thursday!");
break;
case DayOfWeek::Friday:
Console::WriteLine("Today is Friday!");
break;
case DayOfWeek::Saturday:
Console::WriteLine("Today is Saturday!");
break;
case DayOfWeek::Sunday:
Console::WriteLine("Today is Sunday!");
break;
}
}