Evitar excesso de complexidade

TypeName

AvoidExcessiveComplexity

CheckId

CA1502

Category (Categoria)

Microsoft.Maintainability

Quebrando alterar

Não separável

Causa

Um método tem uma complexidade cyclomatic excessiva.

Descrição da regra

Complexidade Cyclomatic mede o número de caminhos independentes linearmente através do método, que é determinado pelo número e pela complexidade das ramificações condicionais.Um cyclomatic baixa complexidade geralmente indica um método fácil de entender, testar e manter.A complexidade cyclomatic é calculada a partir de um gráfico de fluxo de controle do método e recebe a seguinte:

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

onde um nó representa um ponto de lógica de filial e uma borda representa uma linha entre os nós.

A regra reporta uma violação quando a complexidade cyclomatic é superior a 25.

Como corrigir violações

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

Quando suprimir avisos

É seguro eliminar um aviso essa regra se com com facilidade 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 um grande switch (Select no Visual Basic) demonstrativo é um candidato para exclusão. O risco de desestabilizar a base no final do ciclo de desenvolvimento de código ou introduzir uma alterar inesperada no comportamento em tempo de execução no código fornecido anteriormente pode superam os benefícios de facilidade de manutenção de refatoração do código.

Como é calculada Cyclomatic complexidade

Basicamente, a complexidade cyclomatic é calculada ao adicionar 1 à seguinte:

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

  • Número de case declarações dentro de um switch

Os exemplos a seguir mostram métodos com diversos cyclomatic complexidades.

Exemplo

Complexidade Cyclomatic 1

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

Complexidade Cyclomatic 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 Cyclomatic 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 Cyclomatic 4

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

Evitar a herança excessiva