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
Maak een tekstbestand met de naam CodeMetricsConfig.txt.
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).
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
,while
endo
). - Het aantal
case
instructies in eenswitch
.
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
Gerelateerde regels
CA1501: Vermijd overmatige overname