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.
| Category | Add 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 : |
| Exceptions | catch, 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
- See Cyclomatic Complexity for a typical description in terms of flow graphs.
- Wikipedia is also a good source: Cyclomatic complexity .
- There's a Java program that reads your .jar files and displays the size and cylclomatic complexity of each method. See CyVis Software Complexity Visualizer.