10 KiB
Правила SLM второго уровня
Проект Level 2 соблюдает правила Level 1 и дополнительные правила этого реестра. SLM-L1-DOMAIN-R015 заменяется правилами доменного пакета. SLM-L1-GROUP-R007 сохраняется для Groups внутри пакета и вне слоя domains, а для навигационных Groups слоя domains заменяется SLM-L2-GROUP-R004. Для модуля business правило SLM-L1-MODULE-A004 уточняется правилом SLM-L2-BUSINESS-A019: три объявленных фасета вместе образуют один логический публичный API и не считаются deep imports. Ранее использовавшийся номер SLM-L2-DOMAIN-R001 не переиспользуется после изменения модели уровней.
Граница доменного пакета
SLM-L2-DOMAIN-R002
Предметная граница пакета
Каждая самостоятельная предметная область слоя
domainsпредставлена ровно одним доменным пакетом; все его модули относятся только к этой предметной области.
SLM-L2-DOMAIN-A003
Корень доменного пакета
Корень доменного пакета содержит только декларативную metadata, модуль
businessи допустимые Groups и не содержит других прямых модулей, исполняемых файлов, изменяемого состояния, ресурсов жизненного цикла, публичного API или реэкспортов.
SLM-L2-GROUP-R004
Навигационная Group доменов
Group, расположенная непосредственно в слое
domainsили другой такой Group, содержит только доменные пакеты и навигационные Groups и не владеет реализацией, состоянием, жизненным циклом или публичным API.
Business и DomainApi
SLM-L2-BUSINESS-R005
Модуль business
Каждый доменный пакет содержит ровно один модуль
business, который владеет публичными предметными сценариями и контрактомDomainApiэтой предметной области.
SLM-L2-BUSINESS-R006
Единственный runtime-источник домена
Приложение получает доменные данные, состояние и результаты предметных сценариев только через экземпляр
DomainApi; adapters, presets и framework binding modules не предоставляют параллельный runtime-источник этих данных или результатов.
SLM-L2-BUSINESS-A007
Импортная замкнутость business
Все runtime- и type-only импорты
business, кроме междоменных зависимостей поSLM-L2-DEPENDENCY-A012, ведут только к файлам этого модуля, объявленным environment-neutral ресурсамsharedи внешним пакетам, объявленным как business-safe.
SLM-L2-FACTORY-R008
Единая фабрика DomainApi
Модуль
businessпредоставляет ровно одну публичную фабрику, которая получает явные runtime-зависимости, создаётDomainApiодного контракта независимо от preset и среды выполнения и является единственным runtime-экспортом фасетаbusiness/factory.
Ошибки домена
SLM-L2-ERROR-R009
Публичный контракт ошибок
Модуль
businessэкспортирует через type-only barrel именованные readonly-типы DomainError и DomainErrorCode, а черезbusiness/errorтолько устойчивые runtime-коды и guards безопасной публичной формы независимо от выбранного способа передачи ошибки.
SLM-L2-ERROR-R010
Изоляция исходных ошибок
Сбой adapter, SDK, транспорта, storage или другого домена, доступный приложению через
DomainApi, представлен только безопасной ошибкой собственного доменного контракта и не раскрывает исходный объект, тип, message, status, payload или cause.
Presets и зависимости
SLM-L2-PRESET-R011
Роль preset
Каждый preset является SLM-модулем одного именованного контекста выполнения, при наличии технических зависимостей выбирает их adapter-модули, вызывает единственную business-фабрику и не добавляет предметные сценарии, методы
DomainApiили собственные доменные ошибки.
SLM-L2-DEPENDENCY-A012
Междоменные импорты
Модуль одного доменного пакета не импортирует runtime-экспорты другого пакета, включая функции, состояние, hooks, contexts, Providers и components; разрешён только type-only импорт публичного business-контракта, который остаётся ребром общего ацикличного графа.
SLM-L2-ENVIRONMENT-A013
Совместимость среды выполнения
Публичная точка входа, обозначенная как client-, server- или shared-entry point, не импортирует и не реэкспортирует код несовместимой среды выполнения во всём достижимом графе импортов.
Framework Groups и тестирование
SLM-L2-FRAMEWORK-R014
Framework Group домена
Framework binding modules доменного пакета размещаются в Group, названной по фреймворку, и каждый прямой дочерний элемент этой Group является framework binding module.
SLM-L2-FRAMEWORK-R015
Framework binding module
Модуль внутри Framework Group владеет одной domain-specific framework-ответственностью, получает готовый
DomainApiи не выполняет business-сборку, не выбирает adapters и не владеет страницей, маршрутом или multi-domain композицией.
SLM-L2-TEST-R016
Проверка владельцев Level 2
Каждый публичный предметный сценарий проверяется через business-фабрику, а основные тесты adapter, preset и framework binding module проверяют только собственные публичные границы и не повторяют полный набор предметных сценариев.
Миграция
SLM-L2-MIGRATION-A017
Изоляция форм во время миграции
Пока SLM root содержит одновременно доменные модули Level 1 и доменные пакеты Level 2, модули этих двух форм не создают между собой runtime- или type-only импортов.
Внешние библиотеки business
SLM-L2-BUSINESS-R018
Business-safe внешний пакет
Внешний пакет объявляется business-safe только если он детерминирован, не выполняет ввод-вывод, не владеет изменяемым состоянием или runtime capability и не является SDK, generated client, storage, state manager, framework или другой технической интеграцией.
Публичные фасеты business
SLM-L2-BUSINESS-A019
Публичные фасеты business
Публичный API
businessсостоит ровно из трёх entry points: корневой barrel содержит только type exports, аbusiness/factoryиbusiness/errorсодержат только runtime exports; другие публичные пути и deep imports запрещены.
Обязательные роли сборки
SLM-L2-PRESET-A020
Обязательная Group presets
Корень каждого доменного пакета содержит ровно одну непустую Group
presets, каждый прямой дочерний элемент которой является объявленной границей SLM-модуля.
SLM-L2-ADAPTER-R021
Модули production adapters
Если business-фабрика имеет хотя бы одну техническую зависимость, корень доменного пакета содержит непустую Group
adapters, а каждая production-реализация такой зависимости является отдельным adapter-модулем этой Group и не определяется в другом месте production-графа.
SLM-L2-BUSINESS-A022
Потребители фасетов business
Корневой
businessимпортируется извне только черезimport type;business/factoryимпортируют только presets своего домена,app,compositionsи тесты, аbusiness/errorимпортируют только framework binding modules своего домена,app,compositionsи тесты.