CA1502: Aşırı karmaşıklıktan kaçının

Özellik Değer
Kural Kimliği CA1502
Başlık Aşırı karmaşıklıktan kaçının
Kategori Bakım Kolaylığı
Düzeltme bozucu ya da bozmayan olabilir Kesintisiz
Varsayılan eşik 25
.NET 10'da varsayılan olarak etkin Hayır
Geçerli diller C# ve Visual Basic

Neden

Bir yöntemin aşırı döngüsel karmaşıklığı vardır.

Kural açıklaması

Döngüsel karmaşıklık , koşullu dalların sayısı ve karmaşıklığı tarafından belirlenen yöntem aracılığıyla doğrusal olarak bağımsız yolların sayısını ölçer. Düşük döngüsel karmaşıklık genellikle anlaşılması, test ve bakımı kolay bir yöntemi gösterir. Döngüsel karmaşıklık, yöntemin bir denetim akışı grafiğinden hesaplanır ve aşağıdaki gibi verilir:

döngüsel karmaşıklık = kenar sayısı - düğüm sayısı + 1

Düğüm bir mantıksal dal noktasını, kenar ise düğümler arasındaki bir çizgiyi temsil eder.

Kural, bir yöntemin döngüsel karmaşıklığı 25'ten fazla olduğunda bir ihlal bildirir. Ancak eşiği yapılandırabilir ve kuralın analiz etmesi gereken diğer simge türlerini belirtebilirsiniz.

Kod ölçümleri hakkında daha fazla bilgi için bkz. Yönetilen kodun karmaşıklığını ölçme.

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için döngüsel karmaşıklığını azaltmak için yöntemini yeniden düzenleyin.

Uyarıların ne zaman bastırılması gerekiyor?

Karmaşıklık kolayca azaltılamazsa ve yöntemin anlaşılması, test edilmesi ve bakımı kolaysa, bu kuraldan gelen bir uyarıyı bastırmak güvenlidir. Özellikle, büyük switch (Select Visual Basic'te) deyimi içeren bir yöntem dışlama için bir adaydır. Geliştirme döngüsünün sonlarında kod tabanının istikrarını bozma veya daha önce gönderilen kodda çalışma zamanı davranışında beklenmeyen bir değişiklik yapma riski, kodu yeniden düzenlemenin bakım avantajlarından daha ağır basabilir.

Not

Aşağıdakilerin tümü geçerliyse bu kuraldan hatalı pozitif uyarılar görebilirsiniz:

  • Visual Studio 2022 sürüm 17.5 veya üzerini .NET SDK'nın daha eski bir sürümüyle ( .NET 6 veya önceki bir sürüm) kullanıyorsunuz.
  • .NET 6 SDK'sından çözümleyicileri veya çözümleyici paketlerinin Microsoft.CodeAnalysis.FxCopAnalyzers gibi eski bir sürümünü kullanıyorsunuz.

Hatalı pozitifler, C# derleyicisindeki büyük bir değişiklikten kaynaklanmaktadır. Hatalı pozitif uyarıların düzeltmesini içeren daha yeni bir çözümleyici kullanmayı düşünün. Microsoft.CodeAnalysis.NetAnalyzers sürüm 7.0.0-preview1.22464.1 veya daha yeni bir sürüme yükseltin veya .NET 7 SDK'sından çözümleyicileri kullanın.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

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

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.

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

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Eşiği yapılandır

Bu kuralın tetikleneceği eşiği ve analiz edilecek sembol türlerini yapılandırabilirsiniz. İzin verilebilen simge türleri şunlardır:

  • Assembly
  • Namespace
  • Type
  • Method
  • Field
  • Event
  • Property
  1. CodeMetricsConfig.txt adlı bir metin dosyası oluşturun.

  2. İstenen eşiği metin dosyasına aşağıdaki biçimde ekleyin:

    CA1502: 10
    

    Bu örnekte kural, bir metodun döngüsel karmaşıklığı 10'dan büyük olduğunda tetiklenecek şekilde yapılandırılır.

    CA1502(Type): 4
    

    Bu örnekte kural, bir türün döngüsel karmaşıklığı 4'ten büyük olduğunda tetiklenecek şekilde yapılandırılır. Bu yapılandırma dosyasıyla kural, döngüsel karmaşıklığı varsayılandan (25) büyük olan yöntemleri raporlamaya devam eder.

  3. Proje dosyasında yapılandırma dosyasının derleme eylemini AdditionalFiles olarak işaretleyin. Örneğin:

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

Döngüsel karmaşıklık nasıl hesaplanır?

Döngüsel karmaşıklık, aşağıdakilere 1 eklenerek hesaplanır:

  • Şubelerin sayısı (if, while ve do gibi).
  • switch içindeki case deyimlerinin sayısı.

Örnekler

Aşağıdaki örneklerde, değişen döngüsel karmaşıklıklara sahip yöntemler gösterilmektedir.

1'in döngüsel karmaşıklığı

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

2'nin döngüsel karmaşıklığı

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

3'ün döngüsel karmaşıklığı

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

8'in döngüsel karmaşıklığı

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: Aşırı devralmadan kaçının

Ayrıca bkz.