Как принцип DRY влияет на связанность компонентов системы?

Ответ

Принцип DRY (Don't Repeat Yourself) направлен на устранение дублирования кода, а связанность (coupling) описывает степень зависимости между модулями. Эти концепции тесно связаны, и неправильное применение DRY может привести к увеличению связанности.

Положительное влияние

Когда вы выносите общую бизнес-логику в один модуль, вы уменьшаете дублирование и создаете единый источник истины. Это правильное применение DRY, которое упрощает поддержку.

Отрицательное влияние (ложный DRY)

Проблема возникает, когда разработчики объединяют код, который похож синтаксически, но различается по своей бизнес-сути. Это создает случайную связанность.

Пример: Предположим, у нас есть модуль для работы с пользователями и модуль для работы с заказами. В обоих нужна валидация полей, состоящих из 10 цифр.

Плохое применение DRY (высокая связанность): Создается общий утилитный модуль validators, который используется обоими.

# validators.py
def validate_ten_digit_code(code: str) -> bool:
    return len(code) == 10 and code.isdigit()

# users.py
from validators import validate_ten_digit_code
# ... использует для валидации номера телефона

# orders.py
from validators import validate_ten_digit_code
# ... использует для валидации номера накладной

Теперь модули users и orders неявно связаны через validators. Если требования к номеру накладной изменятся (например, добавятся буквы), изменение в validate_ten_digit_code сломает валидацию в модуле users.

Правильный подход (низкая связанность): Несмотря на дублирование кода, валидация должна оставаться в рамках своего домена.

# users.py
def validate_phone_number(phone: str) -> bool:
    return len(phone) == 10 and phone.isdigit()

# orders.py
def validate_invoice_number(invoice: str) -> bool:
    return len(invoice) == 10 and invoice.isdigit()

Вывод: Цель DRY — избежать дублирования бизнес-знаний, а не любого похожего кода. Иногда небольшое дублирование кода предпочтительнее, чем создание сильной и неочевидной связи между независимыми компонентами.