CA1502: 지나치게 복잡하게 만들지 마십시오.

속성
규칙 ID CA1502
타이틀 지나치게 복잡하게 만들지 마세요.
범주 유지 관리
수정 사항이 주요 변경인지 여부 주요 변경 아님
기본 임계값 25
.NET 8에서 기본적으로 사용 아니요

원인

메서드의 순환 복잡성이 지나치게 높습니다.

규칙 설명

‘순환 복잡성’은 조건부 분기의 개수 및 복잡성에 따라 결정되는 메서드를 통해 선형 독립 경로의 개수를 측정합니다. 낮은 순환 복잡성은 일반적으로 이해, 테스트, 유지 관리가 쉬운 메서드를 나타냅니다. 순환 복잡성은 메서드의 제어 흐름 그래프에서 계산되고 다음과 같이 지정됩니다.

순환 복잡성 = 에지 수 - 노드 수 + 1

‘노드’는 논리 분기 지점을 나타내고 ‘에지’는 노드 사이의 줄을 나타냅니다.

규칙은 메서드의 주기적 복잡성이 25를 초과하는 경우 위반을 보고합니다. 그러나 임계값 을 구성하고 규칙이 분석해야 하는 다른 종류의 기호를 지정할 수도 있습니다.

코드 메트릭에 대해 자세히 알아보려면 관리 코드의 복잡성 측정을 참조하세요.

위반 문제를 해결하는 방법

이 규칙의 위반 문제를 해결하려면 메서드를 리팩터링하여 순환 복잡성을 줄입니다.

경고를 표시하지 않는 경우

복잡성을 쉽게 줄일 수 없고 메서드의 이해, 테스트, 유지 관리가 쉬운 경우 이 규칙의 경고를 표시하지 않아도 됩니다. 특히 긴 switch(Visual Basic의 경우 Select) 문을 포함하는 메서드는 제외하기 적합한 후보입니다. 개발 주기 후반에 코드베이스를 불안정하게 하거나 이전에 제공한 코드에서 런타임 동작을 예기치 않게 변경하는 위험이 코드 리팩터링을 통한 유지 관리 이점보다 클 수 있습니다.

참고 항목

다음이 모두 적용되는 경우 이 규칙에서 가양성 경고가 표시될 수 있습니다.

  • Visual Studio 2022 버전 17.5 이상을 이전 버전의 .NET SDK(.NET 6 이하)와 함께 사용하고 있습니다.
  • .NET 6 SDK 분석기 또는 이전 버전의 분석기 패키지(예: Microsoft.CodeAnalysis.FxCopAnalyzers)를 사용하고 있습니다.

가양성은 C# 컴파일러의 호환성이 손상되는 변경으로 인해 발생합니다. 가양성 경고에 대한 수정 사항이 포함된 최신 분석기를 사용하는 것이 좋습니다. Microsoft.CodeAnalysis.NetAnalyzers 버전 7.0.0-preview1.22464.1 이상으로 업그레이드하거나 .NET 7 SDK에서 분석기를 사용하세요.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

#pragma warning disable CA1502
// The code that's violating the rule is on this line.
#pragma warning restore CA1502

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none으로 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA1502.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

임계값 구성

이 규칙이 실행되는 임계값과 분석할 기호 종류를 구성할 수 있습니다. 허용되는 기호 종류는 다음과 같습니다.

  • Assembly
  • Namespace
  • Type
  • Method
  • Field
  • Event
  • Property
  1. CodeMetricsConfig.txt라는 텍스트 파일을 만듭니다.

  2. 텍스트 파일에 원하는 임계값을 다음 형식으로 추가합니다.

    CA1502: 10
    

    이 예제에서는 메서드의 순환 복잡성이 10보다 클 때 규칙이 실행되도록 구성됩니다.

    CA1502(Type): 4
    

    이 예제에서는 형식의 순환 복잡성이 4보다 클 때 규칙이 실행되도록 구성됩니다. 이 구성 파일을 사용하면 규칙은 기본값(25)보다 큰 주기적 복잡성으로 메서드를 계속 보고합니다.

  3. 프로젝트 파일에서 구성 파일의 빌드 동작을 AdditionalFiles로 표시합니다. 예시:

    <ItemGroup>
      <AdditionalFiles Include="CodeMetricsConfig.txt" />
    </ItemGroup>
    

순환 복잡성을 계산하는 방법

순환 복잡성은 다음에 1을 더하여 계산됩니다.

  • 분기 수(예: if, while및)입니다 do.
  • case 문 수입니다 switch.

예제

다음 예제에서는 다양한 순환 복잡성이 있는 메서드를 보여 줍니다.

순환 복잡성 1

public void Method()
{
    Console.WriteLine("Hello World!");
}
Public Sub Method()
    Console.WriteLine("Hello World!")
End Sub

순환 복잡성 2

void Method(bool condition)
{
    if (condition)
    {
        Console.WriteLine("Hello World!");
    }
}
Public Sub Method(ByVal condition As Boolean)
    If (condition) Then
        Console.WriteLine("Hello World!")
    End If
End Sub

순환 복잡성 3

public void Method(bool condition1, bool condition2)
{
    if (condition1 || condition2)
    {
        Console.WriteLine("Hello World!");
    }
}
Public Sub Method(ByVal condition1 As Boolean, ByVal condition2 As Boolean)
    If (condition1 OrElse condition2) Then
        Console.WriteLine("Hello World!")
    End If
End Sub

순환 복잡성 8

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

CA1501: 상속성을 너무 많이 사용하지 마십시오.

참고 항목