Files
slm-design/docs/architecture/segments.md
S. Gromov 691069af8e sync
2026-08-10 09:12:22 +03:00

93 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Сегменты
Сегмент организует внутреннее содержимое одного модуля по назначению. Он помогает ориентироваться в реализации владельца, но не создаёт новую ответственность или архитектурную границу.
## Место в модели
Сегмент появляется только внутри уже определённого модуля:
```text
Слой → [Группа*] → Модуль → [Сегмент*]
```
Группа классифицирует несколько модулей внутри слоя. Сегмент классифицирует код одного модуля. Ни группа, ни сегмент не являются владельцами.
Все файлы, компоненты, состояние, зависимости и код жизненного цикла сегмента принадлежат родительскому модулю. Исключением является только вложенный модуль, который начинает собственную границу владения.
## Назначение
Сегмент используется, когда группировка внутренних файлов по назначению упрощает навигацию. Набор и названия сегментов определяет проект.
Возможная структура:
```text
profile/
├── index.ts
├── profile.tsx
├── hooks/ # Возможный сегмент
├── services/ # Возможный сегмент
├── stores/ # Возможный сегмент
├── types/ # Возможный сегмент
└── ui/ # Возможный сегмент
```
Ни один из показанных сегментов не обязателен. Маленький модуль может хранить реализацию в корне без дополнительных каталогов.
Сегмент:
- не имеет самостоятельной ответственности;
- не предоставляет публичный API;
- не владеет состоянием или жизненным циклом;
- не является узлом графа зависимостей;
- не импортируется внешним кодом как отдельная архитектурная сущность.
Локальный `index.ts` может использоваться во внутренней единице сегмента, например в каталоге компонента. Он не превращает эту единицу или сегмент в модульную границу.
## Компоненты и вложенные модули
Сегмент может содержать компоненты и вспомогательные файлы родительского модуля. Компонент вправе иметь локальные `styles/`, `types/`, `tests/` и внутренний `index.ts`; всё это остаётся реализацией ближайшего модуля.
```text
header/ # Модуль
└── components/ # Сегмент
└── button-submit/ # Компонент
├── button-submit.tsx
├── styles/
│ └── button-submit.module.css
├── types/
│ └── button-submit.types.ts
└── index.ts # Внутренняя точка входа
```
Внешний код не импортирует `components/button-submit`. Если компонент нужен снаружи, модуль-владелец реэкспортирует его через собственный публичный фасет.
Сегмент также может содержать вложенные модули. В отличие от остальных файлов сегмента, каждый вложенный модуль сам владеет отдельной ответственностью и имеет публичный API и границу зависимостей.
```text
landing/ # Родительский модуль
└── parts/ # Сегмент
└── hero/ # Вложенный модуль
├── hero.tsx
└── index.ts
```
Имя `parts` является примером, а не обязательным соглашением SLM.
## Выбор границы
| Ситуация | Решение |
|---|---|
| Код относится к существующему владельцу и группируется только по назначению | Сегмент |
| Части нужна собственная ответственность, API, зависимости, состояние или область жизни | Модуль |
| Несколько модулей слоя нужно классифицировать для навигации | Группа |
| Нескольким файлам не нужна отдельная группировка | Оставить в корне модуля |
Размер каталога и количество файлов не определяют выбор между сегментом и модулем.
## Связанные правила
- [`SLM-SEGMENT-R008`](../rules/registry.md#slm-segment-r008)
- [`SLM-MODULE-A004`](../rules/registry.md#slm-module-a004)
- [`SLM-COMPONENT-R009`](../rules/registry.md#slm-component-r009)
- [`SLM-NESTED_MODULE-A010`](../rules/registry.md#slm-nested_module-a010)