mirror of
https://github.com/gromlab-ru/slm-design.git
synced 2026-08-22 07:30:16 +03:00
64 lines
5.5 KiB
Markdown
64 lines
5.5 KiB
Markdown
# Граница домена
|
||
|
||
> Пояснение предметной и структурной границы 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`, только когда работает с контрактом домена и не определяет страницу, маршрут или продуктовую композицию.
|