Что такое связанность (coupling) компонентов в программной инженерии

Ответ

Связанность (coupling) — это мера, показывающая, насколько один модуль (компонент, класс) зависит от другого. Она описывает силу взаимосвязей между модулями.

В хорошей архитектуре стремятся к низкой связанности (loose coupling). Это означает, что изменение в одном компоненте минимально затрагивает другие, что упрощает поддержку, тестирование и повторное использование кода.

Связанность часто рассматривают в паре со сплоченностью (cohesion) — мерой, показывающей, насколько сфокусированы обязанности одного модуля. Идеальная цель: low coupling, high cohesion.

Основные типы связанности (от худшего к лучшему):

  1. Связанность по содержимому (Content coupling): Один модуль напрямую изменяет внутренние данные другого. Это грубейшее нарушение инкапсуляции.
  2. Связанность по управлению (Control coupling): Один модуль передает другому флаг, который управляет его логикой. Вызывающий модуль слишком много знает о внутреннем устройстве вызываемого.
  3. Связанность по данным (Data coupling): Модули обмениваются данными только через параметры методов. Это наиболее предпочтительный тип связанности.

Пример

# ВЫСОКАЯ СВЯЗАННОСТЬ (плохо)
# Класс B напрямую работает с внутренним состоянием класса A
class Report:
    def __init__(self):
        self.items = []

class ReportGenerator:
    def add_item_to_report(self, report: Report, item: str):
        # Прямое изменение внутреннего списка другого объекта
        report.items.append(item)

# НИЗКАЯ СВЯЗАННОСТЬ (хорошо)
# Класс A предоставляет публичный метод для управления своим состоянием
class Report:
    def __init__(self):
        self._items = []

    def add_item(self, item: str): # Инкапсуляция логики
        if item: # Можно добавить валидацию
            self._items.append(item)

class ReportGenerator:
    def add_item_to_report(self, report: Report, item: str):
        # Взаимодействие через стабильный публичный интерфейс
        report.add_item(item)