DRY — это хорошо, но не всегда!

ср, 7 мая 2025 г. - 2 мин чтения
dry is good, but not always

🔁 DRY — это хорошо, но не всегда: когда дублирование спасает проект

Каждому из нас вбивали в голову: Don’t Repeat Yourself!
Мол, дублирование — зло, и весь код нужно обязательно переиспользовать.

Идея правильная. Но как и любая идея в разработке, она работает не всегда.


🛠️ Мой опыт: компонент-попап, который стал монстром

В одном проекте мы делали универсальный компонент попапа.
Хотели, чтобы он подходил на все случаи жизни: логин, подтверждение, ошибки, настройки, инвайты и ещё десятки штук.

Сначала всё шло хорошо. DRY. Один компонент. Удобно. Красиво.

Но со временем у него появилось:

  • 30+ пропсов
  • вложенные if/else на несколько уровней
  • десятки состояний
  • кастомные рендеры для разных кейсов

В какой-то момент этот компонент превратился в файл на 1000+ строк.
Тестировать стало тяжело. Поддерживать — страшно. Использовать — непонятно.


💡 Как нужно было поступить?

Мы поняли, что проще было бы сделать три отдельных компонента:

  • <LoginPopup />
  • <InvitePopup />
  • <ErrorPopup />

Они бы были почти одинаковыми на 80%, но зато:

  • Их названия сразу говорили, зачем они нужны
  • Логика внутри была бы линейной и предсказуемой
  • Поддерживать проще, читать приятнее
  • Не нужно было бы каждый раз вспоминать, какие пропсы нужно передать

🤯 Почему DRY иногда вреден?

  • DRY отлично работает внутри одного слоя (UI, логика, стили).
    Но если вы начинаете смешивать их ради переиспользования — будет боль.
  • DRY создаёт абстракции, а они работают только если изменения происходят одинаково.
  • Если у компонентов разные сценарии, но вы их объединяете — начинается ад из флагов и исключений.
  • Абстракция может стать настолько универсальной, что никто кроме автора не решится её менять.

✅ Где DRY работает хорошо?

  • Утилиты: formatDate, getAgeFromDate, truncateText
  • Стили: вынесенные кнопки, отступы, шрифты
  • Бизнес-логика, где действия одинаковые

⚠️ Где DRY может навредить

  • UI-компоненты с разной семантикой и контекстом
  • Объединение разных сценариев в одну функцию
  • Попытка переиспользовать то, что легче скопировать

🧠 Что важно понять

DRY — это не закон. Это рекомендация.
Иногда дублирование кода — это не зло, а читаемость и простота.

Лучше три понятных компонента, чем один универсальный монстр.


🔚 Вывод

Пишите код так, чтобы завтра вы или ваша команда смогли его понять.
Если для этого нужно слегка повториться — ничего страшного.

🤘 Никого не слушай. Думай своей головой.
Иногда DRY — это путь в ад. А иногда — спасение.
Чувствуй грань.


Подписывайтесь на EasyAdvice — и не бойтесь писать код, который понятен вам.