Low Coupling / High Cohesion
High Cohesion — Высокая связность
Держи связанное вместе
Смысл
Всё, что находится внутри одного модуля, класса или функции, должно служить одной цели. Если убрать любой элемент — модуль перестаёт быть полным. Высокая связность делает код читаемым: открыл файл — сразу понял, за что он отвечает.
Индикаторы нарушения
- Класс или модуль отвечает за несколько несвязанных вещей одновременно
- Название модуля содержит слова «Manager», «Helper», «Utils» — и при этом он делает всё подряд
- Изменение одной фичи требует трогать методы, которые к ней логически не относятся
Low Coupling — Низкое зацепление
Разделяй несвязанное
Смысл
Модули должны знать друг о друге как можно меньше. Зависимости — явные, минимальные, через стабильные интерфейсы. Изменение в одном модуле не должно вызывать каскадных изменений в других.
Индикаторы нарушения
- Чтобы изменить одну вещь, приходится трогать несколько несвязанных файлов
- Модуль напрямую создаёт зависимости внутри себя (
new ConcreteService()) вместо получения их снаружи- Написать тест для модуля невозможно без поднятия базы данных, сети или других реальных зависимостей
Шпаргалка по LC / HC
| Принцип | Вопрос для проверки |
|---|---|
| High Cohesion | Всё в этом модуле служит одной цели? |
| Low Coupling | Изменение этого модуля не сломает другие? |
Связь с другими принципами
- DRY усиливает High Cohesion: если логика описана в одном месте, модуль отвечает ровно за одну вещь
- KISS усиливает Low Coupling: чем проще интерфейс между модулями, тем меньше они знают друг о друге
- YAGNI предостерегает от преждевременных абстракций — они создают иллюзию гибкости, но на деле усложняют систему
- Эти принципы лежат в основе SOLID (особенно SRP и DIP) и микросервисной архитектуры