Ответ
Связность (coupling) — это мера зависимости между программными модулями. Цель хорошей архитектуры — достичь слабой связности.
Сильная связность (High Coupling)
Модули тесно переплетены. Изменение в одном модуле с высокой вероятностью потребует изменений в других, зависимых от него.
Последствия:
- Хрупкость: Код легко сломать при внесении правок.
- Сложность тестирования: Трудно изолировать и тестировать модули по отдельности.
- Низкая переиспользуемость: Модуль нельзя использовать в другом месте без его зависимостей.
Пример (до рефакторинга):
class OrderProcessor:
def process(self, order_data):
# Прямое создание экземпляра конкретного класса
# OrderProcessor "знает" о существовании MySQLDatabase
db = MySQLDatabase()
db.connect()
db.save(order_data)
Слабая связность (Low Coupling)
Модули независимы и взаимодействуют через стабильные, четко определенные интерфейсы (абстракции). Изменения во внутренней реализации одного модуля не затрагивают другие.
Достигается через:
- Инверсию зависимостей (Dependency Injection)
- Событийно-ориентированную архитектуру
- Абстрактные классы и интерфейсы
Пример (после рефакторинга с DI):
# OrderProcessor зависит от абстракции, а не от конкретной реализации
class OrderProcessor:
def __init__(self, database_connector):
self.db = database_connector
def process(self, order_data):
self.db.connect()
self.db.save(order_data)
# Конкретную реализацию можно легко подменить
# processor_mysql = OrderProcessor(MySQLDatabase())
# processor_postgres = OrderProcessor(PostgreSQLDatabase())
В монолитных приложениях слабая связность критически важна для управляемости и долгосрочной поддержки кода.