CA1502: Hindari kerumitan yang berlebihan

Properti Nilai
ID Aturan CA1502
Judul Hindari kompleksitas yang berlebihan
Kategori Kemampu
Perbaikan bersifat merusak atau tidak merusak Tidak terputus
Ambang batas bawaan 25
Diaktifkan secara default di .NET 10 Tidak
Bahasa yang berlaku C# dan Visual Basic

Penyebab

Metode memiliki kompleksitas siklomatik yang berlebihan.

Deskripsi aturan

Kompleksitas siklomatik mengukur jumlah jalur yang independen secara linier melalui metode , yang ditentukan oleh jumlah dan kompleksitas cabang bersyarkat. Kompleksitas cyclomatic yang rendah umumnya menunjukkan metode yang mudah dipahami, diuji, dan dipertahankan. Kompleksitas siklomatik dihitung dari bagan alir kontrol metode dan ditentukan sebagai berikut:

kompleksitas siklomatik = jumlah tepi - jumlah simpul + 1

Simpul mewakili titik cabang logika dan tepi mewakili garis di antara simpul.

Aturan melaporkan pelanggaran ketika kompleksitas siklomatik metode lebih dari 25. Namun, Anda dapat mengonfigurasi ambang batas dan juga menentukan jenis simbol lain yang harus dianalisis aturan.

Anda dapat mempelajari selengkapnya tentang metrik kode di Mengukur kompleksitas kode terkelola.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini, memfaktorkan ulang metode untuk mengurangi kompleksitas siklomatiknya.

Kapan harus menekan peringatan

Aman untuk menekan peringatan dari aturan ini jika kompleksitas tidak dapat dengan mudah dikurangi dan metode ini mudah dipahami, diuji, dan dipertahankan. Secara khusus, metode yang berisi pernyataan besar switch (Select dalam Visual Basic) adalah kandidat untuk pengecualian. Risiko destabilisasi basis kode terlambat dalam siklus pengembangan atau memperkenalkan perubahan perilaku runtime yang tidak terduga dalam kode yang dikirim sebelumnya mungkin melebihi manfaat pemeliharaan dari pemfaktoran ulang kode.

Catatan

Anda mungkin melihat peringatan positif palsu dari aturan ini jika semua hal berikut ini berlaku:

  • Anda menggunakan Visual Studio 2022 versi 17.5 atau yang lebih baru dengan versi .NET SDK yang lebih lama, yaitu, .NET 6 atau yang lebih lama.
  • Anda menggunakan penganalisis dari .NET 6 SDK atau versi paket penganalisis yang lebih lama, seperti Microsoft.CodeAnalysis.FxCopAnalyzers.

Positif palsu disebabkan oleh perubahan besar dalam kompiler C#. Pertimbangkan untuk menggunakan penganalisis yang lebih baru yang berisi perbaikan untuk peringatan positif palsu. Tingkatkan ke Microsoft.CodeAnalysis.NetAnalyzers versi 7.0.0-preview1.22464.1 atau yang lebih baru atau gunakan penganalisis dari .NET 7 SDK.

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

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

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

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

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Mengonfigurasi ambang batas

Anda dapat mengonfigurasi ambang di mana aturan ini diaktifkan dan jenis simbol untuk dianalisis. Jenis simbol yang diizinkan adalah:

  • Assembly
  • Namespace
  • Type
  • Method
  • Field
  • Event
  • Property
  1. Buat file teks bernama CodeMetricsConfig.txt.

  2. Tambahkan ambang yang diinginkan ke file teks dalam format berikut:

    CA1502: 10
    

    Dalam contoh ini, aturan dikonfigurasi untuk diaktifkan ketika kompleksitas siklomatik suatu metode lebih dari 10.

    CA1502(Type): 4
    

    Dalam contoh ini, aturan dikonfigurasi untuk diaktifkan ketika kompleksitas siklomatik suatu jenis lebih besar dari 4. Dengan file konfigurasi ini, aturan akan terus melaporkan metode dengan kompleksitas siklomatik yang lebih besar dari default (25).

  3. Dalam file proyek, tandai aksi build untuk file konfigurasi sebagai AdditionalFiles. Contohnya:

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

Bagaimana kompleksitas siklomatik dihitung

Kompleksitas siklomatik dihitung dengan menambahkan 1 ke yang berikut:

  • Jumlah cabang (seperti if, , whiledan do).
  • Jumlah pernyataan case dalam switch.

Contoh

Contoh berikut menunjukkan metode yang memiliki berbagai kompleksitas siklomatik.

Kompleksitas siklomatik dari 1

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

Kompleksitas Siklomatik bernilai 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

Kompleksitas siklomatik dengan nilai 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

Kompleksitas siklomatik sebanyak 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: Hindari warisan yang berlebihan

Lihat juga