loading...

Discussion on: Coding Concepts! Cyclomatic Complexity

Collapse
jdsteinhauser profile image
Jason Steinhauser

I definitely like the write-up! I love to see software quality metrics being discussed. I do want to point out in your first example:

var msg = "";
if (month == 12 && day == 25) { // + 2
      msg = "Merry Christmas"; // +1
} else {
     msg = "Have a nice day"; // +1
}
return msg; // +1 - Total 5

Your suggested reduction in cyclomatic complexity (which I agree with) actually increases your essential complexity... though not above the structured/unstructured threshold. You add an additional exit point to the function, which is a trade off. Your second example:

switch (day) { // +1
                case 0: return "Sunday"; // +2
                case 1: return "Monday"; // +2
                case 2: return "Tuesday"; // +2
                case 3: return "Wednesday"; // +2
                case 4: return "Thursday"; // +2
                case 5: return "Friday"; // +2
                case 6: return "Saturday"; // +2 
                default: throw new Exception(); // +2 Total 17!
        }

The essential complexity is 8 because each case is an exit, as well as the default case. In this example, you don't need any trade-offs between cyclomatic and essential complexity; it's bad all the way around. The threshold we use on my quality team (based on McCabe) are that a method in OO code with an essential complexity of greater than 4 is considered to be unstructured.

Again, I'm definitely glad to see good editorials on software quality metrics. Thanks for the post!

Collapse
designpuddle profile image
Chris Bertrand Author

Thanks for the comment. I like the introduction to essential complexity. So long as the same code metrics are used throughout the codebase they should give an insight into code smells and areas ripe for refactoring!

Collapse
adekoder profile image
adekoder

"Your suggested reduction in cyclomatic complexity (which I agree with) actually increases your essential complexity... though not above the structured/unstructured threshold. You add an additional exit point to the function, which is a trade off. Your second example:
"

Additional exit point will not be added since the msg variable will have a default, then you only change the content of the variable when the if statement evaluate to true, and only one return statement is needed.

Collapse
jdsteinhauser profile image
Jason Steinhauser

You're absolutely right. I was mixing code samples in my head. Thanks for the correction!

Collapse
designpuddle profile image
Chris Bertrand Author

Very true! Thanks for the comment.