Что означают DRY, KISS и YAGNI и как они конфликтуют между собой?
Смежные принципы проектирования
DRY — у каждого знания одно авторитетное представление; KISS — выбирай простейшее работающее решение; YAGNI — не пиши то, что понадобится «когда-нибудь». По отдельности полезны, но тянут в разные стороны.
Точные смыслы
- DRY (Хант и Томас, «Программист-прагматик», 1999) — про знание, а не совпадающие строки. Две проверки
age >= 18для совершеннолетия и для скидки — разные правила, хоть и одинаковы текстом. - KISS — связывают с Келли Джонсоном из Lockheed Skunk Works: самолёт должен чинить средний механик в полевых условиях.
- YAGNI — из экстремального программирования: фича стоит не только написания, но и сопровождения, а будущее угадывают редко.
Где конфликтуют
- DRY vs KISS: устранение повтора рождает обобщённую функцию с флагами и колбэками — сложнее двух копий.
- DRY vs YAGNI: абстракцию выделяют по двум совпадениям, ещё не видя третьего варианта.
- YAGNI vs OCP: точки расширения «заранее» — ровно то, что YAGNI запрещает.
- KISS vs производительность: простой проход O(n²) против индекса со сложной инвалидацией.
Как разрешать
Правило трёх: повтор терпят до третьего случая. KISS и YAGNI — по умолчанию; DRY обязателен для правил, которые должны меняться синхронно, например валидации на клиенте и сервере.
Коротко для собеседования
DRY убирает дублирование знаний, KISS — лишнюю сложность, YAGNI — спекулятивные фичи, и крайность одного бьёт по другому. Практическое правило — терпеть повтор до третьего случая, но синхронные правила вроде валидации на клиенте и сервере держать в одном месте.