Sdílet prostřednictvím


CA1502: Vyhněte se nadměrné složitosti

Název_typu

AvoidExcessiveComplexity

CheckId

CA1502

Kategorie

Microsoft.Maintainability

Změnit rozdělení

Bez rozdělení

Příčina

Metoda má nadměrnému cyclomatic složitost.

Popis pravidla

Složitost Cyclomatic opatření, Lineárně nezávislé cesty pomocí metody závisí na počtu a složitosti podmínkových větví.Nízká cyclomatic složitost obecně označuje metodu, která je snadno pochopit, testovat a udržovat.Složitost cyclomatic se vypočte z grafu toku řízení metody a je uveden takto:

složitost cyclomatic = počet hran - počet uzlů + 1

Pokud uzel představuje rozvětvení logiku a okraj představuje řádek mezi uzly.

Pravidlo hlásí narušení složitost cyclomatic po více než 25.

Další informace o kódu metriky v Měření složitosti a udržovatelnosti spravovaného kódu,

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla refactor metoda snížit složitost jeho cyclomatic.

Při potlačení upozornění

Je bezpečné, pokud nelze snadno snížit složitost a snadno pochopit, testovat a udržovat je metoda potlačí upozornění od tohoto pravidla.Zejména metodu, která obsahuje rozsáhlou switch (Select v Visual Basic) je prohlášení kandidáta pro vyloučení.Riziko destabilizing kód základní pozdě v cyklu vývoje nebo zavádění neočekávané změny v chování za běhu kódu dříve dodané pravděpodobně převažují výhody požadavky na servis kód optimalizace struktury programu.

Způsob výpočtu složitost Cyclomatic

Složitost cyclomatic se vypočte přidáním 1 následující:

  • Počet poboček (například if, while, a do)

  • Počet case v prohlášeníswitch

Následující příklady ukazují metody, které mají různé složitosti cyclomatic.

Příklad

Složitost Cyclomatic 1

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

Složitost Cyclomatic 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!"); 
    } 
}

Složitost Cyclomatic 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!");
    }
}

Složitost Cyclomatic 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;
    }
}

Souvisejících pravidel

CA1501: Vyhněte se nadměrné dědičnosti

Viz také

Další zdroje

Měření složitosti a udržovatelnosti spravovaného kódu