# Сегменты Сегмент организует внутреннее содержимое одного модуля по назначению. Он помогает ориентироваться в реализации владельца, но не создаёт новую ответственность или архитектурную границу. ## Место в модели Сегмент появляется только внутри уже определённого модуля: ```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)