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

Ответ

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

1. Зацепление (Coupling)

Зацепление — это степень взаимозависимости между программными модулями. Хорошая архитектура стремится к низкому зацеплению (Low Coupling).

  • Высокое зацепление (плохо): Изменение в одном модуле требует множества изменений в других. Модули тесно "склеены" друг с другом, их сложно тестировать и переиспользовать по отдельности.
  • Низкое зацепление (хорошо): Модули независимы и взаимодействуют через стабильные, четко определенные интерфейсы. Изменение внутренней реализации одного модуля не затрагивает другие.

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

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

  • Низкая связность (плохо): Модуль выполняет множество несвязанных между собой задач (например, класс, который работает с пользователями, отправляет email и генерирует отчеты).
  • Высокая связность (хорошо): Все элементы модуля (методы, свойства) служат общей, единой цели. Такой модуль проще понять и поддерживать.

Пример:

# ПЛОХО: Низкая связность (класс делает слишком много)
# и высокое зацепление (напрямую использует SMTP_Client)
class ReportManager:
    def get_user_data(self, user_id): 
        # ... логика получения данных из БД
        pass

    def generate_pdf_report(self, data):
        # ... логика создания PDF
        pass

    def send_report_by_email(self, report, email):
        # ... логика отправки через конкретный SMTP_Client
        pass

# ХОРОШО: Высокая связность и низкое зацепление
class UserRepository:
    def get_by_id(self, user_id): # Только работа с пользователями
        pass

class ReportService:
    def generate(self, data): # Только генерация отчетов
        pass

class EmailNotifier:
    def send(self, recipient, content): # Только отправка уведомлений
        pass

Ключевая идея: Хороший дизайн ПО подразумевает создание независимых, сфокусированных модулей, которые слабо связаны друг с другом. Low Coupling, High Cohesion.