Freigeben über


CA1502: Übermäßige Komplexität vermeiden

TypeName

AvoidExcessiveComplexity

CheckId

CA1502

Kategorie

Microsoft.Maintainability

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Eine Methode verfügt über eine übermäßige zyklomatische Komplexität.

Regelbeschreibung

Die zyklomatische Komplexität ermöglicht Aussagen über die Anzahl linear unabhängiger Pfade in einer Methode, wobei die Anzahl der Pfade durch die Anzahl und Komplexität bedingter Verzweigungen bestimmt wird. Eine niedrige zyklomatische Komplexität weist im Allgemeinen auf eine Methode hin, die einfach zu verstehen, zu testen und zu pflegen ist. Die zyklomatische Komplexität wird aus einem Ablaufsteuerungsdiagramm der Methode berechnet und als

zyklomatische Komplexität = Anzahl der Kanten - Anzahl der Knoten + 1

angegeben, wobei ein Knoten (node) einen Logikverzweigungspunkt und eine Kante (edge) eine Linie zwischen Knoten darstellt.

Von der Regel wird ein Verstoß gemeldet, wenn die zyklomatische Komplexität über dem Wert 25 liegt.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, gestalten Sie die Methode um, da sich dadurch ihre zyklomatische Komplexität verringert.

Wann sollten Warnungen unterdrückt werden?

Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn sich die Komplexität nur schwerlich verringern lässt und die Methode einfach zu verstehen, zu testen und zu warten ist. Insbesondere Methoden, die eine umfangreiche switch-Anweisung (bzw. Select-Anweisung in Visual Basic) enthalten, eignen sich potenziell für Ausschlüsse. Das Risiko, die CodeBase in einem späten Stadium des Entwicklungszyklus zu destabilisieren oder das Laufzeitverhalten von bereits ausgeliefertem Code in unvorhergesehener Weise zu ändern, kann die Vorteile hinsichtlich der Codepflege zunichte machen, die eine Umgestaltung des Codes bietet.

Wie zyklomatische Komplexität berechnet wird

Die zyklomatische Komplexität wird berechnet, indem zu folgendem Wert 1 addiert wird:

  • Anzahl der Verzweigungen (z. B. if, while und do)

  • Anzahl von case-Anweisungen in einem switch

In den folgenden Beispielen werden Methoden mit unterschiedlichen zyklomatischen Komplexitäten veranschaulicht.

Beispiel

Zyklomatische Komplexität 1

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

Zyklomatische Komplexität 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!"); 
    } 
}

Zyklomatische Komplexität 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!");
    }
}

Zyklomatische Komplexität 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;
    }
}

Verwandte Regeln

CA1501: Übermäßige Vererbung vermeiden