Coupling и Cohesion

Coupling (зацепление) — связи между модулями: чем меньше, тем лучше. Cohesion (связность) — связи внутри модуля: чем сильнее, тем лучше. Парные принципы GRASP.

Что это / Зачем

  • Low Coupling — модули знают друг о друге как можно меньше → подменяемость, переиспользование, изоляция изменений.
  • High Cohesion — внутри модуля все идентификаторы плотно связаны, делают одну вещь → понятность, поддержка.
  • Чем лучше одно, тем лучше другое: размазанная ответственность → много связей наружу + слабая связность внутри.

Три уровня связи (по убыванию жёсткости)

  1. Через данные (shared state) — самая жёсткая, ломает всё.
  2. Через вызовы методов — средняя, контракт виден.
  3. Через события — самая слабая, отправитель не знает о получателях.

Признаки нарушения

  • Один файл импортирует 20+ модулей.
  • Внутри модуля идентификаторы из разных областей (HTTP + парсинг + логирование + БД в одном файле).
  • Замена одной библиотеки требует правок в 15 местах.
  • Тесты одного модуля не запускаются без БД и сети.

Пример: вынос Pure Fabrication

// плохо: Person знает про БД и таблицы
class Person {
  save { db.exec(`INSERT INTO people…`); }
}

// хорошо: Pure Fabrication снижает coupling
class PersonRepository {
  save(person) { this.db.exec(`INSERT INTO people…`); }
}
class Person { /* только данные и поведение */ }

Антипаттерн

// 6 ответственностей в одном модуле — низкий cohesion, высокий coupling
function handler(req, res) {
  const cookies = parse(req.headers.cookie); // парсинг
  log('request', req.url);                   // логирование
  const user = db.query('…');                // БД
  const html = `<div>${user.name}</div>`;    // шаблонизация
  res.setHeader('Content-Type', 'text/html');
  res.end(html);
}

🎓 Источники

  • 🎓 [Слои, связанность и связность кода] · 2018-10-23 · YouTube
    • «Coupling — отрицательный оттенок, cohesion — положительный».
    • Связи: данные (жёсткая) → вызовы → события (слабая).
    • «Внутри программных абстракций — сильные связи, между крупными — слабее». Cohesion даёт reuse и поддержку.
  • 🎓 [GRASP Coupling and Cohesion] · 2021-03-10 · YouTube
    • Person + DB + структура БД — все связаны → Pure Fabrication снижает coupling.

См. также