36

Is there a metric analogous to the McCabe Complexity measure to measure how cohesive a routine is and also how loosely (or tightly) coupled the routine is to other code in the same code base?

1

2 Answers 2

31

I think the metric you are looking for is LCOM4, although it applies more to classes.

Sonar explains it nicely here:

...metric : LCOM4 (Lack Of Cohesion Methods) to measure how cohesive classes are. Interpreting this metric is pretty simple as value 1 means that a class has only one responsibility (good) and value X means that a class has probably X responsibilities (bad) and should be refactored/split.

There is not any magic here, only common sense. Let’s take a simple example with class Driver. This class has two fields : Car and Brain, and five methods : drive(), goTo(), stop(), getAngry() and drinkCoffee(). Here is the dependency graph between those components. There are three blocks of related components, so LCOM4 = 3, so the class seems to have three different responsibilities and breaks the Single Responsibility Principle. https://i.stack.imgur.com/2527G.png

...

It's a great tool, if you can use it. :)

7
  • @OnorioCatenacci No problem. :)
    – Oleksi
    May 31, 2012 at 15:40
  • Just too bad they don't go into how they calculate the metric. May 31, 2012 at 15:44
  • 3
    This might help with that: aivosto.com/project/help/pm-oo-cohesion.html
    – Oleksi
    May 31, 2012 at 15:46
  • Out of curiosity, how would you refactor that diagram to obey the Single Responsibility Principle? brain.setAngry(driver)? car.applyBreaks(driver)?
    – Phil
    Nov 21, 2013 at 20:24
  • I doubt that code-based cohesion metrics can truly be indicative of interface level cohesion, and may even promote bad programming: mortoray.com/2015/04/29/… May 4, 2015 at 8:23
17
  • Afferent coupling: Number of responsibilities
  • Efferent coupling: Number of dependencies
  • Instability: Ratio of efferent coupling to total coupling (Afferent + Efferent).

Instability is supported in various code metric tools.

1
  • Thanks @Brian--exactly the sort of thing I was hoping to find. May 31, 2012 at 15:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.