CA1502: A túlzott összetettség elkerülése
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA1502 |
Cím | A túlzott összetettség elkerülése |
Kategória | Fenntarthatóság |
A javítás kompatibilitástörő vagy nem törik | Nem törés |
Alapértelmezett küszöbérték | 25 |
Alapértelmezés szerint engedélyezve a .NET 8-ban | Nem |
Ok
A metódusok túl sok ciklonos összetettséggel rendelkezik.
Szabály leírása
A ciklonmatikus összetettség a módszer lineárisan független útvonalainak számát méri, amelyet a feltételes ágak száma és összetettsége határoz meg. Az alacsony ciklonos összetettség általában egy könnyen érthető, tesztelhető és karbantartható módszert jelez. A ciklonmatikus összetettség kiszámítása a módszer vezérlőfolyamat-gráfjából történik, és a következőképpen történik:
ciklonmatikus összetettség = az élek száma - a csomópontok száma + 1
A csomópontok egy logikai ágpontot, az él pedig a csomópontok közötti vonalat jelölik.
A szabály szabálysértést jelez, ha egy metódus ciklonmatikus összetettsége meghaladja a 25-öt. Konfigurálhatja azonban a küszöbértéket , és más típusú szimbólumokat is megadhat, amelyeket a szabálynak elemeznie kell.
A kódmetrikákról a felügyelt kód mértékkomplexitása című témakörben olvashat bővebben.
Szabálysértések kijavítása
A szabály megsértésének kijavításához újrabontással csökkentse a ciklonos összetettségét.
Mikor kell letiltani a figyelmeztetéseket?
Ha az összetettség nem csökkenthető egyszerűen, és a módszer könnyen érthető, tesztelhető és karbantartható, nyugodtan mellőzhető a szabály figyelmeztetése. A nagy switch
(Select
Visual Basic-ben) utasítást tartalmazó metódus különösen kizárási jelölt. A kódbázis fejlesztési ciklus végén történő destabilizálásának vagy a futásidejű viselkedés váratlan megváltoztatásának kockázata a korábban kiszállított kódban meghaladja a kód újrabontásának karbantarthatósági előnyeit.
Megjegyzés:
Ha az alábbiak mindegyike érvényes, a szabály tévesen pozitív figyelmeztetéseket jeleníthet meg:
- A Visual Studio 2022 17.5-ös vagy újabb verzióját használja a .NET SDK egy régebbi verziójával, vagyis a .NET 6-os vagy korábbi verziójával.
- A .NET 6 SDK-ból származó elemzőket vagy az elemzőcsomagok egy régebbi verzióját használja, például a Microsoft.CodeAnalysis.FxCopAnalyzerst.
A hamis pozitív értékek a C#-fordító kompatibilitástörő változásának köszönhetők. Fontolja meg egy újabb elemző használatát, amely tartalmazza a hamis pozitív figyelmeztetések javítását. Frissítsen a Microsoft.CodeAnalysis.NetAnalyzers 7.0.0-preview1.22464.1-es vagy újabb verziójára, vagy használja a .NET 7 SDK elemzőit.
Figyelmeztetés mellőzése
Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.
#pragma warning disable CA1502
// The code that's violating the rule is on this line.
#pragma warning restore CA1502
Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none
a konfigurációs fájlban.
[*.{cs,vb}]
dotnet_diagnostic.CA1502.severity = none
További információ: Kódelemzési figyelmeztetések letiltása.
Küszöbérték konfigurálása
Konfigurálhatja azt a küszöbértéket, amelynél ez a szabály aktiválódik, és az elemezendő szimbólumok típusait. A megengedett szimbólumtípusok a következők:
Assembly
Namespace
Type
Method
Field
Event
Property
Hozzon létre egy CodeMetricsConfig.txt nevű szövegfájlt.
Adja hozzá a kívánt küszöbértéket a szövegfájlhoz a következő formátumban:
CA1502: 10
Ebben a példában a szabály úgy van konfigurálva, hogy aktiválódjon, ha egy metódus ciklonmatikus összetettsége nagyobb, mint 10.
CA1502(Type): 4
Ebben a példában a szabály úgy van konfigurálva, hogy aktiválja, ha egy típus ciklonmatikus összetettsége nagyobb, mint 4. Ezzel a konfigurációs fájllal a szabály továbbra is az alapértelmezettnél (25) nagyobb ciklonmatikus összetettségű metódusokat jelent.
A projektfájlban jelölje meg a konfigurációs fájl buildelési műveletét AdditionalFilesként. Például:
<ItemGroup> <AdditionalFiles Include="CodeMetricsConfig.txt" /> </ItemGroup>
A ciklonmatikus összetettség kiszámítása
A ciklonmatikus összetettség kiszámítása úgy történik, hogy 1-et ad hozzá az alábbiakhoz:
- Az ágak száma (például
if
: ,while
ésdo
). - Az utasítások száma
case
egyswitch
.
Példák
Az alábbi példák különböző ciklonmatikus összetettségű módszereket mutatnak be.
Az 1 ciklonmatikus összetettsége
public void Method()
{
Console.WriteLine("Hello World!");
}
Public Sub Method()
Console.WriteLine("Hello World!")
End Sub
A 2 ciklonmatikus összetettsége
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
A 3 ciklonmatikus összetettsége
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
A 8 ciklonmatikus összetettsége
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
Kapcsolódó szabályok
CA1501: A túlzott öröklés elkerülése
Kapcsolódó információk
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: