junior
Что означают принципы DRY, KISS и YAGNI
DRY, KISS и YAGNI — три базовых принципа проектирования, направленных на снижение сложности и повышение поддерживаемости системы.
DRY (Don’t Repeat Yourself) — «Не повторяйся»
Каждый фрагмент знания должен иметь единственное, непротиворечивое, авторитетное представление в системе.
- Дублирование кода ведёт к рассинхронизации при изменениях.
- Относится не только к коду, но и к конфигурации, схемам БД, документации.
- Важно: DRY — это не «любой одинаковый код надо выносить». Если два фрагмента кода случайно совпадают, но описывают разные концепции, объединять их не нужно. Иначе при изменении одной концепции сломается другая.
Пример кода
// Плохо: дублирование логики валидации
public class PaymentService {
public void createPayment(PaymentRequest req) {
if (req.getAmount().compareTo(BigDecimal.ZERO) <= 0)
throw new IllegalArgumentException("Amount must be positive");
// ...
}
public void refundPayment(RefundRequest req) {
if (req.getAmount().compareTo(BigDecimal.ZERO) <= 0) // дубль!
throw new IllegalArgumentException("Amount must be positive");
// ...
}
}
// Хорошо: единое место для правила
public class Money {
public Money(BigDecimal amount) {
if (amount.compareTo(BigDecimal.ZERO) <= 0)
throw new IllegalArgumentException("Amount must be positive");
this.amount = amount;
}
}
KISS (Keep It Simple, Stupid) — «Делай проще»
- Простое решение лучше сложного, если оно решает задачу.
- Не стоит внедрять микросервисы, CQRS и Event Sourcing для CRUD-приложения с 3 экранами.
- Предпочитайте понятный код «умному» коду.
- Архитектурная сложность должна быть оправдана бизнес-требованиями.
YAGNI (You Aren’t Gonna Need It) — «Вам это не понадобится»
- Не реализуйте функциональность «на будущее».
- Проектируйте расширяемую архитектуру, но реализуйте только то, что нужно сейчас.
- Преждевременная оптимизация и преждевременное усложнение — враги хорошей архитектуры.
Пример
// YAGNI нарушение: написали поддержку 5 баз данных, хотя нужна только PostgreSQL
public interface DatabaseAdapter { }
public class PostgresAdapter implements DatabaseAdapter { }
public class MongoAdapter implements DatabaseAdapter { } // не нужен
public class CassandraAdapter implements DatabaseAdapter { } // не нужен
public class RedisAdapter implements DatabaseAdapter { } // не нужен
public class ElasticAdapter implements DatabaseAdapter { } // не нужен
Взаимосвязь принципов
DRY, KISS и YAGNI дополняют друг друга: DRY устраняет дублирование, KISS предостерегает от излишней сложности, а YAGNI — от избыточной функциональности. Вместе они помогают строить системы, которые легко понимать и поддерживать.
На собеседовании: Интервьюер ожидает реальные примеры нарушения каждого принципа из вашего опыта, а не просто расшифровку аббревиатур. Частая ошибка — трактовать DRY как «никогда не дублировать код», забывая, что случайное совпадение — не дублирование знания.