Share via


CA1502: Vermijd overmatige complexiteit

Eigenschappen Weergegeven als
Regel-id CA1502
Titel Vermijd overmatige complexiteit
Categorie Onderhoudbaarheid
Oplossing is brekend of niet-brekend Niet-brekend
Standaarddrempelwaarde 25
Standaard ingeschakeld in .NET 9 Nee

Oorzaak

Een methode heeft een overmatige cyclomatische complexiteit.

Beschrijving van regel

Cyclomatische complexiteit meet het aantal lineair onafhankelijke paden via de methode, die wordt bepaald door het aantal en de complexiteit van voorwaardelijke vertakkingen. Een lage cyclomatische complexiteit geeft over het algemeen een methode aan die gemakkelijk te begrijpen, te testen en te onderhouden is. De cyclomatische complexiteit wordt berekend op basis van een controlestroomdiagram van de methode en wordt als volgt gegeven:

cyclomatische complexiteit = het aantal randen - het aantal knooppunten + 1

Een knooppunt vertegenwoordigt een logisch vertakkingspunt en een rand vertegenwoordigt een lijn tussen knooppunten.

De regel meldt een schending wanneer de cyclomatische complexiteit van een methode meer dan 25 is. U kunt de drempelwaarde echter configureren en ook andere soorten symbolen opgeven die door de regel moeten worden geanalyseerd.

Meer informatie over metrische codegegevens vindt u in De complexiteit van beheerde code meten.

Schendingen oplossen

Als u een schending van deze regel wilt oplossen, herstructureert u de methode om de cyclomatische complexiteit te verminderen.

Wanneer waarschuwingen onderdrukken

Het is veilig om een waarschuwing van deze regel te onderdrukken als de complexiteit niet eenvoudig kan worden verminderd en de methode gemakkelijk te begrijpen, te testen en te onderhouden is. Een methode die een grote switch instructie (Select in Visual Basic) bevat, is met name een kandidaat voor uitsluiting. Het risico dat de codebasis te laat in de ontwikkelingscyclus wordt gedestabiliseerd of dat er een onverwachte wijziging in het uitvoeringsgedrag in eerder verzonden code opweegt tegen de onderhoudbaarheidsvoordelen van het herstructureren van de code.

Notitie

U ziet mogelijk fout-positieve waarschuwingen van deze regel als alle volgende van toepassing zijn:

  • U gebruikt Visual Studio 2022 versie 17.5 of hoger met een oudere versie van de .NET SDK, dat wil zeggen .NET 6 of eerder.
  • U gebruikt de analyses van de .NET 6 SDK of een oudere versie van de analysepakketten, zoals Microsoft.CodeAnalysis.FxCopAnalyzers.

De fout-positieven zijn te wijten aan een wijziging die fouten veroorzaakt in de C#-compiler. Overweeg om een nieuwere analyse te gebruiken die de oplossing voor de fout-positieve waarschuwingen bevat. Voer een upgrade uit naar Microsoft.CodeAnalysis.NetAnalyzers versie 7.0.0-preview1.22464.1 of hoger of gebruik de analyses van de .NET 7 SDK.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

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

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Drempelwaarde configureren

U kunt de drempelwaarde configureren waarop deze regel wordt geactiveerd en de soorten symbolen die moeten worden geanalyseerd. De toegestane symbooltypen zijn:

  • Assembly
  • Namespace
  • Type
  • Method
  • Field
  • Event
  • Property
  1. Maak een tekstbestand met de naam CodeMetricsConfig.txt.

  2. Voeg de gewenste drempelwaarde toe aan het tekstbestand in de volgende indeling:

    CA1502: 10
    

    In dit voorbeeld is de regel zo geconfigureerd dat deze wordt geactiveerd wanneer de cyclomatische complexiteit van een methode groter is dan 10.

    CA1502(Type): 4
    

    In dit voorbeeld is de regel zo geconfigureerd dat deze wordt geactiveerd wanneer de cyclomatische complexiteit van een type groter is dan 4. Met dit configuratiebestand blijft de regel methoden rapporteren met een cyclomatische complexiteit die groter is dan de standaardinstelling (25).

  3. Markeer in het projectbestand de buildactie van het configuratiebestand als AdditionalFiles. Voorbeeld:

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

Hoe cyclomatische complexiteit wordt berekend

De cyclomatische complexiteit wordt berekend door 1 toe te voegen aan het volgende:

  • Het aantal vertakkingen (zoals if, whileen do).
  • Het aantal case instructies in een switch.

Voorbeelden

In de volgende voorbeelden ziet u methoden met verschillende cyclomatische complexiteiten.

Cyclomatische complexiteit van 1

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

Cyclomatische complexiteit van 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

Cyclomatische complexiteit van 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

Cyclomatische complexiteit van 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: Vermijd overmatige overname

Zie ook