Gymterview
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 как «никогда не дублировать код», забывая, что случайное совпадение — не дублирование знания.