mirror of
https://github.com/gromlab-ru/slm-design.git
synced 2026-08-22 15:30:16 +03:00
75 lines
3.8 KiB
Markdown
75 lines
3.8 KiB
Markdown
|
|
# Слои Level 2
|
|||
|
|
|
|||
|
|
> Пояснение нормативной модели слоёв Level 2.
|
|||
|
|
|
|||
|
|
Level 2 добавляет `domains` между продуктовой композицией и техническими сервисами приложения.
|
|||
|
|
|
|||
|
|
## Базовая структура
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
src/
|
|||
|
|
├── app/
|
|||
|
|
├── compositions/
|
|||
|
|
├── domains/
|
|||
|
|
├── infra/
|
|||
|
|
├── ui/
|
|||
|
|
└── shared/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Отсутствующая роль не требует пустой папки. Проект без самостоятельной доменной ответственности может оставаться на Level 1.
|
|||
|
|
|
|||
|
|
## Роли слоёв
|
|||
|
|
|
|||
|
|
| Слой | Роль |
|
|||
|
|
|---|---|
|
|||
|
|
| `app` | Запуск, маршруты, преобразование входных данных и подключение готовых публичных API |
|
|||
|
|
| `compositions` | Страницы, макеты, экраны, виджеты и конкретные продуктовые композиции |
|
|||
|
|
| `domains` | Предметные области, их модели, правила, сценарии и продуктовое состояние |
|
|||
|
|
| `infra` | Технические сервисы и возможности приложения без самостоятельной предметной модели |
|
|||
|
|
| `ui` | Универсальные модули интерфейса без зависимости от конкретной продуктовой композиции |
|
|||
|
|
| `shared` | Независимый детерминированный фундамент без знания о продукте, состояния и ввода-вывода |
|
|||
|
|
|
|||
|
|
## Порядок слоёв
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
app
|
|||
|
|
↓
|
|||
|
|
compositions
|
|||
|
|
↓
|
|||
|
|
domains
|
|||
|
|
↓
|
|||
|
|
infra
|
|||
|
|
↓
|
|||
|
|
ui
|
|||
|
|
↓
|
|||
|
|
shared
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Код слоя может импортировать модули своего или любого нижнего слоя. Промежуточные слои можно пропускать.
|
|||
|
|
|
|||
|
|
| Слой | Может импортировать другие слои |
|
|||
|
|
|---|---|
|
|||
|
|
| `app` | `compositions`, `domains`, `infra`, `ui`, `shared` |
|
|||
|
|
| `compositions` | `domains`, `infra`, `ui`, `shared` |
|
|||
|
|
| `domains` | `infra`, `ui`, `shared` |
|
|||
|
|
| `infra` | `ui`, `shared` |
|
|||
|
|
| `ui` | `shared` |
|
|||
|
|
| `shared` | Нет |
|
|||
|
|
|
|||
|
|
Импорты между модулями одного слоя разрешены. Поэтому один доменный модуль может зависеть от публичного API другого доменного модуля, если общий граф остаётся ацикличным.
|
|||
|
|
|
|||
|
|
## Границы ролей
|
|||
|
|
|
|||
|
|
`compositions` определяет устройство конкретной страницы, маршрута или визуального результата. `domains` определяет повторяемую предметную семантику, которая не принадлежит одной композиции.
|
|||
|
|
|
|||
|
|
`infra` предоставляет техническую возможность. Если код определяет продуктовую модель, правило или сценарий поверх этой возможности, владельцем такого кода является доменный модуль.
|
|||
|
|
|
|||
|
|
Разрешённый импорт не переносит владение. Доменный модуль может использовать `infra` и `ui`, но технический сервис и универсальный интерфейс сохраняют собственных владельцев.
|
|||
|
|
|
|||
|
|
## Связанные правила
|
|||
|
|
|
|||
|
|
- [`SLM-L1-LAYER-R001`](../rules/level-1.md#slm-l1-layer-r001)
|
|||
|
|
- [`SLM-L1-LAYER-A002`](../rules/level-1.md#slm-l1-layer-a002)
|
|||
|
|
- [`SLM-L1-LAYER-R003`](../rules/level-1.md#slm-l1-layer-r003)
|
|||
|
|
- [`SLM-L2-DOMAIN-R001`](../rules/level-2.md#slm-l2-domain-r001)
|