Что такое связность (cohesion) в проектировании ПО

Ответ

Связность (Cohesion) — это метрика в программной инженерии, которая показывает, насколько сфокусированы и логически связаны между собой задачи внутри одного модуля (например, класса или функции).

Высокая связность (High Cohesion) — это идеал, к которому стремятся в хорошем дизайне. Это означает, что модуль выполняет одну, четко определенную задачу.

Низкая связность (Low Cohesion) — признак плохого дизайна. Модуль выполняет множество несвязанных между собой задач, что делает его сложным для понимания, поддержки и тестирования.

Преимущества высокой связности:

  • Читаемость: Легко понять, за что отвечает модуль.
  • Поддерживаемость: Изменения в одной функциональности локализованы в одном месте.
  • Повторное использование: Сфокусированные модули легче переиспользовать в других частях системы.
  • Тестируемость: Проще писать unit-тесты для модуля с одной зоной ответственности.

Пример высокой связности: Класс отвечает только за аутентификацию пользователя.

# ВЫСОКАЯ СВЯЗНОСТЬ: Класс выполняет одну четкую задачу
class UserAuthenticator:
    def __init__(self, db_connection):
        self.db = db_connection

    def authenticate(self, username, password):
        # Логика поиска пользователя и проверки пароля
        print(f"Аутентификация пользователя {username}...")
        return True

Пример низкой связности: Класс смешивает аутентификацию, отправку email и логирование — три разные задачи.

# НИЗКАЯ СВЯЗНОСТЬ: Класс смешивает разные обязанности
class GodObjectManager:
    def authenticate_user(self, username, password):
        # ...логика аутентификации
        pass

    def send_notification_email(self, user_email, message):
        # ...логика отправки email
        pass

    def log_error_to_file(self, error_message):
        # ...логика записи в файл
        pass

Связность часто рассматривают в паре с зацеплением (coupling). Цель хорошей архитектуры: высокая связность внутри модулей и низкое зацепление между ними.