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é par défaut dans .NET 8 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
  1. Créez un fichier texte nommé CodeMetricsConfig.txt.

  2. 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).

  3. 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 et do).
  • Nombre d'instructions case dans un switch.

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

CA1501 : Éviter l'excès d'héritage

Voir aussi