mirror of
https://github.com/gromlab-ru/slm-design.git
synced 2026-08-22 07:30:16 +03:00
chore: границы доменов
This commit is contained in:
@@ -48,6 +48,37 @@ import { Button } from '@/ui/button/button'
|
||||
|
||||
Разрешённое направление не переносит владение. Если модуль `domains` использует `infra`, предметный сценарий остаётся ответственностью доменного модуля, а техническая возможность — ответственностью инфраструктурного.
|
||||
|
||||
## Допустимость связи и владение
|
||||
|
||||
Матрица отвечает только на вопрос, может ли один слой зависеть от другого. Она не разрешает исходному модулю реализовывать ответственность, которая по своей роли принадлежит целевому или другому слою.
|
||||
|
||||
`compositions` может зависеть от `domains` и `infra`, но использует эти направления по-разному:
|
||||
|
||||
- доменный сценарий доступен композиции только как готовый публичный API доменного модуля;
|
||||
- инфраструктурный API может обслуживать собственную техническую потребность композиции, например тему, локализацию или доставку метрики показа страницы;
|
||||
- инфраструктурный HTTP-клиент, SDK или storage не используются композицией для реализации продуктовой операции, загрузки предметных данных или определения доменного исхода.
|
||||
|
||||
```ts
|
||||
// Допустимо: композиция использует готовый доменный UI.
|
||||
import { OrdersList } from '@/domains/orders/client'
|
||||
|
||||
// Допустимо: техническая возможность обслуживает саму композицию.
|
||||
import { useTheme } from '@/infra/theme/client'
|
||||
|
||||
// Направление импорта допустимо, но ответственность выбрана неверно.
|
||||
import { http } from '@/infra/http'
|
||||
|
||||
await http.get('/orders')
|
||||
```
|
||||
|
||||
В последнем примере запрос получает предметные данные и участвует в доменном сценарии. Его смысл, параметры, продуктовые исходы и вызов принадлежат доменному модулю, который открывает композиции готовый API.
|
||||
|
||||
Разрешённая зависимость `domains` от `infra` также не объединяет их контракты. Домен может использовать HTTP-транспорт, SDK или storage через публичный API инфраструктурного модуля, но DTO и ошибки источника остаются только во внутреннем интеграционном коде домена. До попадания в правила, состояние, доменный UI или публичный результат данные адаптируются к доменному контракту, а ошибка источника интерпретируется в терминах текущего сценария. Полные требования описаны в разделе [Домены](./domains.md#граница-внешних-данных).
|
||||
|
||||
Аналогично, технической доставкой метрик владеет `infra`, но смысл события определяется модулем-владельцем наблюдаемого поведения. Разрешённый вызов telemetry API из композиции не позволяет ей объявлять события доменного сценария от своего имени.
|
||||
|
||||
Композиция может размещать и связывать несколько доменных API. Если эта связь задаёт обязательный порядок, продуктовые условия, общий предметный результат или политику ошибок между доменами, она является отдельным доменным сценарием, а не внутренней логикой композиции.
|
||||
|
||||
## Зависимости внутри слоя
|
||||
|
||||
Модули одного слоя могут зависеть друг от друга в любом направлении при одновременном выполнении двух условий:
|
||||
@@ -97,6 +128,11 @@ Lint-проверка модульных циклов должна:
|
||||
## Связанные правила
|
||||
|
||||
- [`SLM-LAYER-A002`](../rules/registry.md#slm-layer-a002)
|
||||
- [`SLM-DOMAIN-R022`](../rules/registry.md#slm-domain-r022)
|
||||
- [`SLM-DOMAIN-R023`](../rules/registry.md#slm-domain-r023)
|
||||
- [`SLM-DOMAIN-R024`](../rules/registry.md#slm-domain-r024)
|
||||
- [`SLM-DOMAIN-R025`](../rules/registry.md#slm-domain-r025)
|
||||
- [`SLM-DOMAIN-R026`](../rules/registry.md#slm-domain-r026)
|
||||
- [`SLM-MODULE-A004`](../rules/registry.md#slm-module-a004)
|
||||
- [`SLM-DEPENDENCY-A005`](../rules/registry.md#slm-dependency-a005)
|
||||
- [`SLM-NESTED_MODULE-A010`](../rules/registry.md#slm-nested_module-a010)
|
||||
|
||||
Reference in New Issue
Block a user