Partilhar via


CA1502: Evitar excessiva complexidade

TypeName

AvoidExcessiveComplexity

CheckId

CA1502

Category (Categoria)

Microsoft.Maintainability

Alteração significativa

Não-separável

Causa

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

Descrição da regra

Complexidade ciclomática mede o número de caminhos linearmente independentes através do método que é determinado pelo número e 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 gráfico de fluxo de controle do método e é dada como segue:

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

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

A regra reporta uma violação quando a complexidade ciclomática é mais de 25.

Você pode aprender mais sobre métricas de código em Medir a complexidade e à manutenção do código gerenciado,

Como corrigir violações

Para corrigir uma violação desta regra, refatorar o método para reduzir a complexidade ciclomática.

Quando suprimir avisos

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

Como a complexidade ciclomática é calculada

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

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

  • Número de case as instruções em umswitch

Os exemplos a seguir mostram os métodos que possuem variados complexidade ciclomática.

Exemplo

Complexidade ciclomática 1

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

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

Consulte também

Outros recursos

Medir a complexidade e à manutenção do código gerenciado