Существуют ли метрики для сцепления и сцепления?

34

Существует ли показатель, аналогичный показателю сложности McCabe, для измерения степени связности подпрограммы, а также того, насколько свободно (или тесно) подпрограмма связана с другим кодом в той же кодовой базе?

Онорио Катеначчи
источник

Ответы:

29

Я думаю, что метрика, которую вы ищете, это LCOM4, ​​хотя она больше относится к классам.

Сонар хорошо объясняет это здесь :

... метрика: LCOM4 (Отсутствие методов сплоченности) для измерения степени сплоченности классов. Интерпретация этой метрики довольно проста, так как значение 1 означает, что у класса есть только одна ответственность (хорошо), а значение X означает, что у класса, вероятно, есть обязанности X (плохо), и его следует реорганизовать / разделить.

Здесь нет никакой магии, только здравый смысл. Давайте рассмотрим простой пример с классом Driver. Этот класс имеет два поля: Car и Brain и пять методов: drive (), goTo (), stop (), getAngry () и drinkCoffee (). Вот график зависимости между этими компонентами. Есть три блока связанных компонентов, поэтому LCOM4 = 3, поэтому класс, кажется, имеет три разные обязанности и нарушает принцип единой ответственности. http://i.stack.imgur.com/2527G.png

...

Это отличный инструмент, если вы можете его использовать. :)

Oleksi
источник
@OnorioCatenacci Нет проблем. :)
Алексей
Очень жаль, что они не учитывают, как рассчитывают метрику.
Онорио Катеначчи
3
Это может помочь с этим: aivosto.com/project/help/pm-oo-cohesion.html
Oleksi
Из любопытства, как бы вы реорганизовали эту диаграмму в соответствии с принципом единой ответственности? brain.setAngry(driver)? car.applyBreaks(driver)?
Фил
Я сомневаюсь, что основанные на коде показатели сплоченности действительно могут показывать сплоченность на уровне интерфейса и могут даже способствовать плохому программированию: mortoray.com/2015/04/29/…
edA-qa mort-ora-y
16
  • Афферентная связь: количество обязанностей
  • Эфферентная связь: количество зависимостей
  • Нестабильность: отношение эфферентного взаимодействия к общему (Afferent + Efferent).

Нестабильность поддерживается в различных инструментах метрики кода.

Брайан
источник
Спасибо, Брайан, именно такую ​​вещь я и надеялся найти.
Онорио Катеначчи