Какой основной принцип используется для устранения дублирования кода

Ответ

Основной принцип для устранения дублирования кода — 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 это подтверждает.