Use Case спецификация: универсальный шаблон

Универсальный шаблон спецификации сервиса: 16 разделов, три уровня детализации (Tier A/B/C). Подходит для legacy, UCP и DDD-сервисов.

Статья внедрена в скилл AI-агента ucp-spec-design Эталонная библиотека к статье usecase-pattern Use Case спецификация

Спецификация сервиса — контракт между бизнесом и разработкой. Заполняется совместно бизнес-аналитиком, архитектором и разработчиками; после заполнения содержит всё необходимое для реализации: от бизнес-терминов до критериев приёмки и НФТ.

Перед заполнением — соберите данные через Event Storming. Это workshop на 4-8 часов, который параллельно с командой и бизнесом выявляет события, акторы, бизнес-правила, агрегаты и границы контекстов. Каждый артефакт workshop ложится в конкретный раздел этой спеки. → Event Storming: workshop, который собирает данные для DDD-спеки

Это универсальный шаблон, не привязанный к конкретному стилю архитектуры. Он одинаково подходит legacy-системе со слоёной архитектурой, сервису на Use Case Pattern (Levels 1–2) и полноценному DDD/Hexagonal-сервису (Levels 3–4). Конкретная глубина каждого раздела зависит от Tier (см. ниже).

Сквозных примеров нет — только структура. Заполненные примеры по сервисам маркетплейса — в разделе Кейс.

Гайды по ролям

РольГайдЧто внутри
Бизнес-аналитикгайд BAКак заполнять каждый раздел простым языком
Архитекторгайд архитектораГраницы контекстов, агрегаты, Outbox, Saga, интеграции, НФТ
Разработчикгайд разработчикаJava/Spring: пакеты, модель, state machine, commands, events, API
QAгайд тестировщикаМатрицы переходов, BR-тесты, авторизация, E2E, Saga, нагрузка
DevOpsгайд DevOpsPostgreSQL, Kafka, K8s, мониторинг, алерты, масштабирование
Securityгайд securityIDOR, PII, rate limiting, TLS, аудит, OWASP Top 10
Дизайнергайд дизайнераЭкраны, статусы в UI, ошибки, валидация, дизайн-система
Сопровождениегайд сопровожденияИнциденты, зависшие Saga, SQL-диагностика, эскалация
AI-агентгайд AI-агентаГенерация кода/тестов, ревью, актуализация спецификации

Уровни спеки (Tier A / B / C)

Глубина спеки зависит от архитектурного стиля сервиса. Не каждый сервис — DDD; для legacy-кода полная DDD-спека избыточна. Поэтому шаблон делится на три уровня — Tier:

TierАрхитектураПривязка к UCP-уровням
A. Legacy / слоёнаяController → Service → Repository, без библиотеки usecase-pattern
B. UseCase Patternподключена usecase-pattern, есть UseCase + UseCaseHandler (с CQRS-маркерами или без)UCP Level 1–2
C. DDD / Hexagonal+ агрегаты, доменные события, ports/adaptersUCP Level 3–4

Каждый раздел шаблона помечен минимальным Tier-ом, на котором он становится обязательным:

  • 🟦 A — обязательно для всех систем, включая legacy.
  • 🟩 B — добавляется на Tier B (UCP L1–L2). На Tier A раздел упрощён или отсутствует.
  • 🟪 C — добавляется на Tier C (UCP L3–L4). Раньше — упрощён или не нужен.
РазделTier ATier BTier C
1. Bounded Context⭕ как «модуль»
2. Ubiquitous Language
3. Domain Modelтолько ER + таблицы+ UseCase-модели+ агрегаты, VO, события
4. Жизненный циклесли есть статусы
5. Роли и права
6. Бизнес-правила
7. Commandsсписок операцийUseCase-команды+ предусловия / события
8. Domain Events⭕ если есть Kafka
9. Queries / Read Modelсписок read-операций+ Read Model на L2
10. Use Casesсценарии+ ссылки на UseCase
11. UI
12. Saga⭕ редко
13. Каталог ошибок
14. Интеграциибазовые контракты+ UseCase как порты+ Context Mapping типы
15. Критерии приёмки
16. НФТ

✅ обязательно · ⭕ упрощённо / опционально · ❌ не пишется

В заголовке вашей спеки явно укажите Tier: «Order Service — DDD-спецификация (Tier C)». Это сразу задаёт читателю ожидания от глубины разделов.


