Use Case Pattern

Use Case Pattern: методология, где описывают не изменение, а систему, и спека живёт столько же, сколько сервис. Паттерн, уровни зрелости, биндинги и скиллы.

Статья внедрена в скилл AI-агента ucp-pattern-review / ucp-pattern-design Эталонная библиотека к статье usecase-pattern

Use Case Pattern — методология, не библиотека. По классу это spec-driven разработка: сначала спецификация, потом код по ней. Отличие от OpenSpec, Spec Kit и Kiro — в единице описания: они описывают изменение и архивируют его после мержа, здесь описывается система — Bounded Context со своими агрегатами, инвариантами и событиями, и спека живёт столько же, сколько сервис. Разбор различий — в сравнении со spec-driven инструментами.

Четыре составляющих:

  1. Сам паттерн. UseCase + Handler + Dispatcher — единый способ описывать бизнес-операции в коде.
  2. Спецификация. Универсальный шаблон того, что должно быть описано про сервис; хранится в git как код.
  3. Три уровня зрелости. Как паттерн и спецификация наращиваются по мере роста сервиса — от слоёного MVP до DDD с десятками интеграций.
  4. Сквозной кейс. Бизнес-описание маркетплейса, на котором проверяется и сам паттерн, и спецификация, и уровни зрелости. Без него методология остаётся теорией.

Скиллы для AI-агентов работают со всеми четырьмя — это инструмент, а не отдельная составляющая.

Контракт и биндинги

Все четыре составляющих язык-нейтральны — это контракт методологии. Реализацию под конкретный стек дают языковые биндинги: те же правила, те же коды, своя идиоматика. Вторая ось — специализация: backend (основной трек), frontend (React + TypeScript, каркас), e2e (зарезервирован).

БиндингСтекСтатус
JavaSpring Boot, jOOQ, эталонные библиотекистатьи в Стандартах, библиотеки, скиллы ucp-*
PythonFastAPI, SQLAlchemy, Pydanticstyle-guide и скиллы ucp-py-* в репо скиллов; статей на сайте пока нет
NodeNestJS, TypeORM, class-validatorstyle-guide и скиллы ucp-node-* в репо скиллов; статей на сайте пока нет
Gonet/http + chi, sqlcв работе

Правило одно и то же на любом стеке: R-UC-3 означает «один UseCase — одна бизнес-операция» и в Java, и в Python, и в Node — меняется только то, как это выглядит в коде. Поэтому команда на любом из стеков читает одни контракты, а AI-скиллы проверяют одни коды правил.


1. Сам паттерн

Каждая бизнес-операция — отдельный UseCase и отдельный UseCaseHandler. Между входом (HTTP, очередь, cron) и выходом (БД, внешние API) проходит UseCaseDispatcher, который сводит их по типу.

вход HTTP, очередь, расписание адаптер входа переводит запрос в UseCase UseCaseDispatcher находит обработчик по типу UseCase UseCaseHandler бизнес-логика одной операции адаптер выхода хранилище, внешние сервисы

Между запросом и логикой стоит тип операции, а не контроллер: откуда пришёл вызов — из HTTP, из очереди или по расписанию — обработчику всё равно.

Главное:

  • Один UseCase — одна бизнес-операция. CreateOrder, ConfirmPayment, GetOrderById. Никаких «универсальных сервисов».
  • Контроллеры, обработчики очередей, cron — разные входные адаптеры к одному и тому же UseCase.
  • Слои не смешивают модели данных. Между ними — явный маппинг.

Паттерн язык-нейтрален. Для Java есть готовая библиотека usecase-pattern; в Python- и Node-биндингах паттерн собирается руками из лёгких интерфейсов — как именно, описывают биндинг-гайды в репо скиллов.


2. Спецификация как код

В основе методологии лежит простое правило: спецификация — это код. Не Word-документ, не Confluence-страница, не PDF от аналитика. Markdown-файл в том же репозитории, что и код сервиса.

Что из этого следует:

  • Спека лежит в git рядом с кодом и проходит через PR-обзор как любой коммит.
  • История изменений видна в git log — кто, когда, почему изменил правило.
  • Формат структурирован: одиннадцать разделов в корневом файле контекста и семь в файле каждого агрегата — с заголовками, таблицами, списками. Это читают и люди, и инструменты — линтеры, генераторы кода, AI-агенты.
  • Контракты выводятся, а не дублируются: из раздела «Commands» получается OpenAPI, из «Domain Events» — AsyncAPI, из «Domain Model» — заготовки агрегатов.
  • Спека и код обязаны совпадать. Расхождение — баг, не «доработаем потом».

Глубина спеки = уровень зрелости сервиса (одна ось 0–3), который спека объявляет полем level во frontmatter:

  • Уровень 0 — As-is. Спека восстановлена из существующего кода без бизнес-брифа (ucp-spec-tier-0): снимок «как сейчас», not-declared для пробелов. Точка отсчёта для миграции.
  • Уровень 1 — Слоёный. Минимальная спека от бизнес-брифа: глоссарий, ER-схема, операции, правила. Без агрегатов и событий.
  • Уровень 2 — Use Case Pattern. Добавляются UseCase-ы и карточки команд/запросов; CQRS + Read Model — опция.
  • Уровень 3 — DDD + Hexagonal. Полная глубина: агрегаты, value objects, доменные события, саги, контракты на рёбрах.

→ Use Case спецификация: универсальный шаблон — что входит в корневой файл, что в файл агрегата и сколько заполнять на каждом уровне зрелости.

