Что такое связность (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, а не от внутренностей и управляющих флагов.