mirror of
https://github.com/gromlab-ru/slm-design.git
synced 2026-09-16 09:20:18 +03:00
85 lines
4.8 KiB
Markdown
85 lines
4.8 KiB
Markdown
# Группы
|
|
|
|
Группа является необязательным навигационным классификатором модулей внутри одного слоя. Она помогает ориентироваться в дереве владельцев, но не реализует ответственность и не создаёт архитектурную границу.
|
|
|
|
## Место в модели
|
|
|
|
Модуль может находиться непосредственно в слое или внутри одной или нескольких групп:
|
|
|
|
```text
|
|
слой
|
|
├── модуль
|
|
└── группа
|
|
├── модуль
|
|
└── группа
|
|
└── модуль
|
|
```
|
|
|
|
Группа создаётся, когда плоский список модулей перестаёт быть понятным. Названия и глубину групп определяет проект.
|
|
|
|
```text
|
|
compositions/
|
|
├── pages/ # Группа
|
|
│ ├── catalog/ # Модуль
|
|
│ └── profile/ # Модуль
|
|
├── layouts/ # Группа
|
|
│ └── main/ # Модуль
|
|
└── widgets/ # Группа
|
|
└── dashboard/ # Модуль, компонующий несколько доменных API
|
|
```
|
|
|
|
Названия `pages`, `layouts` и `widgets` показывают один из вариантов навигации и не создают дополнительные слои или обязательные роли.
|
|
|
|
Модули `catalog`, `profile` и `dashboard` в примере отвечают только за представление и связывание готовых публичных API. Сценарии каталога, профиля и других предметных областей остаются в соответствующих модулях `domains`.
|
|
|
|
## Ограничения группы
|
|
|
|
Группа:
|
|
|
|
- содержит только модули и вложенные группы;
|
|
- не владеет файлами реализации;
|
|
- не имеет состояния или жизненного цикла;
|
|
- не предоставляет публичный API;
|
|
- не является узлом графа зависимостей;
|
|
- не импортируется внешним кодом;
|
|
- не реэкспортирует содержащиеся в ней модули.
|
|
|
|
Barrel-файл, открывающий несколько модулей группы как единый контракт, превращает каталог в новую модульную границу. Если такой контракт действительно нужен, для него определяется ответственность и создаётся обычный модуль.
|
|
|
|
## Группы и зависимости
|
|
|
|
Принадлежность модулей одной или разным группам не влияет на допустимость импорта. Модули одного слоя могут зависеть друг от друга через публичные API, если общий граф остаётся ацикличным.
|
|
|
|
Код импортирует конкретный модуль:
|
|
|
|
```ts
|
|
import { Dashboard } from '@/compositions/widgets/dashboard'
|
|
```
|
|
|
|
Группа не становится промежуточной точкой доступа:
|
|
|
|
```ts
|
|
// Недопустимый API группы
|
|
import { Dashboard } from '@/compositions/widgets'
|
|
```
|
|
|
|
Полные правила графа находятся в разделе [Зависимости](./dependencies.md).
|
|
|
|
## Группа и сегмент
|
|
|
|
Группа организует несколько модулей внутри слоя. [Сегмент](./segments.md) организует код внутри одного модуля.
|
|
|
|
| Группа | Сегмент |
|
|
|---|---|
|
|
| Находится снаружи модульной границы | Находится внутри модульной границы |
|
|
| Содержит модули и группы | Содержит внутреннюю реализацию владельца |
|
|
| Не принадлежит одному модулю | Всегда принадлежит ближайшему модулю |
|
|
| Не содержит файлы реализации | Существует для организации файлов реализации |
|
|
|
|
## Связанные правила
|
|
|
|
- [`SLM-DOMAIN-R022`](../rules/registry.md#slm-domain-r022)
|
|
- [`SLM-GROUP-R007`](../rules/registry.md#slm-group-r007)
|
|
- [`SLM-MODULE-R011`](../rules/registry.md#slm-module-r011)
|
|
- [`SLM-DEPENDENCY-A005`](../rules/registry.md#slm-dependency-a005)
|