Partilhar via


CA1502: evitar complexidade excessiva

TypeName

AvoidExcessiveComplexity

CheckId

CA1502

Categoria

Microsoft.Maintainability

Alteração Significativa

Sem quebra

Causa

Um método tem uma complexidade cyclomatic excessiva.

Descrição da Regra

A complexidade de Cyclomatic ultrapassar o número de caminhos linear independentes com o método, que é determinado pelo número e a complexidade das ramificações anteriores.Uma baixa complexidade cyclomatic normalmente indica um método que seja fácil de entender, teste, e manter.A complexidade cyclomatic é calculada de um gráfico de fluxo de controle do método e determinada como segue:

complexidade cyclomatic = o número de bordas - o número de nós + 1

onde um nó representa um ponto de ramificação de lógica e uma borda representam uma linha entre dois nós.

A regra relata uma violação quando a complexidade cyclomatic for maior que 25.

Você pode saber mais sobre a métrica de código em Medindo complexidade e facilidade de manutenção do código gerenciado,

Como Corrigir Violações

Para corrigir uma violação desta regra, refactor o método para reduzir a complexidade cyclomatic.

Quando Suprimir Alertas

É seguro suprimir um aviso dessa regra se a complexidade não pode ser facilmente reduzida e o método é fácil de entender, teste, e manter.Em particular, um método que contém uma grande instrução de switch (Select em Visual Basic) é um candidato para exclusão.O risco de desestabilizar a base de código tarde no ciclo de desenvolvimento ou de introduzir inesperadamente uma alteração no comportamento de tempo de execução no código fornecido anteriormente pode aumentar os benefícios de manutenibilidade de refactoring o código.

Como a complexidade de Cyclomatic é calculada

A complexidade cyclomatic é calculada somando-se 1 ao seguinte:

  • Número de ramificações (como if, while, e do)

  • Número de instruções case em switch

Os seguintes métodos de apresentação dos exemplos que têm complexidades cyclomatic de negócio.

Exemplo

Complexidade de Cyclomatic de 1

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

Complexidade de Cyclomatic de 2

Public Sub Method(ByVal condition As Boolean)
    If (condition) Then
        Console.WriteLine("Hello World!")
    End If 
End Sub
void Method(bool condition)
{
    if (condition)
    {
        Console.WriteLine("Hello World!");
    }
}
void Method(bool condition)
{ 
  if (condition)
    { 
        Console::WriteLine("Hello World!"); 
    } 
}

Complexidade de Cyclomatic de 3

Public Sub Method(ByVal condition1 As Boolean, ByVal condition2 As Boolean)
    If (condition1 OrElse condition2) Then
        Console.WriteLine("Hello World!")
    End If 
End Sub
public void Method(bool condition1, bool condition2)
{
    if (condition1 || condition2)
    {
        Console.WriteLine("Hello World!");
    }
}
void Method(bool condition1, bool condition2)
{
    if (condition1 || condition2)
    {
        Console::WriteLine("Hello World!");
    }
}

Complexidade de Cyclomatic de 8

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
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;
        }
    }

}
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;
    }
}

Regras Relacionadas

CA1501: evitar herança excessiva

Consulte também

Outros recursos

Medindo complexidade e facilidade de manutenção do código gerenciado