6.6 KiB
Слои Level 1
Пояснение нормативной модели слоёв Level 1.
Базовая структура
src/
├── app/
├── compositions/
├── domains/
├── infra/
├── ui/
└── shared/
src/ здесь является примером SLM root. Фактическую границу определяет устройство приложения.
Отсутствующая в проекте роль не требует пустой папки. Слой является доступной архитектурной ролью, а не обязательным элементом каркаса.
Роли слоёв
App
app связывает приложение с фреймворком: запускает его, объявляет маршруты, преобразует входные данные и подключает публичные API модулей разрешённых слоёв или ресурсы shared. Файлы app являются точками входа фреймворка, а не модулями SLM.
Точка входа может напрямую использовать compositions, domains, infra, ui или shared, если зависимость разрешена матрицей слоёв. Такое использование не переносит ответственность импортируемого модуля в app.
Compositions
compositions содержит продуктовый интерфейс: страницы, макеты, экраны, виджеты, точки входа и другие композиционные модули. Внутреннюю группировку слоя определяет проект.
Domains
domains содержит предметные области приложения: их модели, правила, сценарии и продуктовое состояние. Каждая самостоятельная предметная область представлена доменным модулем.
Доменная логика не принадлежит устройству одной страницы или маршрута. Конкретный visual outcome и сборка нескольких доменов остаются в compositions.
Infra
infra содержит технические сервисы приложения: аналитику, локализацию, тему, телеметрию и другие возможности среды выполнения без самостоятельной доменной модели.
UI
ui содержит универсальные модули интерфейса, которые не зависят от конкретной страницы или продуктовой композиции.
Shared
shared содержит независимый детерминированный фундамент без знания о продукте, изменяемого состояния и ввода-вывода.
В shared допускаются обычные модули и специальные немодульные ресурсы: небольшие чистые утилиты, общие типы, стили, конфигурация и статические файлы. Ресурс не имеет самостоятельной ответственности, публичного API или жизненного цикла и может импортироваться напрямую по пути, установленному стайлгайдом.
Если ресурсу нужны самостоятельная ответственность, собственные архитектурные зависимости, несколько файлов реализации, изменяемое состояние, ввод-вывод или область жизни, он оформляется как модуль. Каталог ресурсов не реэкспортирует модули и не используется для обхода их публичных API.
Матрица зависимостей
app
|
compositions
|
domains
/ \
infra ui
\ /
shared
Код слоя может импортировать модули своего слоя и слоёв, разрешённых строкой матрицы. Разрешённая зависимость может пропускать промежуточные роли.
| Слой | Может импортировать |
|---|---|
app |
app, compositions, domains, infra, ui, shared |
compositions |
compositions, domains, infra, ui, shared |
domains |
domains, infra, ui, shared |
infra |
infra, shared |
ui |
ui, shared |
shared |
shared |
infra и ui не импортируют друг друга. Универсальный UI получает локализованный текст, тему, callbacks аналитики и другие возможности через входной контракт либо связывается с ними в domains или compositions. Если UI-модулю необходимо напрямую знать конкретный технический сервис приложения, такой код не является универсальным UI.
Импорты внутри слоя, публичный API и циклы описаны отдельно в Зависимостях.
Связанные правила
Граница Level 1
Разрешённый импорт не переносит владение. Например, доменный модуль может использовать infra и ui, но технический сервис и универсальный интерфейс сохраняют собственных владельцев.
Если код определяет продуктовую модель, правило или сценарий, он принадлежит domains, а не shared или infra. Строгая внутренняя форма домена появляется только на Level 2.