12,891,744 members (54,059 online)
Add your own
alternative version

#### Stats

153.8K views
38 bookmarked
Posted 21 Sep 2005

# Cyclomatic Code Complexity Analysis for Microsoft .NET Applications

, 21 Sep 2005
 Rate this:
Please Sign up or sign in to vote.
Code Complexity is a measure that provides a single ordinal number which can be compared to the complexity of other programs. It is one of the most widely accepted static software metrics and is intended to be independent of language and language format.

## Introduction

Cyclomatic Code Complexity was first introduced by Thomas McCabe in 1976. In 1976, Thomas McCabe published a paper arguing that code complexity is defined by its control flow. Since that time, others have identified different ways of measuring complexity (e.g. data complexity, module complexity, algorithmic complexity, call-to, call-by, etc.). Although these other methods are effective in the right context, it seems to be generally accepted that control flow is one of the most useful measurements of complexity, and high complexity scores have been shown to be a strong indicator of low reliability and frequent errors.

## Overview

This measure provides a single ordinal number that can be compared to the complexity of other programs. It is one of the most widely accepted static software metrics and is intended to be independent of language and language format.

Code Complexity is a measure of the number of linearly-independent paths through a program module and is calculated by counting the number of decision points found in the code (if, else, do, while, throw, catch, return, break etc.).

### Technical Specification

Cyclomatic Complexity for a software module calculated based on graph theory is based on the following equation:

`CC=E-N+p`

Where

• CC = Cyclomatic Complexity
• E = the number of edges of the graph
• N = the number of nodes of the graph
• p = the number of connected components

Further academic information on the specifics of this can be found here.

From a layman’s perspective the above equation can be pretty daunting to comprehend. Fortunately there is a simpler equation which is easier to understand and implement by following the guidelines shown below:

• Start with 1 for a straight path through the routine.
• Add 1 for each of the following keywords or their equivalent: `if`, `while`, `repeat`, `for`, `and`, `or`.
• Add 1 for each `case` in a `switch` statement.

Let’s look at a few examples to understand how the code complexity is calculated.

#### Example 1

```public void ProcessPages()
{
while(nextPage !=true)
{
if((lineCount<=linesPerPage) && (status != Status.Cancelled) && (morePages == true))
{
//....
}
}
}```

In the code above, we start with 1 for the routine, add 1 for the `while` loop, add 1 for the `if`, and add 1 for each `&&` for a total calculated complexity of 5.

#### Example 2

```public int getValue(int param1)
{
int value = 0;
if (param1 == 0)
{
value = 4;
}
else
{
value = 0;
}
return value;
}```

In the code above, we start with 1 for the routine, add 1 for the `if`, and add 1 for the `else` for a total calculated complexity of 3.

Members that have high code complexity should be reviewed for possible refactoring.

The SEI provides the following basic risk assessment based on the value of code:

Cyclomatic ComplexityRisk Evaluation
1 to 10a simple program, without very much risk
11 to 20a more complex program, moderate risk
21 to 50a complex, high risk program
> 50an un-testable program (very high risk)

## Tools

There are several free tools available which help one analyze the code complexity:

• devMetrics by Anticipating minds have a free community edition available for analyzing metrics for C# projects.
• Reflector Add-In: Code Metrics can be used to analyze .NET assemblies and show design quality metrics. This add-in is to be used in conjunction with Lutz Roeder’s Reflector.

## Advantages

• It is very easy to compute as illustrated in the example.
• Unlike other complex measurements, it can be computed immediately in the development cycle (which makes it agile friendly).
• It provides a good indicator of the ease of code maintenance.
• It can help focus testing efforts.
• It makes it easy to find complex code for formal review.

## License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

## About the Author

 India
No Biography provided

## Comments and Discussions

 First Prev Next
 My vote of 1 DaveBlack4-Jan-11 9:06 DaveBlack 4-Jan-11 9:06
 Update link to CodeMetrics .NET Reflector Add-In Michael Freidgeim30-Jan-09 10:45 Michael Freidgeim 30-Jan-09 10:45
 Few questions on calculating CC of program Shiva Prasad Sheela22-Apr-08 1:58 Shiva Prasad Sheela 22-Apr-08 1:58
 Great freeware tool to display Cyclomatic Complexity Hannes Pavelka19-Mar-06 3:14 Hannes Pavelka 19-Mar-06 3:14
 Nice article ! Another great (freeware) tool to display code metrics is SourceMonitor. You might find my recent post about it informative: http://www.hannes-pavelka.com/CodeMetricToolsAndCyclomaticComplexity.aspx[^]
 Re: Great freeware tool to display Cyclomatic Complexity DSK Chakravarthy24-Nov-14 22:40 DSK Chakravarthy 24-Nov-14 22:40
 Visual Studio .NET 2005 ssaSpot28-Sep-05 8:14 ssaSpot 28-Sep-05 8:14
 VB.NET?? Drew Berkemeyer27-Sep-05 3:30 Drew Berkemeyer 27-Sep-05 3:30
 Re: VB.NET?? Saikalyan Prasadrao27-Sep-05 4:12 Saikalyan Prasadrao 27-Sep-05 4:12
 Re: VB.NET?? alfalfa27-Sep-05 4:14 alfalfa 27-Sep-05 4:14
 Thanks `leppie`21-Sep-05 7:08 `leppie` 21-Sep-05 7:08
 Last Visit: 31-Dec-99 18:00     Last Update: 27-Apr-17 5:34 Refresh 1

General    News    Suggestion    Question    Bug    Answer    Joke    Praise    Rant    Admin

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.170424.1 | Last Updated 21 Sep 2005
Article Copyright 2005 by Saikalyan Akunuri
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid