Ответ
Основной принцип для устранения дублирования кода — 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).
Почему это важно?
- Поддерживаемость: Изменить логику нужно только в одном месте.
- Надёжность: Снижается риск ошибок, так как исправление в одном месте применяется везде.
- Читаемость: Код становится более декларативным и понятным.
Ответ 18+ 🔞
А, слушай, вот этот ваш DRY, "Don't Repeat Yourself" — это же, блядь, святое! Это как заповедь первая для любого, кто код пишет, а не просто клавиатуру ебёт.
Представь себе, ты пишешь один и тот же кусок логики в десяти разных местах. Потом баг находят. И ты теперь должен, этот, как обезьяна, бегать по всему коду и в каждом месте одно и то же исправлять. Один раз забудешь — и пиздец, на тебя уже тикет навесили, что система глючит. Это же пиздопроебищно!
Вот смотри, как это выглядит, когда ты — распиздяй:
# Считаем скидку для Васьки
order_total_1 = 1200
if order_total_1 > 1000:
final_price_1 = order_total_1 * 0.9
else:
final_price_1 = order_total_1
# А теперь для Петьки, но логика-то та же, ёпта!
order_total_2 = 2500
if order_total_2 > 1000:
final_price_2 = order_total_2 * 0.9
else:
final_price_2 = order_total_2
Ну что это такое, а? Два раза одно и то же! Это же, блядь, волнение ебать! А если порог скидки поменяется с 1000 на 1500? Придёшь ты, такой весь из себя, и будешь как дурак во всех if-ах цифру менять. Идешь в сраку с таким подходом!
А теперь смотри, как делают умные люди, которые не ебут мозг себе и другим:
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)
Вот! Всё! Логика в одном месте. Захотел поменять скидку — плюнул один раз в функцию, и она везде применилась. Красота, ёпта! Чихать тебе в сраку на дублирование.
Ну и, ясное дело, функции — это только цветочки. Есть ещё, блядь, целый овердохуища способов не повторяться:
- Классы с наследованием — выносишь общее в "папку", а детишки только своё дописывают. Удобно, если у тебя там стадо однотипных сущностей.
- Декораторы — это вообще магия, блядь. Хочешь ко всем функциям прилепить логирование или проверку прав? Обернул их декоратором — и не надо в каждой копипастить один и тот же код. Ёперный театр, как удобно!
- Контекстные менеджеры (
with) — чтоб не писать каждый разfile.open()иfile.close(). Самый наглядный пример, чтоб не обосраться с ресурсами. - Конфиги отдельные — все эти пороги, URL-ы, ключики. Не надо их хардкодить в коде, вынеси в
.envфайл. А то поменялся пароль от базы — и ты полдня ищешь, где же ты его, мудя, во всех скриптах написал.
А зачем это всё, спросишь? Да затем, сука!
- Чинить легко. Баг нашли — ты знаешь, что копать в одном конкретном месте, а не по всему лесу.
- Ошибаться сложнее. Исправил в одном месте — и везде стало хорошо. Не будет такого, что в одном месте пофиксил, а в другом забыл, и система как шалава работает через раз.
- Читать приятно. Открываешь код, а там не простыня из повторяющихся операций, а понятные вызовы функций с говорящими названиями.
calculate_discounted_price— и сразу ясно, что тут происходит, в рот меня чих-пых!
Короче, запомни: повторяешь код больше одного раза — значит, ты уже накосячил. Останавливайся, выноси логику и живи спокойно. Всё гениальное — просто, и DRY это подтверждает.