Спека → AI-агенты

Поскольку спецификация — это структурированный код, к ней применимы инструменты автоматизации. Для каждой статьи на сайте есть скилл Claude Code, который читает спеку и:

  • генерирует API-контракты из раздела «Commands» (ucp-api-design);
  • генерирует агрегаты и события из «Domain Model» (ucp-ddd-tactical-design);
  • генерирует UseCase + Handler из «Use Cases» (ucp-pattern-design);
  • проверяет код по правилам спеки (ucp-pattern-review, ucp-ddd-tactical-review).

Скиллы есть под каждый биндинг: ucp-* — Java, ucp-py-* — Python, ucp-node-* — Node. Установщик ставит срез под язык и специализацию команды (UCP_LANG × UCP_TRACK).

К статье с привязанным скиллом на сайте показывается жёлтый барсук. К статьям с эталонной библиотекой — зелёный. С эталонным примером проекта — синий. Все скиллы — в github.com/remodov/usecase-pattern-skills.


3. Уровни зрелости

Методология — лестница. Каждый следующий уровень добавляет ответ на проблему, с которой предыдущий уже не справляется. Подняться можно когда есть причина, а не «потому что модно». Уровень — одна ось, спека объявляет его полем level.

Уровень 0 — As-is

Спека восстановлена из существующего кода без бизнес-брифа (ucp-spec-tier-0) — снимок «как сейчас». Не место для жизни, а точка отсчёта. Когда брать: brownfield-сервис в проде без спеки, онбординг, перед миграцией. Когда уходить: сразу после онбординга — заменяешь not-declared бизнес-фактами и проектируешь целевой уровень.

Уровень 1 — Слоёный

Классическая слоёная архитектура (Controller → Service → Repository), без usecase-pattern. Базовая ступень. Когда брать: CRUD, тонкая бизнес-логика, MVP, внутренний инструмент. Когда уходить: когда операции в сервис-классах не различить и нужны метрики/аудит на операцию.

Уровень 2 — Use Case Pattern

Каждая бизнес-операция — отдельный UseCase и обработчик; один общий маршрут, метрики на операцию. CQRS (команды/запросы + Read Model) — опция этого уровня, когда чтение и запись расходятся по нагрузке. Когда брать: заметное число операций, нужна структура. Когда уходить: когда бизнес-правил так много, что они «расползаются» по обработчикам.

Уровень 3 — DDD + Hexagonal

Явная доменная модель (агрегаты, value objects, доменные события) + изоляция инфраструктуры через порты и адаптеры с проверкой границ ArchUnit. Бизнес-логика живёт в домене, инфраструктура подменяема. Когда брать: сложные инварианты, важен язык, выделены границы (Bounded Context), десятки интеграций, долгий горизонт жизни.

Подсказка по выбору

Что в проектеУровень
CRUD, тонкая бизнес-логика, MVP1
Заметное число операций; разная нагрузка на чтение и запись2
Сложные инварианты, доменный язык, много интеграций, изоляция от инфраструктуры3

В одном сервисе разные модули могут жить на разных уровнях: ядро бизнеса — на 3-м, справочники — на 1-м. Это нормально и часто выгоднее, чем «всё на 3-м для единообразия». As-is из существующего кода — Уровень 0.


4. Сквозной кейс

Методология остаётся теорией, пока не приземлена на конкретный бизнес. Поэтому к ней прилагается сквозной кейс — маркетплейс: бизнес-описание в формате «как я понял задачу», без архитектурных терминов.

Кейс — равноправная часть методологии:

  • Стартовая точка для каждого нового сервиса. Перед спекой и кодом — текст про бизнес. Если бизнес не сформулирован, дальше идти бесполезно.
  • Эталон для скиллов. Бизнес-описание прогоняется через скиллы (/api-design, /ddd-tactical-design, /usecase-pattern-design), и из него генерируются API-контракты, агрегаты, UseCase-ы — мы видим, что методология работает.
  • Общая система координат для всех статей сайта. DDD, CQRS, Saga, Resilience4j, OAuth2 — всё разбирается на одном и том же кейсе. Не нужно каждый раз придумывать новый домен.

→ Кейс: маркетплейс — бизнес-описание: стейкхолдеры, глоссарий, процессы, правила, ошибки, целевые объёмы.

Из этого текста через скиллы получаются артефакты по каждому сервису кейса. Что уже разобрано:

Остальные сервисы кейса — Payment, Customer и Backoffice — появятся по мере наполнения.


Главные правила

Шесть принципов, общих для всех уровней зрелости. Технические подробности — в специализированных статьях по ссылкам.

  1. Один UseCase — одна бизнес-операция. Никаких «универсальных сервисов».
  2. Слои не смешивают модели данных. API-модель ≠ доменная модель ≠ модель хранения.
  3. Внешние зависимости — за интерфейсами. Платёжный шлюз, шина, отправка SMS — всё через порты.
  4. Одна бизнес-операция — одна транзакция. Всё или ничего.
  5. События публикуются атомарно с записью. Никаких «записал, а событие не дошло».
  6. Идемпотентность обязательна там, где она имеет смысл — платежи, создание заказов, повторные доставки сообщений.

Карта сайта

Каждый слой опирается на устоявшиеся практики. Сайт — методичный разбор каждой из них.

Controller / адаптер входа

UseCase + Handler (бизнес-логика)

Адаптер выхода / данные

Cross-cutting

Архитектура и проектирование

Спецификация и команда


Дальше