Содержание

  1. Bounded Context 🟦
  2. Ubiquitous Language 🟦
  3. Domain Model 🟦
  4. Жизненный цикл и состояния 🟦
  5. Роли и права доступа 🟦
  6. Бизнес-правила и инварианты 🟦
  7. Commands 🟦
  8. Domain Events 🟩
  9. Queries / Read Model 🟦
  10. Use Cases 🟦
  11. UI-спецификация 🟦
  12. Saga / Process Manager 🟪
  13. Каталог ошибок 🟦
  14. Интеграции (Context Mapping) 🟦
  15. Критерии приёмки 🟦
  16. Нефункциональные требования 🟦

1. Bounded Context

🟦 Tier A+ · на A называется «модуль» / «компонент», понятие Bounded Context не нужно.

Назначение. Зафиксировать границу одного смыслового контекста: какой бизнес-процесс он обслуживает, что внутри, что снаружи.

Что должно быть:

  • Название контекста и его краткая миссия в одной фразе.
  • Внутри контекста: бизнес-возможности, агрегаты, владелец данных.
  • Снаружи: соседние контексты, с которыми он общается, и роль (upstream / downstream / shared kernel).
  • Стейкхолдеры и владелец (product owner, ответственная команда).
  • Диаграмма C1 — System Context (Mermaid или draw.io): пользователи, внешние системы, сам контекст одной коробкой.

Формат:

  • Текст 5–15 строк + одна C1-диаграмма.
  • Никаких таблиц и кода — это самый верхний уровень.

2. Ubiquitous Language

🟦 Tier A+ · обязательно для всех уровней, без него невозможно говорить ни с бизнесом, ни в коде.

Назначение. Зафиксировать словарь домена: каждый термин — одно значение, без синонимов и омонимов. Один и тот же термин в коде, БД, UI, разговоре.

Что должно быть:

  • Глоссарий в виде таблицы: термин (рус) — термин (en, как в коде) — определение — пример употребления.
  • Запрещённые синонимы: пары «не путать» (например, «заявка ≠ заказ ≠ корзина»).
  • Решения по неоднозначным словам: что такое «клиент», «пользователь», «покупатель» именно в этом контексте.

Формат:

Русский терминВ кодеОпределениеПример

3–7 столбцов, без длинных описаний — каждое определение в 1–2 строках.


3. Domain Model

🟦 Tier A+ · содержание сильно меняется по уровню:

  • Tier A — только ER-схема и список таблиц.
  • Tier B — + модели UseCase-входов / выходов (JsonBean, Pojo, View).
  • Tier C — + агрегаты, value objects, доменные события, C3-диаграмма.

Назначение. Описать структуру предметной области: агрегаты, сущности, value objects и связи между ними.

Что должно быть:

3.1 Агрегаты

  • Список корней агрегатов и их инвариантов (что не должно нарушаться никогда).
  • Размер агрегата — количество сущностей внутри. Big aggregate ≠ масштабируемо.
  • Граница транзакции = граница агрегата.

3.2 Сущности

  • Сущности, входящие в агрегат, и их жизненный цикл внутри корня.
  • Внешние ссылки — только по ID соседнего агрегата.

3.3 Value Objects

  • Список VO с инвариантами, которые они защищают (Money, Email, Quantity).
  • Никаких ID, immutable.

3.4 Схема БД

  • ER-диаграмма или DDL-наброски на уровне таблиц + ключей. Без рантайм-индексов.
  • Связь «таблица ↔ агрегат» (одна таблица может покрывать целый агрегат, могут быть и подтаблицы).

3.5 Диаграмма C3 — Domain Model

  • Mermaid или PlantUML: классы агрегатов, сущности, VO, связи, кардинальности.

Формат:

  • 1 C3-диаграмма + список агрегатов + DDL/ER. Без бизнес-правил (они в §6).

4. Жизненный цикл и состояния

🟦 Tier A+ · если сущность имеет статусы / state machine. Иначе раздел пропускается.

Назначение. Зафиксировать, какие состояния может принимать ключевая сущность и какие переходы разрешены.

Что должно быть:

  • Перечисление состояний (enum в коде).
  • Матрица переходов: «из какого в какое можно», «при какой команде».
  • State diagram (Mermaid stateDiagram-v2).
  • Терминальные состояния и условия отката.
  • Time-based переходы (например, автоматический cancel через N часов).

Формат:

ИзКомандаВУсловие
  • диаграмма состояний.

5. Роли и права доступа

🟦 Tier A+ · обязательно для любого сервиса с пользователями; формат не меняется по Tier.

Назначение. Кто что может делать с командами и запросами этого контекста.

Что должно быть:

  • Список ролей (Customer, Seller, Admin, Support и т.п.).
  • Матрица прав: команда / запрос → разрешённые роли.
  • Условия владения (ABAC): «покупатель видит только свои заказы», «продавец — заказы по своим товарам».
  • Маркировка PII в data-моделях (для §16 NFR / Security).

