← Назад к вопросам

Что такое YAGNI?

2.2 Middle🔥 172 комментариев
#Архитектура и паттерны#Опыт и софт-скиллы

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Принцип YAGNI: You Aren't Gonna Need It

YAGNI (You Aren't Gonna Need It) — это один из ключевых принципов экстремального программирования (XP) и гибкой разработки, который гласит: не следует добавлять функциональность в код до тех пор, пока она действительно не потребуется. Иными словами, программист должен избегать преждевременной оптимизации или реализации функций "на будущее", основываясь на предположениях или гипотетических сценариях.

Суть и философия

Философия YAGNI тесно связана с другими принципами, такими как KISS (Keep It Simple, Stupid) и DRY (Don't Repeat Yourself), но фокусируется на минимизации избыточной работы. Основная идея заключается в том, что реализация функционала "про запас" часто приводит к:

  • Усложнению кодовой базы без реальной необходимости.
  • Увеличению времени разработки и отвлечению ресурсов от актуальных задач.
  • Возрастанию риска внесения ошибок в части кода, которые могут никогда не использоваться.
  • Затруднениям в поддержке — другим разработчикам приходится разбираться в лишних абстракциях.

На практике YAGNI призывает разработчиков концентрироваться на текущих требованиях, а не на догадках о будущих потребностях. Это особенно важно в Android-разработке, где требования часто меняются из-за обновлений платформы, новых версий ОС или изменений в дизайне.

Пример в Android-разработке

Рассмотрим типичный сценарий: разработчик создаёт класс для обработки сетевых запросов и предполагает, что в будущем понадобится поддержка нескольких типов API (например, REST и GraphQL). Вместо простого решения он сразу создаёт сложную абстракцию.

Неправильно (нарушение YAGNI):

interface ApiService {
    fun fetchData(): Data
}

class RestApiService : ApiService {
    override fun fetchData(): Data {
        // Реализация для REST
    }
}

class GraphQLApiService : ApiService {
    override fun fetchData(): Data {
        // Реализация для GraphQL (пока не нужна)
    }
}

// Фабрика для выбора сервиса
class ApiServiceFactory {
    fun getService(type: String): ApiService {
        return when (type) {
            "graphql" -> GraphQLApiService()
            else -> RestApiService()
        }
    }
}

В этом примере реализация GraphQLApiService и фабрика избыточны, если текущие требования ограничиваются REST.

Правильно (следование YAGNI):

class RestApiService {
    fun fetchData(): Data {
        // Только необходимая реализация для REST
    }
}

// Если позже понадобится GraphQL, расширяем код

Здесь код остаётся простым и понятным, а новая функциональность добавляется только при появлении конкретного требования.

Преимущества следования YAGNI в Android

  1. Быстрая разработка: Фокус на актуальных задачах ускоряет выпуск MVP и упрощает итерации.
  2. Читаемость кода: Отсутствие лишних абстракций делает код более прозрачным для команды.
  3. Гибкость: Легче вносить изменения, так как код не перегружен гипотетическими сценариями.
  4. Тестируемость: Упрощается написание unit- и instrumented-тестов, так как не нужно покрывать неиспользуемые ветки кода.

Когда YAGNI может быть нарушен?

В некоторых случаях преждевременная реализация оправдана, например:

  • При работе с критически важными компонентами (например, безопасность или архитектурные паттерны типа Repository или UseCase), где изменения в будущем будут слишком затратными.
  • Если требования чётко определены и неизменны на долгосрочную перспективу (редко в современных проектах).

Заключение

YAGNI — это практический принцип, который помогает Android-разработчикам избегать over-engineering и поддерживать высокую скорость разработки. В условиях быстро меняющегося рынка мобильных приложений следование YAGNI позволяет командам оставаться гибкими, снижая технический долг и повышая качество кода. Ключ — баланс: не добавлять лишнего, но и не игнорировать очевидные архитектурные улучшения.