DRY, KISS и YAGNI: принципы программирования простыми словами
Основы3 минРедакция Innovialabs
Коротко
DRY — одно знание в одном месте, KISS — самое простое рабочее решение, YAGNI — не писать то, что пока не нужно; применять их стоит вместе, а не по отдельности.
Коротко о трёх принципах
- DRY (Don't Repeat Yourself) — каждое знание о системе должно жить в одном месте. Речь о правилах и решениях, а не о совпадающих строках.
- KISS (Keep It Simple, Stupid) — выбирайте самое простое решение, которое работает. Простой код легче читать, тестировать и менять.
- YAGNI (You Aren't Gonna Need It) — не пишите функциональность «на будущее», пока она реально не понадобилась.
Все три борются с одним врагом — лишней сложностью, но с разных сторон.
DRY на примере
Правило «бесплатная доставка от определённой суммы» встречается в корзине, в письме клиенту и в админке. Если сумма прописана в трёх местах, при изменении условия одно место обязательно забудут.
// одно место для правила
export const FREE_SHIPPING_THRESHOLD = 500_000;
export function hasFreeShipping(total) {
return total >= FREE_SHIPPING_THRESHOLD;
}
Теперь корзина, письмо и админка вызывают одну функцию.
Когда DRY вредит
Опасность — объединять код, который похож только внешне. Две функции валидации — для регистрации и для оформления заказа — сегодня проверяют одни и те же поля. Вы делаете общую validateUser(). Через месяц для заказа нужен адрес, а для регистрации — нет. Появляется флаг. Потом второй. Функция обрастает условиями, и любая правка рискует сломать оба сценария.
Это называется неверная абстракция. Признаки:
- у общей функции растёт число булевых параметров;
- внутри много
ifв зависимости от того, кто вызывает; - изменение для одного места требует проверки всех остальных.
Практичное правило: допустите дублирование, пока не увидите третий похожий случай и не поймёте, что это действительно одно знание. Если абстракция уже ошибочна — не бойтесь вернуть копии и разделить код заново.
KISS на практике
- Обычный цикл понятнее цепочки из пяти хитрых операций, если команда так читает быстрее.
- Отдельный сервис, очередь или кэш добавляйте, когда есть конкретная проблема, а не «потому что так делают крупные компании».
- Понятное имя переменной часто заменяет комментарий.
Простота — не примитивность. Простое решение может требовать больше обдумывания, но оставляет меньше движущихся частей.
YAGNI на практике
Типичные нарушения:
- универсальная система плагинов для приложения, у которого нет ни одного плагина;
- поддержка нескольких баз данных, когда используется одна;
- настройки для параметров, которые никто никогда не менял.
Каждая такая «заготовка» стоит времени сейчас и мешает потом: её нужно поддерживать, тестировать и обходить. Когда потребность появится, вы будете знать реальные требования и сделаете точнее.
YAGNI не отменяет хорошей структуры: чистый, покрытый тестами код легко расширить, когда придёт время.
Как принципы уравновешивают друг друга
| Ситуация | Что подсказывает принцип |
|---|---|
| Одно бизнес-правило в трёх местах | DRY: вынести в одно место |
| Общая функция обросла флагами | KISS: разделить обратно на простые |
| Хочется абстракцию «на вырост» | YAGNI: подождать реальной потребности |
| Простое решение дублирует код | Оценить: одно ли это знание |
Если DRY толкает к сложной абстракции, KISS и YAGNI её сдерживают. Если KISS превращается в копипасту одного правила, DRY напоминает о цене рассинхронизации.