Формат:

Команда / QueryCustomerSellerAdminABAC-условие

6. Бизнес-правила и инварианты

🟦 Tier A+ · обязательно. На Tier C добавляется столбец «инвариант агрегата».

Назначение. Перечислить ВСЕ правила, которые домен обязан соблюдать. Их код должен валидировать; QA — тестировать.

Что должно быть:

  • Каждое правило — отдельной строкой с уникальным кодом (BR-001, BR-002).
  • Тип: инвариант (всегда истинно), предусловие (для команды), постусловие.
  • Связь: какой агрегат / команда / событие правило затрагивает.
  • Сообщение об ошибке (для §13 каталог ошибок).

Формат:

КодПравилоТипЗатрагиваетОшибка
BR-001инвариантOrderORDER_INVALID_STATE

7. Commands

🟦 Tier A+ · содержание меняется:

  • Tier A — список операций (метод сервиса / endpoint), без явной CQRS-модели.
  • Tier B — каждая операция = UseCase или UseCaseCommand (на L2). Указывается useCaseType и handler.
  • Tier C — + предусловия, постусловия, публикуемые события, изменения состояния агрегата.

Назначение. Список всех операций, изменяющих состояние контекста.

Что должно быть для каждой команды:

  • Имя в инфинитиве: CreateOrder, ConfirmPayment.
  • Цель в одной фразе.
  • Входные данные: поля + типы + валидации.
  • Предусловия: какие BR должны быть выполнены до.
  • Эффекты: какие поля агрегата меняются, какие события публикуются.
  • Кто может вызвать (роли из §5).
  • Идемпотентность: ключ или явное «не идемпотентна».
  • Ошибки (коды из §13).

Формат:

Список команд + 1 короткая карточка на команду (5–10 строк). Без полного OpenAPI здесь — он в §10 / API.


8. Domain Events

🟩 Tier B+ · на Tier A раздел пропускается (legacy редко публикует доменные события). На Tier B — только если сервис реально публикует/потребляет события (например, Kafka).

Назначение. Список всех событий, которые контекст публикует и/или потребляет.

Что должно быть для каждого события:

  • Имя в прошедшем времени: OrderPaid, ItemReserved.
  • Когда возникает: триггерная команда + условие.
  • Payload: поля события (только идентификаторы и значения, без ссылок на агрегаты).
  • Внутреннее vs внешнее: остаётся в bounded context или публикуется в Kafka.
  • Подписчики: какие контексты слушают (для §14 интеграций).
  • Версионирование схемы (если событие — внешний контракт).

Формат:

Карточка на событие + сводная таблица «событие → топик → подписчики».


9. Queries / Read Model

🟦 Tier A+ · содержание зависит от уровня:

  • Tier A — список read-операций (GET endpoint-ов).
  • Tier B (L2) — + UseCaseQuery и Read Model (View / отдельная таблица) — раздел значимо расширяется.
  • Tier C — + источник Read Model (проекция из событий, реплика, кэш) и согласованность.

Назначение. Список запросов на чтение и структура read-моделей (отдельно от write-side).

Что должно быть:

  • Список запросов с входными параметрами и формой ответа.
  • Read Model: какие представления (*View, materialized view, отдельные таблицы) собирают данные для чтения.
  • Источник данных read-модели: проекция из событий, отдельный кэш, реплика.
  • Согласованность: eventual / strong, типичный лаг.
  • API-контракт (OpenAPI-набросок) — если запрос наружу.

Формат:

Список запросов + ссылка на OpenAPI / контракт. Read Model — отдельная подсекция со схемой.


10. Use Cases

🟦 Tier A+ · на Tier A — обычные user-сценарии. На Tier B — добавляются ссылки на конкретные UseCase-ы. На Tier C — + участвующие агрегаты, события, саги.

Назначение. Сквозные сценарии: как команды и запросы складываются в бизнес-операции конечного пользователя.

Что должно быть для каждого use case:

  • Актор и цель.
  • Триггер: что запускает сценарий.
  • Основной поток — пронумерованные шаги.
  • Альтернативные потоки и обработка ошибок.
  • Ссылки на команды (§7), запросы (§9), события (§8) и саги (§12), которые задействованы.

Формат:

Карточка на use case (10–25 строк) + sequence-диаграмма для нетривиальных.


11. UI-спецификация

🟦 Tier A+ · если у сервиса есть UI / front-end. Формат от уровня не зависит.

Назначение. Список экранов, на которых проявляются команды и состояния.

