CA1502 : Éviter l'excès de complexité
Propriété | Value |
---|---|
Identificateur de la règle | CA1502 |
Titre | Éviter l'excès de complexité |
Catégorie | Maintenabilité |
Le correctif est cassant ou non cassant | Sans rupture |
Seuil par défaut | 25 |
Activée par défaut dans .NET 9 | Non |
Cause
Une méthode a une complexité cyclomatique excessive.
Description de la règle
La complexité cyclomatique évalue le nombre de chemins linéairement indépendants dans la méthode, déterminé par le nombre et la complexité des branches conditionnelles. Une complexité cyclomatique faible indique généralement une méthode facile à comprendre, à tester et à gérer. La complexité cyclomatique est calculée à partir d’un graphique de flux de contrôle de la méthode et est donnée comme suit :
complexité cyclomatique = nombre de bords - nombre de nœuds + 1
Un nœud représente un point de branche logique et un bord représente une ligne entre les nœuds.
La règle signale une violation lorsque la complexité cyclomatique d’une méthode est supérieure à 25. Toutefois, vous pouvez configurer le seuil et spécifier d’autres types de symboles que la règle doit analyser.
Pour en savoir plus sur les métriques de code, consultez Mesurer la complexité du code managé.
Comment corriger les violations
Pour corriger une violation de cette règle, refactorisez la méthode pour réduire sa complexité cyclomatique.
Quand supprimer les avertissements
Il est sûr de supprimer un avertissement de cette règle si la complexité ne peut pas être facilement réduite et si la méthode est facile à comprendre, à tester et à gérer. En particulier, une méthode qui contient une instruction volumineuse switch
(Select
dans Visual Basic) est une candidate à l’exclusion. Le risque de déstabiliser la base de code à la fin du cycle de développement ou d’introduire un changement inattendu du comportement à l’exécution dans le code précédemment fourni peut l’emporter sur les avantages de la maintenabilité de la refactorisation du code.
Remarque
Vous pouvez voir des avertissements de faux positifs de cette règle si tous les éléments suivants s’appliquent :
- Vous utilisez Visual Studio 2022 version 17.5 ou ultérieure avec une version antérieure du Kit de développement logiciel (SDK) .NET, c’est-à-dire .NET 6 ou version antérieure.
- Vous utilisez les analyseurs du Kit de développement logiciel (SDK) .NET 6 ou d’une version antérieure des packages d’analyseurs, comme Microsoft.CodeAnalysis.FxCopAnalyzers.
Les faux positifs sont dus à un changement cassant dans le compilateur C#. Envisagez d’utiliser un analyseur plus récent qui contient le correctif pour les avertissements faux positifs. Effectuez une mise à niveau vers Microsoft.CodeAnalysis.NetAnalyzers version 7.0.0-préversion1.22464.1 ou ultérieure ou utilisez les analyseurs du Kit de développement logiciel (SDK) .NET 7.
Supprimer un avertissement
Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.
#pragma warning disable CA1502
// The code that's violating the rule is on this line.
#pragma warning restore CA1502
Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none
dans le fichier de configuration.
[*.{cs,vb}]
dotnet_diagnostic.CA1502.severity = none
Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.
Configurer le seuil
Vous pouvez configurer le seuil auquel cette règle se déclenche et les types de symboles à analyser. Les types de symboles autorisés sont les suivants :
Assembly
Namespace
Type
Method
Field
Event
Property
Créez un fichier texte nommé CodeMetricsConfig.txt.
Ajoutez le seuil souhaité au fichier texte au format suivant :
CA1502: 10
Dans cet exemple, la règle est configurée pour se déclencher lorsque la complexité cyclomatique d’une méthode est supérieure à 10.
CA1502(Type): 4
Dans cet exemple, la règle est configurée pour se déclencher lorsque la complexité cyclomatique d’un type est supérieure à 4. Avec ce fichier de config, la règle continue à signaler les méthodes dont la complexité cyclomatique est supérieure à la valeur par défaut (25).
Dans le fichier projet, marquez l’action de génération du fichier config comme AdditionalFiles. Par exemple :
<ItemGroup> <AdditionalFiles Include="CodeMetricsConfig.txt" /> </ItemGroup>
Mode de calcul de la complexité cyclomatique
La complexité cyclomatique est calculée en ajoutant 1 aux éléments suivants :
- Nombre de branches (par exemple
if
,while
etdo
). - Nombre d'instructions
case
dans unswitch
.
Exemples
Les exemples suivants montrent des méthodes qui ont des complexités cyclomatiques variables.
Complexité cyclomatique de 1
public void Method()
{
Console.WriteLine("Hello World!");
}
Public Sub Method()
Console.WriteLine("Hello World!")
End Sub
Complexité cyclomatique de 2
void Method(bool condition)
{
if (condition)
{
Console.WriteLine("Hello World!");
}
}
Public Sub Method(ByVal condition As Boolean)
If (condition) Then
Console.WriteLine("Hello World!")
End If
End Sub
Complexité cyclomatique de 3
public void Method(bool condition1, bool condition2)
{
if (condition1 || condition2)
{
Console.WriteLine("Hello World!");
}
}
Public Sub Method(ByVal condition1 As Boolean, ByVal condition2 As Boolean)
If (condition1 OrElse condition2) Then
Console.WriteLine("Hello World!")
End If
End Sub
Complexité cyclomatique de 8
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;
}
}
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
Règles associées
CA1501 : Éviter l'excès d'héritage