← Назад к вопросам

Когда стоит продолжать дублировать код?

2.0 Middle🔥 142 комментариев
#Архитектура и паттерны#ООП

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Когда стоит продолжать дублировать код? (Rule of Three)

Отличный вопрос, потому что стремление к DRY (Don't Repeat Yourself) может привести к над-инжинирингу. Есть хороший принцип: Rule of Three.

Rule of Three (Правило трёх)

1-й раз: просто скопируй и используй 2-й раз: дублируй спокойно, это нормально 3-й раз: рефакторь и избегай дублирования

Идея: Не торопись рефакторить после первого дублирования. Дождись третьего повтора, чтобы понять общую закономерность.

Пример: Валидация email

После 1-го использования: Копируешь валидацию в users.service.ts

После 2-го использования: Копируешь в posts.service.ts — это OK

После 3-го использования: Создаёшь хелпер validators/email.ts с функцией isValidEmail

Когда НЕ стоит рефакторить сразу

1. Неизвестные требования (Speculative Design)

  • Не рефакторим "про запас"
  • Код должен решать текущую задачу
  • Не нужно абстракция для будущих случаев, которых может не быть

2. Разные контексты

  • Даже если код выглядит одинаково, контекст может быть разным
  • auth требования к паролю — одни
  • payment требования к паролю — могут быть другие
  • Не объединяй в одну функцию

3. Слабые связи (Loose coupling)

  • Лучше иметь независимые валидаторы (validateUser, validatePost)
  • Чем одну функцию validate для всех

Когда СТОИТ рефакторить сразу

1. Один и тот же паттерн в одном месте

  • Если копируешь одну логику 3 раза в одной функции
  • Используй map/loop, не копипасте

2. Явные ошибки при копировании

  • Если забыл в одном месте обновить логику при изменении
  • Рефакторь сразу в одну функцию

3. Высокий риск рассинхронизации

  • Если изменение требует обновления в 5+ местах
  • Это признак того, что нужна абстракция

YAGNI vs DRY

YAGNI (You Aren't Gonna Need It): Не добавляй функционал на будущее DRY (Don't Repeat Yourself): Не повторяй код

Часто конфликтуют:

  • DRY + YAGNI = над-инжиниринг (абстрактная функция для всех сценариев)
  • Компромисс = простой код сейчас, рефакторинг после 3-го повтора

Когда дублирование ПОЛЕЗНО

1. Микросервисы / разные проекты

  • Разные git repo
  • Разные версии могут быть нужны
  • Снижает dependency между сервисами

2. Performance-critical code

  • Inline код для оптимизации (если нужна скорость)
  • Дублирование логики — компромисс за performance

3. Обучение и примеры

  • Документация может содержать повторение кода
  • Примеры должны быть самостоятельными

Мой подход

После 1-го раза: скопирую без раздумий После 2-го раза: ещё скопирую, но с пометкой в комментарии После 3-го раза:

  • Смотрю, действительно ли закономерность
  • Если да — рефакторю в общую функцию
  • Если контексты разные — оставляю дублирование

Если ошибка в дублировании: рефакторю сразу!

Итог

Дублирование кода — не всегда плохо. Важно:

  • Баланс между DRY и простотой
  • Rule of Three для правильного момента рефакторинга
  • Контекст — один ли это проект или разные микросервисы
  • Риск ошибок — если высокий, рефакторь сразу
  • Production опыт — код, который менялась много раз, нужна абстракция