Files
slm-design/docs/architecture/groups.md

85 lines
4.8 KiB
Markdown
Raw Normal View History

2026-08-10 12:37:32 +03:00
# Группы
Группа является необязательным навигационным классификатором модулей внутри одного слоя. Она помогает ориентироваться в дереве владельцев, но не реализует ответственность и не создаёт архитектурную границу.
## Место в модели
Модуль может находиться непосредственно в слое или внутри одной или нескольких групп:
```text
слой
├── модуль
└── группа
├── модуль
└── группа
└── модуль
```
Группа создаётся, когда плоский список модулей перестаёт быть понятным. Названия и глубину групп определяет проект.
```text
compositions/
├── pages/ # Группа
│ ├── catalog/ # Модуль
│ └── profile/ # Модуль
├── layouts/ # Группа
│ └── main/ # Модуль
└── widgets/ # Группа
2026-08-10 14:42:29 +03:00
└── dashboard/ # Модуль, компонующий несколько доменных API
2026-08-10 12:37:32 +03:00
```
Названия `pages`, `layouts` и `widgets` показывают один из вариантов навигации и не создают дополнительные слои или обязательные роли.
2026-08-10 14:42:29 +03:00
Модули `catalog`, `profile` и `dashboard` в примере отвечают только за представление и связывание готовых публичных API. Сценарии каталога, профиля и других предметных областей остаются в соответствующих модулях `domains`.
2026-08-10 12:37:32 +03:00
## Ограничения группы
Группа:
- содержит только модули и вложенные группы;
- не владеет файлами реализации;
- не имеет состояния или жизненного цикла;
- не предоставляет публичный API;
- не является узлом графа зависимостей;
- не импортируется внешним кодом;
- не реэкспортирует содержащиеся в ней модули.
Barrel-файл, открывающий несколько модулей группы как единый контракт, превращает каталог в новую модульную границу. Если такой контракт действительно нужен, для него определяется ответственность и создаётся обычный модуль.
## Группы и зависимости
Принадлежность модулей одной или разным группам не влияет на допустимость импорта. Модули одного слоя могут зависеть друг от друга через публичные API, если общий граф остаётся ацикличным.
Код импортирует конкретный модуль:
```ts
2026-08-10 14:42:29 +03:00
import { Dashboard } from '@/compositions/widgets/dashboard'
2026-08-10 12:37:32 +03:00
```
Группа не становится промежуточной точкой доступа:
```ts
// Недопустимый API группы
2026-08-10 14:42:29 +03:00
import { Dashboard } from '@/compositions/widgets'
2026-08-10 12:37:32 +03:00
```
Полные правила графа находятся в разделе [Зависимости](./dependencies.md).
## Группа и сегмент
Группа организует несколько модулей внутри слоя. [Сегмент](./segments.md) организует код внутри одного модуля.
| Группа | Сегмент |
|---|---|
| Находится снаружи модульной границы | Находится внутри модульной границы |
| Содержит модули и группы | Содержит внутреннюю реализацию владельца |
| Не принадлежит одному модулю | Всегда принадлежит ближайшему модулю |
| Не содержит файлы реализации | Существует для организации файлов реализации |
## Связанные правила
2026-08-10 14:42:29 +03:00
- [`SLM-DOMAIN-R022`](../rules/registry.md#slm-domain-r022)
2026-08-10 12:37:32 +03:00
- [`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)