Partager via


Éviter l'excès de complexité

Mise à jour : novembre 2007

TypeName

AvoidExcessiveComplexity

CheckId

CA1502

Catégorie

Microsoft.Maintainability

Modification avec rupture

Modification sans rupture

Cause

Une méthode affiche une complexité cyclomatic excessive.

Description de la règle

La complexité cyclomatic mesure le nombre de chemins linéairement indépendants à travers la méthode, déterminé par le nombre et la complexité des branches conditionnelles. Une complexité cyclomatic basse indique généralement une méthode facile de comprendre, à tester et à gérer. La complexité cyclomatic est calculée à partir d'un graphique de flux de contrôle de la méthode et est fournie comme suit :

complexité cyclomatic = nombre de bords - nombre de nœuds + 1

où un nœud représente un point de branche logique et un bord une ligne entre des nœuds.

La règle signale une violation quand la complexité cyclomatic est supérieure à 25.

Comment corriger les violations

Pour corriger une violation de cette règle, refactorisez la méthode pour diminuer sa complexité cyclomatic.

Quand supprimer les avertissements

Il est possible de supprimer sans risque un avertissement de cette règle si la complexité est difficile à réduire et si la méthode est facile à comprendre, à tester et à gérer. En particulier, une méthode qui contient une instruction switch (Select en Visual Basic) de grande envergure est candidate à l'exclusion. Le risque de déstabiliser la base de code à un point avancé du cycle de développement ou d'introduire un changement inattendu dans le comportement au moment de l'exécution d'un code précédemment expédié peut compenser les avantages conférés en termes de facilité de maintenance par la refactorisation du code.

Mode de calcul de la complexité cyclomatic

Fondamentalement, la complexité cyclomatic est calculée en ajoutant 1 aux éléments suivants :

  • Nombre de branches (par exemple if, while et do)

  • Nombre d'instructions case dans un switch

Les exemples suivants affichent des méthodes avec diverses complexités cyclomatic.

Exemple

Complexité cyclomatic 1

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

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

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

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

Règles connexes

Éviter l'héritage excessif