CA1502 : Éviter l'excès de complexitéCA1502: Avoid excessive complexity

TypeNameTypeName AvoidExcessiveComplexityAvoidExcessiveComplexity
CheckIdCheckId CA1502CA1502
CategoryCategory Microsoft.MaintainabilityMicrosoft.Maintainability
Modification avec ruptureBreaking Change Sans ruptureNon-breaking

CauseCause

Une méthode a une complexité cyclomatique excessive.A method has an excessive cyclomatic complexity.

Description de la règleRule Description

La complexité cyclomatique mesure le nombre de chemins linéairement indépendants dans la méthode, qui est déterminé par le nombre et la complexité des branches conditionnelles.Cyclomatic complexity measures the number of linearly independent paths through the method, which is determined by the number and complexity of conditional branches. Une complexité cyclomatique basse indique généralement une méthode facile à comprendre, à tester et à gérer.A low cyclomatic complexity generally indicates a method that is easy to understand, test, and maintain. La complexité cyclomatique est calculée à partir d’un graphique de flux de contrôle de la méthode et est fournie comme suit :The cyclomatic complexity is calculated from a control flow graph of the method and is given as follows:

la complexité cyclomatique = nombre de bords - le nombre de nœuds + 1cyclomatic complexity = the number of edges - the number of nodes + 1

où un nœud représente un point de branchement logique et un bord une ligne entre les nœuds.where a node represents a logic branch point and an edge represents a line between nodes.

La règle signale une violation lorsque la complexité cyclomatique est supérieure à 25.The rule reports a violation when the cyclomatic complexity is more than 25.

Plus d’informations sur la métrique du code à mesure la complexité et la facilité de maintenance du Code managé,You can learn more about code metrics at Measuring Complexity and Maintainability of Managed Code,

Comment corriger les violationsHow to Fix Violations

Pour corriger une violation de cette règle, refactorisez la méthode pour réduire la complexité cyclomatique.To fix a violation of this rule, refactor the method to reduce its cyclomatic complexity.

Quand supprimer les avertissementsWhen to Suppress Warnings

Il est possible de supprimer un avertissement de cette règle si la complexité facilement ne peut pas être réduite et la méthode est facile à comprendre, à tester et à gérer.It is safe to suppress a warning from this rule if the complexity cannot easily be reduced and the method is easy to understand, test, and maintain. En particulier, une méthode qui contient un grand switch (Select dans Visual BasicVisual Basic) instruction est un candidat pour l’exclusion.In particular, a method that contains a large switch (Select in Visual BasicVisual Basic) statement is a candidate for exclusion. Le risque de déstabiliser le code base dans le cycle de développement ou d’introduire un changement inattendu dans le comportement d’exécution dans le code précédemment expédié peut compenser les avantages de la facilité de maintenance de la refactorisation du code.The risk of destabilizing the code base late in the development cycle or introducing an unexpected change in runtime behavior in previously shipped code might outweigh the maintainability benefits of refactoring the code.

Mode de calcul de la complexité cyclomatiqueHow Cyclomatic Complexity is Calculated

La complexité cyclomatique est calculée en ajoutant 1 à ce qui suit :The cyclomatic complexity is calculated by adding 1 to the following:

  • Nombre de branches (tel que if, while, et do)Number of branches (such as if, while, and do)

  • Nombre de case instructions dans un switchNumber of case statements in a switch

    Les exemples suivants montrent des méthodes qui ont des éléments de complexité cyclomatique différents.The following examples show methods that have varying cyclomatic complexities.

ExempleExample

Complexité cyclomatique 1Cyclomatic Complexity of 1

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

ExempleExample

Complexité cyclomatique de 2Cyclomatic Complexity of 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


void Method(bool condition)
{
    if (condition)
    {
        Console.WriteLine("Hello World!");
    }
}

ExempleExample

Complexité cyclomatique des 3Cyclomatic Complexity of 3

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
public void Method(bool condition1, bool condition2)
{
    if (condition1 || condition2)
    {
        Console.WriteLine("Hello World!");
    }
}

ExempleExample

Complexité cyclomatique de 8Cyclomatic Complexity of 8

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

}

CA1501 : Évitez l’excès d’héritageCA1501: Avoid excessive inheritance

Voir aussiSee Also

Mesures de la complexité et de la facilité de maintenance du code managéMeasuring Complexity and Maintainability of Managed Code