mirror of
https://github.com/gromlab-ru/slm-design.git
synced 2026-08-22 07:30:16 +03:00
85 lines
6.9 KiB
Markdown
85 lines
6.9 KiB
Markdown
|
|
# Архитектура SLM
|
|||
|
|
|
|||
|
|
SLM описывает владение ответственностями внутри одного фронтенд-приложения. Слой определяет роль кода, группа классифицирует модули, модуль владеет ответственностью, а сегмент организует реализацию владельца.
|
|||
|
|
|
|||
|
|
## Владение как основа
|
|||
|
|
|
|||
|
|
**Ответственность** — связная часть приложения с одной причиной изменяться. Она становится самостоятельной, когда ей нужны собственный публичный контракт, зависимости, состояние или область жизни.
|
|||
|
|
|
|||
|
|
У каждой самостоятельной ответственности есть ровно один владелец. В SLM владельцем является модуль. Он определяет:
|
|||
|
|
|
|||
|
|
- какие возможности доступны внешним потребителям;
|
|||
|
|
- от каких других возможностей зависит ответственность;
|
|||
|
|
- кому принадлежат данные и изменяемое состояние;
|
|||
|
|
- когда создаются и уничтожаются долгоживущие ресурсы;
|
|||
|
|
- как устроена внутренняя реализация.
|
|||
|
|
|
|||
|
|
Место выполнения кода не меняет владельца. Компонент, провайдер, маршрут или точка запуска могут технически вызывать код ответственности, но не получают владение ею автоматически.
|
|||
|
|
|
|||
|
|
## Структурная модель
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
SLM root
|
|||
|
|
└── слой
|
|||
|
|
├── модуль
|
|||
|
|
│ └── сегмент
|
|||
|
|
└── группа
|
|||
|
|
├── модуль
|
|||
|
|
└── группа
|
|||
|
|
└── модуль
|
|||
|
|
└── сегмент
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
| Сущность | Назначение | Владеет ответственностью |
|
|||
|
|
|---|---|---|
|
|||
|
|
| Слой | Классифицирует код по архитектурной роли | Нет |
|
|||
|
|
| Группа | Классифицирует модули внутри слоя | Нет |
|
|||
|
|
| Модуль | Реализует одну самостоятельную ответственность | Да |
|
|||
|
|
| Сегмент | Организует внутренности одного модуля | Нет |
|
|||
|
|
|
|||
|
|
Слой и группа находятся снаружи модульной границы. Сегмент находится внутри неё. Компоненты, хуки, сервисы, хранилища и другие детали реализации принадлежат ближайшему модулю-владельцу, если сами не образуют вложенный модуль.
|
|||
|
|
|
|||
|
|
## Порядок проектирования
|
|||
|
|
|
|||
|
|
Архитектурное решение принимается от смысла к структуре:
|
|||
|
|
|
|||
|
|
1. Описать результат или поведение, за которое должен отвечать код.
|
|||
|
|
2. Определить одну причину изменения этой ответственности.
|
|||
|
|
3. Найти связанные данные, поведение, состояние и жизненный цикл.
|
|||
|
|
4. Назначить модуль владельцем и определить его внешних потребителей.
|
|||
|
|
5. Выбрать [слой](./layers.md) по роли ответственности.
|
|||
|
|
6. Спроектировать публичный API и допустимые зависимости [модуля](./modules.md).
|
|||
|
|
7. При необходимости организовать реализацию [сегментами](./segments.md).
|
|||
|
|
8. Только после этого выбрать физические пути и имена файлов.
|
|||
|
|
|
|||
|
|
Если ответственность или владелец не определены, файловая структура не может исправить архитектурную неопределённость.
|
|||
|
|
|
|||
|
|
## Логическая и физическая границы
|
|||
|
|
|
|||
|
|
Модуль не определяется наличием папки, `index.ts` или нескольких файлов. Его определяет самостоятельная ответственность и владение её контрактом, зависимостями, состоянием и жизненным циклом.
|
|||
|
|
|
|||
|
|
После принятия решения модуль получает отдельную папку и публичные точки входа. Это обязательное физическое представление модульной границы, необходимое потребителям и автоматическим проверкам.
|
|||
|
|
|
|||
|
|
Верны обе формулировки:
|
|||
|
|
|
|||
|
|
- самостоятельная ответственность требует модульной границы;
|
|||
|
|
- отдельная папка сама по себе не доказывает наличие модуля.
|
|||
|
|
|
|||
|
|
Пути сопоставляются со слоями, группами, модулями и сегментами в стайлгайде или конфигурации конкретного проекта. Имя пути не меняет нормативный смысл сущности.
|
|||
|
|
|
|||
|
|
## Область применения
|
|||
|
|
|
|||
|
|
SLM применяется внутри **SLM root** — границы структурной архитектуры одного приложения. Это может быть `src/` или другая область, установленная проектом.
|
|||
|
|
|
|||
|
|
Архитектура определяет:
|
|||
|
|
|
|||
|
|
- роли слоёв и допустимые направления зависимостей;
|
|||
|
|
- владельцев самостоятельных ответственностей;
|
|||
|
|
- публичные границы модулей;
|
|||
|
|
- назначение групп и сегментов;
|
|||
|
|
- владение состоянием и жизненным циклом ресурсов.
|
|||
|
|
|
|||
|
|
SLM не задаёт обязательный поток данных, полный файловый стайлгайд, фиксированный набор сегментов, правила монорепозиториев или обязательную внутреннюю форму каждого модуля.
|
|||
|
|
|
|||
|
|
Нормативный смысл терминов находится в [терминологии](../reference/terminology.md). Точные блокирующие требования объявлены только в [реестре правил](../rules/registry.md).
|