Files
slm-design/DRAFT/level-3/domains/domain.md

64 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Граница домена
> Пояснение предметной и структурной границы Level 3.
## Связанные правила
- [`SLM-L3-DOMAIN-R001`](../../rules/level-3.md#slm-l3-domain-r001)
- [`SLM-L3-DOMAIN-A002`](../../rules/level-3.md#slm-l3-domain-a002)
- [`SLM-L3-BUSINESS-R003`](../../rules/level-3.md#slm-l3-business-r003)
- [`SLM-L1-MODULE-R011`](../../rules/level-1.md#slm-l1-module-r011)
- [`SLM-L1-GROUP-R007`](../../rules/level-1.md#slm-l1-group-r007)
## Предметная граница
Домен представляет одну связную предметную область: `auth`, `catalog`, `orders` или `checkout`. Он объединяет её бизнес-логику, технические интеграции, повторяемые сборки и модули фреймворков, но не превращается в большой модуль со смешанными ролями.
Домен является предметной границей, а не владельцем исполняемого кода в смысле Level 1. Каждый сценарий, адаптер и способ сборки принадлежит конкретному модулю. Поэтому одна предметная область может иметь несколько публичных API, не нарушая правило о единственном владельце ответственности.
## Структурные виды и роли
| Путь | Роль | Структурный вид |
|---|---|---|
| `domains/auth` | Предметная область авторизации | Домен |
| `domains/auth/business` | Бизнес-логика | Модуль |
| `domains/auth/business/ports` | Необходимые бизнес-логике возможности | Сегмент |
| `domains/auth/presets` | Навигация по типовым сборкам | Группа |
| `domains/auth/presets/application` | Сборка уровня приложения | Модуль |
| `domains/auth/presets/application/adapters` | Закрытые адаптеры сборки | Сегмент |
| `domains/auth/adapters` | Навигация по самостоятельным адаптерам | Группа |
| `domains/auth/adapters/identity-provider` | Повторно используемый адаптер | Модуль |
| `domains/auth/react` | Связь с React | Модуль |
Роль отвечает на вопрос, что делает код. Структурный вид определяет, какую архитектурную границу он образует. Имя папки само по себе не доказывает ни роль, ни структурный вид.
## Корень домена
Корень домена не содержит реализацию, состояние, ресурсы жизненного цикла, `index.ts` или общий файл реэкспортов. Его прямыми детьми могут быть модуль `business`, группы `presets` и `adapters`, а также модули фреймворков, например `react`.
Корневые ветки `model`, `types`, `errors`, `lib`, `ui`, `client`, `server` или `tests` не создаются автоматически. Такой каталог должен быть либо сегментом модуля-владельца, либо самостоятельным модулем с одной из допустимых ролей домена.
## Публичная граница
```text
@/domains/auth/business
@/domains/auth/presets/application
@/domains/auth/react
```
Эти пути являются публичными API отдельных модулей. Корневого пути `@/domains/auth` для исполняемого кода не существует: он не должен объединять независимый от среды модуль `business`, клиентский React и серверную сборку через `export *`.
## Граница с другими слоями
| Ответственность | Владелец |
|---|---|
| Предметные сценарии, контракты, модель состояния и ошибки | `domains/auth/business` |
| Технический адаптер одной сборки | Сегмент соответствующего модуля в `presets` |
| Повторно используемая интеграция авторизации | Самостоятельный модуль адаптера |
| Повторяемая сборка `AuthApi` | Модуль в `presets` |
| Провайдер, хук и относящийся к домену интерфейс React | `domains/auth/react` |
| Страница, маршрут, перенаправление, экран и конкретный визуальный результат | Модуль `compositions` |
| Обёртка над SDK или технический сервис без семантики авторизации | Модуль `infra` |
Зависимость от фреймворка сама по себе не делает интерфейс частью домена. Компонент принадлежит `react`, только когда работает с контрактом домена и не определяет страницу, маршрут или продуктовую композицию.