mirror of
https://github.com/gromlab-ru/slm-design.git
synced 2026-08-22 07:30:16 +03:00
82 lines
4.3 KiB
Markdown
82 lines
4.3 KiB
Markdown
|
|
# Группы
|
|||
|
|
|
|||
|
|
Группа является необязательным навигационным классификатором модулей внутри одного слоя. Она помогает ориентироваться в дереве владельцев, но не реализует ответственность и не создаёт архитектурную границу.
|
|||
|
|
|
|||
|
|
## Место в модели
|
|||
|
|
|
|||
|
|
Модуль может находиться непосредственно в слое или внутри одной или нескольких групп:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
слой
|
|||
|
|
├── модуль
|
|||
|
|
└── группа
|
|||
|
|
├── модуль
|
|||
|
|
└── группа
|
|||
|
|
└── модуль
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Группа создаётся, когда плоский список модулей перестаёт быть понятным. Названия и глубину групп определяет проект.
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
compositions/
|
|||
|
|
├── pages/ # Группа
|
|||
|
|
│ ├── catalog/ # Модуль
|
|||
|
|
│ └── profile/ # Модуль
|
|||
|
|
├── layouts/ # Группа
|
|||
|
|
│ └── main/ # Модуль
|
|||
|
|
└── widgets/ # Группа
|
|||
|
|
└── cart-summary/ # Модуль
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Названия `pages`, `layouts` и `widgets` показывают один из вариантов навигации и не создают дополнительные слои или обязательные роли.
|
|||
|
|
|
|||
|
|
## Ограничения группы
|
|||
|
|
|
|||
|
|
Группа:
|
|||
|
|
|
|||
|
|
- содержит только модули и вложенные группы;
|
|||
|
|
- не владеет файлами реализации;
|
|||
|
|
- не имеет состояния или жизненного цикла;
|
|||
|
|
- не предоставляет публичный API;
|
|||
|
|
- не является узлом графа зависимостей;
|
|||
|
|
- не импортируется внешним кодом;
|
|||
|
|
- не реэкспортирует содержащиеся в ней модули.
|
|||
|
|
|
|||
|
|
Barrel-файл, открывающий несколько модулей группы как единый контракт, превращает каталог в новую модульную границу. Если такой контракт действительно нужен, для него определяется ответственность и создаётся обычный модуль.
|
|||
|
|
|
|||
|
|
## Группы и зависимости
|
|||
|
|
|
|||
|
|
Принадлежность модулей одной или разным группам не влияет на допустимость импорта. Модули одного слоя могут зависеть друг от друга через публичные API, если общий граф остаётся ацикличным.
|
|||
|
|
|
|||
|
|
Код импортирует конкретный модуль:
|
|||
|
|
|
|||
|
|
```ts
|
|||
|
|
import { CartSummary } from '@/compositions/widgets/cart-summary'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Группа не становится промежуточной точкой доступа:
|
|||
|
|
|
|||
|
|
```ts
|
|||
|
|
// Недопустимый API группы
|
|||
|
|
import { CartSummary } from '@/compositions/widgets'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Полные правила графа находятся в разделе [Зависимости](./dependencies.md).
|
|||
|
|
|
|||
|
|
## Группа и сегмент
|
|||
|
|
|
|||
|
|
Группа организует несколько модулей внутри слоя. [Сегмент](./segments.md) организует код внутри одного модуля.
|
|||
|
|
|
|||
|
|
| Группа | Сегмент |
|
|||
|
|
|---|---|
|
|||
|
|
| Находится снаружи модульной границы | Находится внутри модульной границы |
|
|||
|
|
| Содержит модули и группы | Содержит внутреннюю реализацию владельца |
|
|||
|
|
| Не принадлежит одному модулю | Всегда принадлежит ближайшему модулю |
|
|||
|
|
| Не содержит файлы реализации | Существует для организации файлов реализации |
|
|||
|
|
|
|||
|
|
## Связанные правила
|
|||
|
|
|
|||
|
|
- [`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)
|