Coupling и Cohesion
Coupling (зацепление) — связи между модулями: чем меньше, тем лучше. Cohesion (связность) — связи внутри модуля: чем сильнее, тем лучше. Парные принципы GRASP.
Что это / Зачем
- Low Coupling — модули знают друг о друге как можно меньше → подменяемость, переиспользование, изоляция изменений.
- High Cohesion — внутри модуля все идентификаторы плотно связаны, делают одну вещь → понятность, поддержка.
- Чем лучше одно, тем лучше другое: размазанная ответственность → много связей наружу + слабая связность внутри.
Три уровня связи (по убыванию жёсткости)
- Через данные (shared state) — самая жёсткая, ломает всё.
- Через вызовы методов — средняя, контракт виден.
- Через события — самая слабая, отправитель не знает о получателях.
Признаки нарушения
- Один файл импортирует 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.