Compartir a través de


CA1502: Evite la excesiva complejidad

Nombre de tipo

AvoidExcessiveComplexity

Identificador de comprobación

CA1502

Categoría

Microsoft.Maintainability

Cambio problemático

Poco problemático

Motivo

Un método tiene una complejidad ciclomática excesiva.

Descripción de la regla

La Complejidad ciclomática mide el número de rutas de acceso independientes de forma lineal a través del método, que es determinado por el número y la complejidad de bifurcaciones condicionales.Una complejidad ciclomática baja generalmente indica un método que es fácil de entender, comprobar y mantener.La complejidad ciclomática se calcula a partir de un gráfico de flujo de control del método y se proporciona como:

complejidad ciclomática = número de bordes - número de nodos + 1

donde un nodo representa un punto de la bifurcación lógica y un borde representa una línea entre los nodos.

La regla notifica una infracción cuando la complejidad ciclomática es mayor de 25.

Puede obtener más información sobre métricas de codigo en Medir la complejidad y el mantenimiento del código administrado.

Cómo corregir infracciones

Para corregir una infracción de esta regla, refactorice el método para reducir su complejidad ciclomática.

Cuándo suprimir advertencias

Es seguro suprimir una advertencia de esta regla si la complejidad no se puede reducir fácilmente y el método es sencillo de entender, comprobar y mantener.En particular, un método que contiene una instrucción switch grande (Select en Visual Basic) es un candidato a la exclusión.El riesgo de desestabilizar el código base al final del ciclo de desarrollo o incluir un cambio no esperado en el comportamiento en tiempo de ejecución en un código previamente distribuido, podría compensar las ventajas de mantenimiento de refactorización del código.

Cómo se calcula la complejidad ciclomática

La complejidad ciclomática se calcula sumando 1 a lo siguiente:

  • Número de bifurcaciones (como if, while y do)

  • El número de instrucciones case en switch

En los ejemplos siguientes se muestran métodos con distintas complejidades ciclomáticas.

Ejemplo

Complejidad ciclomática de 1

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

Complejidad ciclomática 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!"); 
    } 
}

Complejidad 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!");
    }
}

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

Reglas relacionadas

CA1501: Evite una herencia excesiva

Vea también

Otros recursos

Medir la complejidad y el mantenimiento del código administrado