PassFront
  1. PassFront
  2. База знаний
  3. Смежные принципы проектирования

Что такое связность (cohesion) и зацепление (coupling) модулей?

Смежные принципы проектирования

Связность (cohesion) — насколько элементы внутри модуля работают на одну цель; зацепление (coupling) — насколько модули зависят друг от друга. Цель — высокая связность при низком зацеплении.

Шкалы из Structured Design

Классификации Ларри Константина и Эдварда Йордона, 1970-е.

  • Связность, от худшей к лучшей: случайная (utils.ts со всем подряд) → логическая → временная (init()) → процедурная → коммуникационная (общие данные) → последовательная (выход одного — вход другого) → функциональная.
  • Зацепление, от худшего к лучшему: по содержимому (лезут во внутренности) → через глобальные данные → внешнее (общий формат) → по управлению (флаг меняет логику) → по структуре (передают объект ради одного поля) → по данным.

Во фронтенде

  • Папка на фичу — компонент, хук, стили, тесты рядом — высокая связность; раскладка components/, hooks/, utils/ по типу даёт логическую.
  • Импорт из features/cart/model/internal — зацепление по содержимому; публичный index.ts фичи его снижает.
  • Проп mode: 'edit' | 'view', переключающий половину логики, — зацепление по управлению.

Метрики

Ca и Ce (входящие и исходящие зависимости), нестабильность I = Ce / (Ca + Ce) по Мартину; LCOM для связности класса. Циклы находят dependency-cruiser и madge.

Коротко для собеседования

Хороший модуль делает одно дело и общается с остальными через узкий стабильный интерфейс. Зацепление нельзя обнулить, но можно свести его к зависимости по данным от стабильного публичного API, а не от внутренностей и управляющих флагов.

Другие вопросы раздела