mirror of
https://github.com/gromlab-ru/slm-design.git
synced 2026-08-22 07:30:16 +03:00
86 lines
5.0 KiB
Markdown
86 lines
5.0 KiB
Markdown
|
|
# Слои Level 1
|
|||
|
|
|
|||
|
|
> Пояснение нормативной модели слоёв Level 1.
|
|||
|
|
|
|||
|
|
## Базовая структура
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
src/
|
|||
|
|
├── app/
|
|||
|
|
├── compositions/
|
|||
|
|
├── infra/
|
|||
|
|
├── ui/
|
|||
|
|
└── shared/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
`src/` здесь является примером SLM root. Фактическую границу определяет устройство приложения.
|
|||
|
|
|
|||
|
|
Отсутствующая в проекте роль не требует пустой папки. Слой является доступной архитектурной ролью, а не обязательным элементом каркаса.
|
|||
|
|
|
|||
|
|
## Роли слоёв
|
|||
|
|
|
|||
|
|
### App
|
|||
|
|
|
|||
|
|
`app` связывает приложение с фреймворком: запускает его, объявляет маршруты, преобразует входные данные и подключает публичные API нижних модулей или ресурсы `shared`. Файлы `app` являются точками входа фреймворка, а не модулями SLM.
|
|||
|
|
|
|||
|
|
Точка входа может напрямую использовать `compositions`, `infra`, `ui` или `shared`, если зависимость разрешена общим порядком слоёв. Такое использование не переносит ответственность нижнего модуля в `app`.
|
|||
|
|
|
|||
|
|
### Compositions
|
|||
|
|
|
|||
|
|
`compositions` содержит продуктовый интерфейс: страницы, макеты, экраны, виджеты, точки входа и другие композиционные модули. Внутреннюю группировку слоя определяет проект.
|
|||
|
|
|
|||
|
|
### Infra
|
|||
|
|
|
|||
|
|
`infra` содержит технические сервисы приложения: аналитику, локализацию, тему, телеметрию и другие возможности среды выполнения без самостоятельной доменной модели.
|
|||
|
|
|
|||
|
|
### UI
|
|||
|
|
|
|||
|
|
`ui` содержит универсальные модули интерфейса, которые не зависят от конкретной страницы или продуктовой композиции.
|
|||
|
|
|
|||
|
|
### Shared
|
|||
|
|
|
|||
|
|
`shared` содержит независимый детерминированный фундамент без знания о продукте, изменяемого состояния и ввода-вывода.
|
|||
|
|
|
|||
|
|
В `shared` допускаются обычные модули и специальные немодульные ресурсы: небольшие чистые утилиты, общие типы, стили, конфигурация и статические файлы. Ресурс не имеет самостоятельной ответственности, публичного API или жизненного цикла и может импортироваться напрямую по пути, установленному стайлгайдом.
|
|||
|
|
|
|||
|
|
Если ресурсу нужны самостоятельная ответственность, собственные архитектурные зависимости, несколько файлов реализации, изменяемое состояние, ввод-вывод или область жизни, он оформляется как модуль. Каталог ресурсов не реэкспортирует модули и не используется для обхода их публичных API.
|
|||
|
|
|
|||
|
|
## Порядок слоёв
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
app
|
|||
|
|
↓
|
|||
|
|
compositions
|
|||
|
|
↓
|
|||
|
|
infra
|
|||
|
|
↓
|
|||
|
|
ui
|
|||
|
|
↓
|
|||
|
|
shared
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Код слоя может импортировать модули своего или любого нижнего слоя. Промежуточные слои можно пропускать.
|
|||
|
|
|
|||
|
|
| Слой | Может импортировать нижние слои |
|
|||
|
|
|---|---|
|
|||
|
|
| `app` | `compositions`, `infra`, `ui`, `shared` |
|
|||
|
|
| `compositions` | `infra`, `ui`, `shared` |
|
|||
|
|
| `infra` | `ui`, `shared` |
|
|||
|
|
| `ui` | `shared` |
|
|||
|
|
| `shared` | Нет |
|
|||
|
|
|
|||
|
|
Импорты внутри слоя, публичный API и циклы описаны отдельно в [Зависимостях](./dependencies.md).
|
|||
|
|
|
|||
|
|
## Связанные правила
|
|||
|
|
|
|||
|
|
- [`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-L1-MODULE-R011`](../rules/level-1.md#slm-l1-module-r011)
|
|||
|
|
|
|||
|
|
## Граница Level 1
|
|||
|
|
|
|||
|
|
Разрешённый импорт не переносит владение. Например, `infra` может использовать `ui`, но продуктовый интерфейс по-прежнему принадлежит `compositions`.
|
|||
|
|
|
|||
|
|
Самостоятельная доменная модель или сценарий являются сигналом рассмотреть Level 2, а не расширять ответственность `shared` или `infra`.
|