CA1502: Avoid excessive complexity

 

The new home for Visual Studio documentation is Visual Studio 2017 Documentation on docs.microsoft.com.

The latest version of this topic can be found at CA1502: Avoid excessive complexity.

TypeName|AvoidExcessiveComplexity|
|CheckId|CA1502|
|Category|Microsoft.Maintainability|
|Breaking Change|Non-breaking|

A method has an excessive cyclomatic complexity.

Cyclomatic complexity measures the number of linearly independent paths through the method, which is determined by the number and complexity of conditional branches. A low cyclomatic complexity generally indicates a method that is easy to understand, test, and maintain. The cyclomatic complexity is calculated from a control flow graph of the method and is given as follows:

cyclomatic complexity = the number of edges - the number of nodes + 1

where a node represents a logic branch point and an edge represents a line between nodes.

The rule reports a violation when the cyclomatic complexity is more than 25.

You can learn more about code metrics at Measuring Complexity and Maintainability of Managed Code,

To fix a violation of this rule, refactor the method to reduce its cyclomatic complexity.

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. In particular, a method that contains a large switch (Select in Visual Basic) statement is a candidate for exclusion. 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.

The cyclomatic complexity is calculated by adding 1 to the following:

  • Number of branches (such as if, while, and do)

  • Number of case statements in a switch

The following examples show methods that have varying cyclomatic complexities.

Cyclomatic Complexity of 1

    Public Sub Method()
        Console.WriteLine("Hello World!")
    End Sub

Cyclomatic Complexity of 2

    Public Sub Method(ByVal condition As Boolean)
        If (condition) Then
            Console.WriteLine("Hello World!")
        End If
    End Sub

Cyclomatic Complexity of 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

Cyclomatic Complexity of 8


    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: Avoid excessive inheritance

Measuring Complexity and Maintainability of Managed Code

Show: