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?
2 Answers
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.
...
It's a great tool, if you can use it. :)
- @OnorioCatenacci No problem. :)Oleksi– Oleksi2012-05-31 15:40:48 +00:00Commented May 31, 2012 at 15:40
- Just too bad they don't go into how they calculate the metric.Onorio Catenacci– Onorio Catenacci2012-05-31 15:44:49 +00:00Commented May 31, 2012 at 15:44
- 3This might help with that: aivosto.com/project/help/pm-oo-cohesion.htmlOleksi– Oleksi2012-05-31 15:46:07 +00:00Commented 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– Phil2013-11-21 20:24:49 +00:00Commented 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/…edA-qa mort-ora-y– edA-qa mort-ora-y2015-05-04 08:23:34 +00:00Commented May 4, 2015 at 8:23
- 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.
- Thanks @Brian--exactly the sort of thing I was hoping to find.Onorio Catenacci– Onorio Catenacci2012-05-31 15:05:12 +00:00Commented May 31, 2012 at 15:05
