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
Crie um arquivo de texto chamado CodeMetricsConfig.txt.
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).
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
,while
edo
). - O número de
case
instruções em umswitch
arquivo .
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
Regras conexas
CA1501: Evite herança excessiva