Ответ
Связанность (coupling) — это мера, показывающая, насколько один модуль (компонент, класс) зависит от другого. Она описывает силу взаимосвязей между модулями.
В хорошей архитектуре стремятся к низкой связанности (loose coupling). Это означает, что изменение в одном компоненте минимально затрагивает другие, что упрощает поддержку, тестирование и повторное использование кода.
Связанность часто рассматривают в паре со сплоченностью (cohesion) — мерой, показывающей, насколько сфокусированы обязанности одного модуля. Идеальная цель: low coupling, high cohesion.
Основные типы связанности (от худшего к лучшему):
- Связанность по содержимому (Content coupling): Один модуль напрямую изменяет внутренние данные другого. Это грубейшее нарушение инкапсуляции.
- Связанность по управлению (Control coupling): Один модуль передает другому флаг, который управляет его логикой. Вызывающий модуль слишком много знает о внутреннем устройстве вызываемого.
- Связанность по данным (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)