Java: Method Cyclomatic Complexity

How to compute McCabe's Cyclomatic Complexity in Java methods

McCabe proposed a way to measuring flow complexity of a method which basically counts one for each place where the flow changes from a linear flow. His algorithm, translated, at least approximately, into Java terms is as follows. His measurement was designed before exceptions and threads were used in programming languages, so what I've added I believe reflects some of the original intent.

Start with a count of one for the method. Add one for each of the following flow-related elements that are found in the method.

CategoryAdd one for each of the following
Methods Each return that isn't the last statement of a method.
Selection if, else, case, default.
Loops for, while, do-while, break, and continue.
Operators &&, ||, ?, and :
Exceptionscatch, finally, throw, or throws clause.
Threads start() call on a thread. Of course, this is a ridiculous underestimate!

Evaluating complexity

Keep complexity under 10. A McCabe complexity under 5 is good, from 5-10 is OK, and over 10 is too complex. A high flow complexity may be a symptom of a function which does too much or has low cohesion. But don't take these numbers too seriously -- you may have comprehensible control flow despite high numbers; one large switch statement can be clear to understand, but can dramatically increase the count.

What to do about high complexity

Make simpler or break up complex methods. How do you simplify a method? Sometimes you can make a method simpler. Other times all program decisions have to be made, and you simplify it by breaking it into two or more methods. The complexity, the demands on the human to keep many things in their mind at the same time, can be reduced by breaking one method into two highly cohesive, well-named, methods.

Example

[To do]

External sources