次の方法で共有


CA1502: メソッドの実装を複雑にしすぎないでください

TypeName

AvoidExcessiveComplexity

CheckId

CA1502

[カテゴリ]

Microsoft.Maintainability

互換性に影響する変更点

なし

原因

メソッドのサイクロマティック複雑度が高すぎます。

規則の説明

サイクロマティック複雑度は、線形独立のメソッド経路数を示す尺度で、条件分岐の数と複雑さによって決まります。メソッドのサイクロマティック複雑度が低い場合、一般に、理解、テスト、保守が容易であることを示します。サイクロマティック複雑度は、メソッドの制御フロー グラフから次のように算出されます。

サイクロマティック複雑度 = "edge" の数 - "node" の数 + 1

ここで、"node" は論理的な分岐ポイントを表し、"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!");
    }
}

サイクロマティック複雑度 8


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

関連規則

CA1501: 継承を使用しすぎないでください

参照

その他の技術情報

マネージ コードの複雑さと保守性の測定