<qhelp> <overview>

This metric measures the average cyclomatic complexity of the functions in a file.

The cyclomatic complexity of a function is the number of linearly independent execution paths through that function. A path is linearly independent path if it differs from all other paths by at least one node. Straight-line code therefore has a cyclomatic complexity of one, while branches, switches and loops increase cyclomatic complexity.

Functions with a high cyclomatic complexity are typically hard to understand and test. By extension, files whose functions have a high average cyclomatic complexity are problematic, and usually would benefit from refactoring.

As a concrete example, consider the following function:

The control flow graph for this function is as follows:

The graph shows that the number of linearly independent execution paths through the function, and hence its cyclomatic complexity, is `3`. The three paths are:

- `start -> iEven -> end`
- `start -> iOdd -> jEven -> end`
- `start -> iOdd -> jOdd -> end`

</overview> <recommendation>

Functions with a high cyclomatic complexity should be simplified, for instance by tidying up any complex logic within them or by splitting them into multiple methods using the Extract Method refactoring.

</recommendation> <references>

- M. Fowler, Refactoring. Addison-Wesley, 1999.
- T. J. McCabe, A Complexity Measure. IEEE Transactions on Software Engineering, SE-2(4), December 1976.
- Dave Thomas, Refactoring as Meta Programming?, in Journal of Object Technology, vol. 4, no. 1, January-February 2005, pp. 7-11.
- Wikipedia: Cyclomatic complexity
- Wikipedia: Code refactoring
</references> </qhelp>