Compartilhar via


CA1502: Evitar complexidade excessiva

Property Valor
ID da regra CA1502
Título Evitar complexidade excessiva
Categoria Facilidade de manutenção
Correção interruptiva ou sem interrupção Sem interrupção
Limite padrão 25
Habilitado por padrão no .NET 8 Não

Causa

Um método tem uma complexidade ciclomática excessiva.

Descrição da regra

A Complexidade ciclomática mede o número de caminhos linearmente independentes por meio do método, o que é determinado pelo número e pela complexidade das ramificações condicionais. Uma complexidade ciclomática baixa geralmente indica um método fácil de entender, testar e manter. A complexidade ciclomática é calculada a partir de um grafo de fluxo de controle do método e é fornecida da seguinte maneira:

complexidade ciclomática = o número de bordas - o número de nós + 1

Um representa um ponto de ramificação lógico e uma borda representa uma linha entre nós.

A regra relata uma violação quando a complexidade ciclomática de um método é maior que 25. No entanto, você pode configurar o limite e também especificar outros tipos de símbolos que a regra deve analisar.

Saiba mais sobre as métricas de código em Como medir a complexidade do código gerenciado.

Como corrigir violações

Para corrigir uma violação dessa regra, refatore o método para reduzir sua complexidade ciclomática.

Quando suprimir avisos

É seguro suprimir um aviso dessa regra se a complexidade não puder ser facilmente reduzida e o método for fácil de entender, testar e manter. Em particular, um método que contém uma instrução switch grande (Select no Visual Basic) é um candidato à exclusão. O risco de desestabilizar a base do código no final do ciclo de desenvolvimento ou introduzir uma alteração inesperada no comportamento de tempo de execução no código enviado anteriormente pode superar os benefícios de manutenção da refatoração do código.

Observação

Você pode ver avisos de falsos positivos desta regra se todos os itens a seguir se aplicarem:

  • Você está usando o Visual Studio 2022 versão 17.5 ou posterior com uma versão mais antiga do SDK do .NET, ou seja, .NET 6 ou anterior.
  • Você está usando os analisadores do SDK do .NET 6 ou uma versão mais antiga dos pacotes do analisador, como Microsoft. CodeAnalysis.FxCopAnalyzers.

Os falsos positivos são devido a uma alteração interruptiva no compilador de C#. Considere usar um analisador mais recente que contenha a correção para os avisos de falsos positivos. Atualize para Microsoft. CodeAnalysis.NetAnalyzers versão 7.0.0-preview1.22464.1 ou mais recente, ou use os analisadores do SDK do .NET 7.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

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

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

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

Para obter mais informações, confira Como suprimir avisos de análise de código.

Configurar limite

Você pode configurar o limite no qual essa regra é acionada e os tipos de símbolos que serão analisados. Os tipos de símbolo permitidos são:

  • Assembly
  • Namespace
  • Type
  • Method
  • Field
  • Event
  • Property
  1. Crie um arquivo de texto chamado CodeMetricsConfig.txt.

  2. Adicione o limite desejado ao arquivo de texto no seguinte formato:

    CA1502: 10
    

    Neste exemplo, a regra está configurada para ser acionada quando a complexidade ciclomática de um método é maior que 10.

    CA1502(Type): 4
    

    Neste exemplo, a regra está configurada para ser acionada quando a complexidade ciclomática de um tipo é maior que 4. Com esse arquivo de configuração, a regra continuaria a relatar métodos com uma complexidade ciclomática maior que o padrão (25).

  3. No arquivo de projeto, marque a ação de compilação do arquivo de configuração como AdditionalFiles. Por exemplo:

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

Como a complexidade ciclomática é calculada

A complexidade ciclomática é calculada adicionando 1 ao seguinte:

  • O número de ramificações (como if, while e do).
  • O número de instruções case em um switch.

Exemplos

Os exemplos a seguir mostram métodos que têm complexidades ciclomáticas variadas.

Complexidade ciclomática de 1

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

Complexidade ciclomática de 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

Complexidade ciclomática de 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

Complexidade ciclomática de 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: Evitar herança excessiva

Confira também