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

7.9 KiB
Raw Blame History

Терминология SLM

Этот документ задаёт нормативный смысл терминов. Определения используются при толковании архитектуры и правил, но сами по себе не являются отдельными правилами.

Владение

SLM root

Граница структурной архитектуры одного приложения. Внутри неё определяются владельцы ответственностей, слои, модули и их зависимости.

Ответственность

Связная часть приложения с одной причиной изменяться. Ответственность является самостоятельной, когда ей нужны собственный публичный API, зависимости, состояние или область жизни.

Владелец

Модуль, который определяет публичный API ответственности, её зависимости, состояние, область жизни и внутреннюю реализацию. Место выполнения кода не переносит владение.

Структурные сущности

Слой

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

Группа

Необязательный навигационный классификатор модулей внутри одного слоя или другой группы. Группа не является владельцем, публичным API или границей зависимостей.

Модуль

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

Сегмент

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

Компонент

Сущность фреймворка, реализующая часть интерфейса родительского модуля. Зависимости, состояние и жизненный цикл компонента принадлежат этому модулю и сами по себе не создают нового владельца. Компонент может иметь внутренний index.ts, который не является публичным фасетом SLM.

Вложенный модуль

Обычный модуль, физически размещённый внутри родительского модуля. Он сам владеет отдельной ответственностью и имеет публичный API и границу зависимостей, но остаётся внутренней реализацией родителя для внешнего кода.

Публичная граница

Публичный API

Единый логический контракт внешнего доступа к модулю. Он скрывает внутреннюю реализацию и физически представлен обязательным фасетом index и только необходимыми фасетами client, browser и server.

Фасет

Объявленная публичная точка входа модуля, открывающая часть его единого API для определённой среды выполнения. Импорт фасета не является глубоким импортом; любой другой внешний путь внутрь модуля остаётся внутренним.

Глубокий импорт

Импорт или реэкспорт внутреннего пути чужого модуля, который не объявлен его публичным фасетом.

Зависимости

Зависимость

Направленная статическая связь между архитектурными границами внутри одного SLM root. Обычный импорт, импорт типа (import type) и реэкспорт одинаково создают архитектурную зависимость.

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

Нормативная матрица слоёв

Отношение допустимой зависимости между слоями одного SLM root. Матрица определяет доступные целевые роли, но не требует проходить через каждый промежуточный слой.

Жизненный цикл

Область жизни

Период, в течение которого принадлежащие модулю состояние или долгоживущий ресурс должны оставаться активными.

Ресурс жизненного цикла

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

Очистка

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

Немодульные единицы

Точка входа фреймворка

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

Ресурс shared

Небольшая детерминированная единица слоя shared, не зависящая от продукта и не скрывающая отдельного внутреннего устройства. У неё нет изменяемого состояния, ввода-вывода, области жизни или собственного публичного API.

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