Ответ
Принцип 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 — избежать дублирования бизнес-знаний, а не любого похожего кода. Иногда небольшое дублирование кода предпочтительнее, чем создание сильной и неочевидной связи между независимыми компонентами.