Что такое связность и связанность (cohesion и coupling)

При проектировании программных систем важно учитывать два ключевых показателя качества кода: связность (cohesion) и связанность (coupling). Они определяют, насколько эффективно организованы компоненты системы и как они взаимодействуют друг с другом. Высокая связность и низкая связанность способствуют созданию гибкой, поддерживаемой и расширяемой архитектуры.

Связность (Cohesion)

Связность характеризует, насколько тесно связаны элементы внутри одного модуля или класса. Высокая связность означает, что компоненты внутри модуля выполняют схожие задачи и имеют четкую функциональную цель.

Виды связности:

  1. Функциональная (Functional Cohesion) – элементы модуля работают вместе для выполнения одной задачи.
  2. Последовательная (Sequential Cohesion) – выход одного элемента используется как вход другого.
  3. Коммуникационная (Communicational Cohesion) – элементы работают с одинаковыми данными.
  4. Процедурная (Procedural Cohesion) – элементы объединены последовательностью выполнения операций.
  5. Временная (Temporal Cohesion) – элементы выполняются в одно и то же время, но не связаны логически.
  6. Логическая (Logical Cohesion) – элементы выполняют схожие, но не взаимосвязанные задачи.
  7. Случайная (Coincidental Cohesion) – элементы модуля не имеют логической связи (низшая степень связности).

Высокая связность повышает читаемость кода, упрощает поддержку и тестирование.

Связанность (Coupling)

Связанность определяет уровень зависимости между модулями. Чем меньше связанность, тем легче модифицировать и тестировать систему без риска нарушить работу других частей.

Виды связанности:

  1. Контентная (Content Coupling) – один модуль изменяет внутреннее состояние другого (наихудший вариант).
  2. Общая (Common Coupling) – модули используют общие глобальные данные.
  3. Контролирующая (Control Coupling) – один модуль управляет логикой работы другого.
  4. Шаблонная (Stamp Coupling) – модули обмениваются сложными структурами данных, из которых используется только часть информации.
  5. Данные (Data Coupling) – модули взаимодействуют через передачу данных, необходимых для выполнения задачи (наилучший вариант).

Принципы снижения связанности

  • Использование инъекции зависимостей (Dependency Injection, DI) позволяет уменьшить жесткие связи между классами.
  • Принцип единственной ответственности (Single Responsibility Principle, SRP) помогает разделить обязанности между модулями.
  • Применение интерфейсов и абстракций снижает зависимость от конкретных реализаций.
  • Использование событий и сообщений для взаимодействия между компонентами делает систему более гибкой.

Высокая связность в модулях и низкая связанность между ними – это ключевые характеристики качественной архитектуры. Они делают код понятным, легко расширяемым и удобным в сопровождении. Соблюдение принципов SOLID и использование гибких подходов к проектированию позволяют достичь оптимального баланса между связностью и связанностью.