junior
Что такое Coupling и Cohesion (связанность и сцепленность)
Coupling (связанность / зацепление) — степень взаимозависимости между модулями. Чем ниже coupling, тем лучше: модули можно изменять и развивать независимо.
Cohesion (сцепленность / связность) — степень, в которой элементы внутри одного модуля принадлежат друг другу и работают над одной задачей. Чем выше cohesion, тем лучше: модуль сфокусирован и понятен.
Идеал: Low Coupling + High Cohesion. По аналогии: хорошая команда — это когда каждый отдел занимается своим делом (high cohesion), а между отделами минимум бюрократии (low coupling).
Наглядное сравнение
Пример
Плохо: High Coupling + Low Cohesion
┌──────────────────┐ ┌──────────────────┐
│ Модуль A │────▶│ Модуль B │
│ - платежи │◀────│ - клиенты │
│ - уведомления │────▶│ - отчёты │
│ - часть отчётов │◀────│ - часть платежей│
└──────────────────┘ └──────────────────┘
(всё в куче) (всё в куче)
Хорошо: Low Coupling + High Cohesion
┌──────────────┐ event ┌──────────────┐
│ Модуль │──────────▶│ Модуль │
│ Платежей │ │ Уведомлений │
│ (всё про │ │ (всё про │
│ платежи) │ │ уведомления)│
└──────────────┘ └──────────────┘
Типы связанности (от худшей к лучшей)
- Content coupling — один модуль напрямую изменяет данные другого.
- Common coupling — модули разделяют глобальные данные.
- Control coupling — один модуль управляет логикой другого через флаги.
- Stamp coupling — модули обмениваются сложными структурами данных, используя лишь часть.
- Data coupling — модули обмениваются только необходимыми примитивными данными.
- Message coupling — модули общаются только через сообщения/события (наилучший вариант).
Способы снижения coupling
- Использовать интерфейсы и абстракции вместо конкретных реализаций.
- Общаться через события (event-driven).
- Применять Dependency Injection.
- Определять чёткие контракты (API) между модулями.
- В микросервисах — использовать API Gateway и асинхронное взаимодействие.
На собеседовании: Интервьюер хочет услышать не только определения, но и конкретные способы снижения coupling в реальном проекте. Частая ошибка — путать cohesion и coupling, или не знать типы связанности.