Gymterview
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   ┌──────────────┐
│ Модуль       │──────────▶│ Модуль       │
│ Платежей     │           │ Уведомлений  │
│ (всё про     │           │ (всё про     │
│  платежи)    │           │  уведомления)│
└──────────────┘           └──────────────┘

Типы связанности (от худшей к лучшей)

  1. Content coupling — один модуль напрямую изменяет данные другого.
  2. Common coupling — модули разделяют глобальные данные.
  3. Control coupling — один модуль управляет логикой другого через флаги.
  4. Stamp coupling — модули обмениваются сложными структурами данных, используя лишь часть.
  5. Data coupling — модули обмениваются только необходимыми примитивными данными.
  6. Message coupling — модули общаются только через сообщения/события (наилучший вариант).

Способы снижения coupling

  • Использовать интерфейсы и абстракции вместо конкретных реализаций.
  • Общаться через события (event-driven).
  • Применять Dependency Injection.
  • Определять чёткие контракты (API) между модулями.
  • В микросервисах — использовать API Gateway и асинхронное взаимодействие.

На собеседовании: Интервьюер хочет услышать не только определения, но и конкретные способы снижения coupling в реальном проекте. Частая ошибка — путать cohesion и coupling, или не знать типы связанности.