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