Что должно быть:

  • Реестр экранов: имя, ссылка на макет, какие команды/запросы вызывает.
  • Связь UI ↔ состояния из §4: какие состояния как отображаются (бейджи, цвета).
  • Сообщения об ошибках (тексты для каждого кода из §13).
  • Дизайн-система: ссылка на компоненты, токены.

Формат:

Таблица экранов + ссылки на Figma / wireframes. Сами макеты в этой статье не лежат.


12. Saga / Process Manager

🟪 Tier C+ · на Tier A раздел пропускается. На Tier B — только если в сервисе действительно есть длинные межагрегатные процессы (редко).

Назначение. Описать длительные межагрегатные / межсервисные процессы.

Что должно быть для каждой саги:

  • Имя саги и её цель.
  • Шаги: команда → ожидаемое событие → следующая команда.
  • Компенсации для каждого шага: «если не получилось — откатить так».
  • Таймауты: сколько ждём каждое событие, что делаем при истечении.
  • Хранилище состояния саги (своя таблица, snapshot, event-sourced).
  • Sequence-диаграмма (Mermaid).

Формат:

Карточка + диаграмма. Реализация (Spring + Outbox) — в гайде разработчика, не здесь.


13. Каталог ошибок

🟦 Tier A+ · обязательно. Формат не зависит от Tier.

Назначение. Единый список доменных ошибок, на которые ссылаются команды (§7), запросы (§9), UI (§11).

Что должно быть:

КодHTTPСообщение (RU)Сообщение (EN)Когда возникает
ORDER_NOT_FOUND404Заказ не найденOrder not found
  • Коды — UPPER_SNAKE_CASE, согласованы с RFC 9457 ProblemDetails (см. REST API style guide).

14. Интеграции (Context Mapping)

🟦 Tier A+ · содержание расширяется:

  • Tier A — базовые контракты (REST / SOAP / БД).
  • Tier B — + интеграции через UseCase (порт = интерфейс UseCase, реализуемый внешним адаптером).
  • Tier C — + явные типы Context Mapping: ACL, Open Host Service, Conformist, Customer/Supplier, Shared Kernel.

Назначение. Зафиксировать, как этот контекст общается с соседями.

Что должно быть для каждой пары контекстов:

  • Тип связи: Conformist, ACL, Open Host Service, Published Language, Shared Kernel, Customer/Supplier.
  • Канал: REST, gRPC, Kafka, файлы.
  • Контракт: OpenAPI / схема события (ссылка).
  • Гарантии: at-least-once / exactly-once / at-most-once; идемпотентность; порядок.
  • Ответственный за миграцию контракта (upstream).
  • Диаграмма C2 уровня всей системы — общая, в case или strategic, не в каждом BC отдельно.

Формат:

Таблица «контекст A → контекст B» + ссылки на контракты.


15. Критерии приёмки

🟦 Tier A+ · обязательно. Формат не зависит от Tier.

Назначение. Условия, по которым фича считается готовой.

Что должно быть:

  • Acceptance criteria на каждый use case (Given/When/Then или нумерованный список).
  • Покрытие тестами: какие BR-правила (§6) каким уровнем теста (unit/integration/e2e) проверяются.
  • Вход в прод: feature flag, канареечный rollout, дашборды.

Формат:

Чек-лист на use case. Не путать с отдельным гайдом QA — там методология тестов, здесь — конкретные критерии.


16. Нефункциональные требования

🟦 Tier A+ · обязательно для всех. Формат не зависит от Tier.

Назначение. Зафиксировать ограничения вне функциональных сценариев.

Что должно быть:

  • Производительность: целевой p95/p99 latency, RPS, размер агрегата.
  • Доступность: SLA / SLO (например, 99.9 %).
  • Согласованность: где допустим eventual, где обязательна strong.
  • Безопасность: PII, аудит, retention, шифрование (см. гайд security).
  • Наблюдаемость: ключевые метрики, логи, трейсы; алерты при их пропадании.
  • Капасити: storage и трафик на 1 / 6 / 12 месяцев.
  • Compliance: 152-ФЗ, GDPR, PCI DSS — если применимо.

Формат:

Таблица «требование → значение → как измеряется → как алёртить».


Дальше

  • Гайды по ролям — как заполнять каждый раздел в зависимости от твоей роли (см. таблицу выше).
  • Реальные примеры заполнения шаблона на сервисах маркетплейса — в кейсе (по DDD-спецификации на каждый микросервис).
  • Тактические паттерны DDD — как §3 (Domain Model) переводится в код.
  • REST API Style Guide — как §7 (Commands) и §9 (Queries) превращаются в OpenAPI.
  • Распределённые паттерны — как §12 (Saga) реализуется с Outbox.