Ответ
Основной принцип для устранения дублирования кода — DRY (Don't Repeat Yourself), что переводится как «не повторяйся». Его суть в том, чтобы каждая часть знания или логики в системе имела единственное, однозначное и авторитетное представление.
На практике это достигается путём вынесения повторяющегося кода в переиспользуемые абстракции.
Основной метод: Рефакторинг в функцию/метод
Самый распространённый способ следовать DRY — инкапсулировать повторяющуюся логику в отдельную функцию или метод.
До (плохо):
# Расчёт скидки для обычного клиента
order_total_1 = 1200
if order_total_1 > 1000:
final_price_1 = order_total_1 * 0.9
else:
final_price_1 = order_total_1
# Такой же расчёт для VIP-клиента
order_total_2 = 2500
if order_total_2 > 1000:
final_price_2 = order_total_2 * 0.9
else:
final_price_2 = order_total_2
После (хорошо):
def calculate_discounted_price(total, threshold=1000, discount=0.1):
"""Применяет скидку, если сумма заказа превышает порог."""
if total > threshold:
return total * (1 - discount)
return total
final_price_1 = calculate_discounted_price(1200)
final_price_2 = calculate_discounted_price(2500)
Другие способы реализации DRY:
- Классы и наследование: Общая логика выносится в базовый класс, а дочерние классы её наследуют.
- Декораторы: Используются для добавления сквозной функциональности (логирование, кэширование, проверка прав) к нескольким функциям.
- Контекстные менеджеры (
with): Для повторяющихся операций по настройке и очистке ресурсов (например, открытие/закрытие файлов или транзакций БД). - Конфигурационные файлы: Вынесение констант и настроек из кода в отдельные файлы (
.env,.yaml,.json).
Почему это важно?
- Поддерживаемость: Изменить логику нужно только в одном месте.
- Надёжность: Снижается риск ошибок, так как исправление в одном месте применяется везде.
- Читаемость: Код становится более декларативным и понятным.