Udostępnij za pośrednictwem


CA1502: Unikaj nadmiernej złożoności

TypeName

AvoidExcessiveComplexity

CheckId

CA1502

Kategoria

Microsoft.Maintainability

Zmiana kluczowa

Niekluczowa

Przyczyna

Metoda ma nadmierną złożoność cyklomatyczną.

Opis reguły

Złożoność cyklomatyczna mierzy liczbę liniowo niezależnych ścieżek za pomocą metody, która jest określona przez liczbę i złożoność warunkowych rozgałęzień.Niska złożoność cyklomatyczna zazwyczaj wskazuje metodę, łatwą do zrozumienia, przetestowania i utrzymania.Złożoność cyklomatyczna jest obliczana z wykresu przepływ sterowania metody, w następujący sposób:

złożoność cyklomatyczna = liczba krawędzi - liczba węzłów + 1

gdy węzeł reprezentuje rozgałęzienie logiki, a krawędzie reprezentują linie między węzłami.

Reguła zgłasza naruszenie, gdy złożoność cyklomatyczna jest większa niż 25.

Dowiedz się więcej o metrykach kodu na Mierzenie złożoności i łatwości konserwacji zarządzanego kodu,

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, refaktoryzuj metodę, aby zmniejszyć jej złożoność cyklomatyczną.

Kiedy pominąć ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie od tej reguły, jeśli nie można łatwo zmniejszyć złożoności i metoda jest łatwa do zrozumienia, przetestowania i utrzymania.W szczególności metoda, która zawiera dużą instrukcję switch (Select w Visual Basic) jest kandydatem do wykluczenia.Ryzyko późniejszej destabilizacji podstawowego kodu w cyklu wytwarzania, lub wprowadzenie nieoczekiwanej zmiany w zachowaniu w czasie wykonywania we wcześniej dostarczonym kodzie, może przeważyć korzyści łatwości konserwacji nad refaktoryzacją kodu.

Sposób obliczania złożoności cyklomatycznej

Złożoność cyklomatyczna jest obliczana przez dodanie 1 do następujących:

  • Liczba gałęzi (takich jak if, while i do)

  • Liczba instrukcji case w switch

Następujące przykłady przedstawiają metody, które mają różną złożoność cyklomatyczną.

Przykład

Złożoność cyklomatyczna 1

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

Złożoność cyklomatyczna 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!"); 
    } 
}

Złożoność cyklomatyczna 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!");
    }
}

Złożoność cyklomatyczna 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;
    }
}

Powiązane reguły

CA1501: Unikaj nadmiernego dziedziczenia

Zobacz też

Inne zasoby

Mierzenie złożoności i łatwości konserwacji zarządzanego kodu