Files
slm-design/DRAFT/rules/level-2.md

13 KiB
Raw Blame History

Правила SLM второго уровня

Доменный пакет Level 2 соблюдает правила Level 1 и дополнительные правила этого реестра. Для предметной области в пакетной форме SLM-L1-DOMAIN-R015 заменяется правилами доменного пакета; остальные предметные области того же SLM root могут сохранять форму доменного модуля Level 1. 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-MIGRATION-A017 не переиспользуются после изменения модели уровней и перехода к постоянному совместному применению форм.

Граница доменного пакета

SLM-L2-DOMAIN-R002

Предметная граница пакета

Каждая предметная область, использующая пакетную форму Level 2, представлена ровно одним доменным пакетом; все его модули относятся только к этой предметной области.

SLM-L2-DOMAIN-A003

Корень доменного пакета

Корень доменного пакета содержит только декларативную metadata, модуль business и допустимые Groups и не содержит других прямых модулей, исполняемых файлов, изменяемого состояния, ресурсов жизненного цикла, публичного API или реэкспортов.

SLM-L2-GROUP-R004

Навигационная Group доменов

Group, расположенная непосредственно в слое domains или другой такой Group, содержит только доменные модули Level 1, доменные пакеты Level 2 и навигационные Groups и не владеет реализацией, состоянием, жизненным циклом или публичным API.

Business и Domain API

SLM-L2-BUSINESS-R005

Модуль business

Каждый доменный пакет содержит ровно один модуль business, который владеет публичными предметными сценариями и объявляет один или несколько именованных Domain API этой предметной области.

SLM-L2-BUSINESS-R006

Предметная власть business

Adapters, assemblies и framework binding modules транспортируют, кэшируют или проецируют доменные данные только в форме, произведённой или проверенной публичным API либо детерминированным runtime модуля business, и не определяют независимую предметную модель, переход или результат сценария.

SLM-L2-BUSINESS-A007

Импортная замкнутость business

Все runtime- и type-only импорты business, кроме междоменных зависимостей по SLM-L2-DEPENDENCY-A012, ведут только к файлам этого модуля, объявленным environment-neutral ресурсам shared и внешним пакетам, объявленным как business-safe.

SLM-L2-FACTORY-R008

Фабрики Domain API

Каждому публичному Domain API соответствует ровно одна именованная фабрика фасета business/factory; фабрика получает явные runtime-зависимости, создаёт только этот API и не выбирает assembly или среду выполнения.

Ошибки домена

SLM-L2-ERROR-R009

Публичный контракт ошибок

Каждый ожидаемый сбой публичного предметного сценария представлен именованным readonly-типом собственной доменной ошибки с устойчивым кодом; тип экспортируется через type-only barrel, а необходимые внешним потребителям runtime-коды и guards только через business/runtime.

SLM-L2-ERROR-R010

Изоляция исходных ошибок

Сбой adapter, SDK, транспорта, storage или другого домена, доступный приложению через Domain API, представлен только безопасной ошибкой собственного доменного контракта и не раскрывает исходный объект, тип, message, status, payload или cause.

Assemblies и зависимости

SLM-L2-ASSEMBLY-R011

Роль assembly

Каждая assembly является SLM-модулем одного именованного контекста выполнения, выбирает необходимые adapter-модули, вызывает одну или несколько business-фабрик и возвращает явный именованный граф их API, не добавляя предметные сценарии, методы API или собственные доменные ошибки.

SLM-L2-DEPENDENCY-A012

Междоменные импорты Level 2

Статическая связь между разными доменными границами, хотя бы одна из которых является пакетом Level 2, допускает только type-only импорт публичного API доменного модуля Level 1 или корневого business пакета Level 2 либо runtime-импорт business/runtime пакета Level 2; все такие связи входят в общий ацикличный граф, а остальные runtime-экспорты другого домена не импортируются.

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-ответственностью, получает готовые Domain API и не выполняет business-сборку, не выбирает adapters и не владеет страницей, маршрутом или multi-domain композицией.

SLM-L2-TEST-R016

Проверка владельцев Level 2

Каждый публичный предметный сценарий проверяется через фабрику владеющего им Domain API, а основные тесты adapter, assembly и framework binding module проверяют только собственные публичные границы и не повторяют полный набор предметных сценариев.

Совместное применение форм

SLM-L2-DOMAIN-A026

Однозначная форма домена

Каждая предметная область объявлена ровно в одной форме: как доменный модуль Level 1 либо как доменный пакет Level 2; один SLM root может одновременно содержать разные предметные области обеих форм.

Внешние библиотеки business

SLM-L2-BUSINESS-R018

Business-safe внешний пакет

Внешний пакет объявляется business-safe только если он детерминирован, не выполняет ввод-вывод, не владеет изменяемым состоянием или runtime capability и не является SDK, generated client, storage, state/query manager, framework или другой технической интеграцией.

Публичные фасеты business

SLM-L2-BUSINESS-A019

Публичные фасеты business

Публичный API business имеет обязательные entry points business только с type exports и business/factory только с именованными runtime-фабриками, может иметь business/runtime только с runtime exports и не имеет других публичных путей или deep imports.

Обязательные роли сборки

SLM-L2-ASSEMBLY-A020

Обязательная Group assemblies

Корень каждого доменного пакета содержит ровно одну непустую Group assemblies, каждый прямой дочерний элемент которой является объявленной границей SLM-модуля.

SLM-L2-ADAPTER-R021

Модули production adapters

Если хотя бы одна business-фабрика имеет техническую зависимость, корень доменного пакета содержит непустую Group adapters, а каждая связная production-реализация одной или нескольких таких зависимостей принадлежит ровно одному adapter-модулю этой Group и не определяется в другом месте production-графа.

SLM-L2-BUSINESS-A022

Потребители фасетов business

Корневой business импортируется извне только через import type; business/factory импортируют только assemblies своего домена, app, compositions и тесты, а business/runtime импортируется только через объявленный публичный путь с соблюдением правил слоёв и междоменных зависимостей.

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

SLM-L2-ASSEMBLY-R023

Cleanup ресурса assembly

Создание Domain API фабрикой или assembly не запускает скрытый ресурс жизненного цикла; ресурс запускается явной операцией с cleanup, а технический ресурс, который assembly обязана создать для графа, сопровождается публичным cleanup handle, вызываемым не позже завершения области жизни графа.

Недетерминизм business

SLM-L2-BUSINESS-R024

Явные источники недетерминизма

Business-сценарий получает текущее время, timer, random, ID generator, environment и другие источники недетерминизма только через явные зависимости фабрики и не читает их из скрытого runtime-окружения.

Публичный runtime business

SLM-L2-BUSINESS-R025

Детерминированный runtime business

Фасет business/runtime экспортирует только необходимые реальным внешним потребителям детерминированные значения и функции без ввода-вывода, изменяемого состояния, runtime capability или environment-specific поведения.