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

5.8 KiB
Raw Blame History

Сегменты

Сегмент организует внутреннее содержимое одного модуля по назначению. Он помогает ориентироваться в реализации владельца, но не создаёт новую ответственность или архитектурную границу.

Место в модели

Сегмент появляется только внутри уже определённого модуля:

Слой → [Группа*] → Модуль → [Сегмент*]

Группа классифицирует несколько модулей внутри слоя. Сегмент классифицирует код одного модуля. Ни группа, ни сегмент не являются владельцами.

Все файлы, компоненты, состояние, зависимости и код жизненного цикла сегмента принадлежат родительскому модулю. Исключением является только вложенный модуль, который начинает собственную границу владения.

Назначение

Сегмент используется, когда группировка внутренних файлов по назначению упрощает навигацию. Набор и названия сегментов определяет проект.

Возможная структура:

profile/
├── index.ts
├── profile.tsx
├── hooks/          # Возможный сегмент
├── services/       # Возможный сегмент
├── stores/         # Возможный сегмент
├── types/          # Возможный сегмент
└── ui/             # Возможный сегмент

Ни один из показанных сегментов не обязателен. Маленький модуль может хранить реализацию в корне без дополнительных каталогов.

Сегмент:

  • не имеет самостоятельной ответственности;
  • не предоставляет публичный API;
  • не владеет состоянием или жизненным циклом;
  • не является узлом графа зависимостей;
  • не импортируется внешним кодом как отдельная архитектурная сущность.

Локальный index.ts может использоваться во внутренней единице сегмента, например в каталоге компонента. Он не превращает эту единицу или сегмент в модульную границу.

Компоненты и вложенные модули

Сегмент может содержать компоненты и вспомогательные файлы родительского модуля. Компонент вправе иметь локальные styles/, types/, tests/ и внутренний index.ts; всё это остаётся реализацией ближайшего модуля.

header/                         # Модуль
└── components/                 # Сегмент
    └── button-submit/          # Компонент
        ├── button-submit.tsx
        ├── styles/
        │   └── button-submit.module.css
        ├── types/
        │   └── button-submit.types.ts
        └── index.ts            # Внутренняя точка входа

Внешний код не импортирует components/button-submit. Если компонент нужен снаружи, модуль-владелец реэкспортирует его через собственный публичный фасет.

Сегмент также может содержать вложенные модули. В отличие от остальных файлов сегмента, каждый вложенный модуль сам владеет отдельной ответственностью и имеет публичный API и границу зависимостей.

landing/                  # Родительский модуль
└── parts/                # Сегмент
    └── hero/             # Вложенный модуль
        ├── hero.tsx
        └── index.ts

Имя parts является примером, а не обязательным соглашением SLM.

Выбор границы

Ситуация Решение
Код относится к существующему владельцу и группируется только по назначению Сегмент
Части нужна собственная ответственность, API, зависимости, состояние или область жизни Модуль
Несколько модулей слоя нужно классифицировать для навигации Группа
Нескольким файлам не нужна отдельная группировка Оставить в корне модуля

Размер каталога и количество файлов не определяют выбор между сегментом и модулем.

Связанные правила