Partilhar via


CA1502: Evite complexidade excessiva

Propriedade valor
ID da regra CA1502
Cargo Evite complexidade excessiva
Categoria Manutenibilidade
A correção está quebrando ou não quebrando Sem quebra
Limiar por defeito 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 através do método, que é determinado pelo número e complexidade de ramos condicionais. Uma baixa complexidade ciclomática geralmente indica um método fácil de entender, testar e manter. A complexidade ciclomática é calculada a partir de um fluxograma de controlo do método e é dada do seguinte modo:

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

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

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

Você pode saber mais sobre métricas de código em 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 grande switch (Select no Visual Basic) é um candidato para exclusão. O risco de desestabilizar a base de código no final do ciclo de desenvolvimento ou introduzir uma alteração inesperada no comportamento em tempo de execução no código enviado anteriormente pode superar os benefícios de manutenção da refatoração do código.

Nota

Poderá ver avisos falsos positivos desta regra se se aplicarem todas as seguintes condições:

  • 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 devidos a uma mudança de quebra no compilador C#. Considere o uso de 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

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar 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 de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

Para obter mais informações, consulte 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 a serem analisados. Os tipos de símbolos 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 é configurada para ser acionada quando a complexidade ciclomática de um método é maior que 10.

    CA1502(Type): 4
    

    Neste exemplo, a regra é 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 do 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 filiais (como if, whilee do).
  • O número de case instruções em um switcharquivo .

Exemplos

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

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: Evite herança excessiva

Consulte também