Files
slm-design/DRAFT/level-3/README.md

97 lines
6.7 KiB
Markdown
Raw Normal View History

2026-07-30 13:22:45 +03:00
# SLM Level 3
> Статус: рабочий черновик. Документы в этой папке не являются спецификацией.
Level 3 предназначен для приложений со сложной предметной логикой, несколькими средами выполнения или длительным сроком поддержки. Он не добавляет новый слой, а задаёт явное и проверяемое устройство доменов внутри слоя `domains`.
2026-07-30 13:22:45 +03:00
## Когда выбирать Level 3
Level 3 оправдан, когда предметная область имеет устойчивый контракт бизнес-логики, несколько технических интеграций, разные способы сборки для браузера и сервера либо сложный жизненный цикл ресурсов.
2026-07-30 13:22:45 +03:00
Количество файлов или размер проекта сами по себе не требуют перехода. Предметная область без такой сложности оформляется доменным модулем Level 2.
2026-07-30 13:22:45 +03:00
## Наследование предыдущих уровней
Проект Level 3 соблюдает определения и правила Level 1 и Level 2, кроме явно заменённых положений.
2026-07-30 13:22:45 +03:00
| Положение | Статус в Level 3 |
|---|---|
| Порядок `app → compositions → domains → infra → ui → shared` | Сохраняется |
| Модуль, группа, сегмент, компонент, публичный API и жизненный цикл | Сохраняют смысл Level 1 |
| Доменный модуль Level 2 и [`SLM-L2-DOMAIN-R001`](../rules/level-2.md#slm-l2-domain-r001) | Заменяются доменом Level 3 |
| Группа внутри `domains` | Может содержать домены, оставаясь навигационной папкой |
| Прямые дочерние модули домена | Не являются вложенными, потому что домен сам не является модулем |
2026-07-30 13:22:45 +03:00
Домен не содержит исполняемого кода и не отменяет правило Level 1 о модульном владельце. Он задаёт предметную границу, а конкретной ответственностью, публичным API и жизненным циклом по-прежнему владеет модуль.
2026-07-30 13:22:45 +03:00
## Основная идея
```text
Домен задаёт предметную границу.
Модуль бизнес-логики определяет правила, сценарии и публичный контракт.
Порты описывают возможности, которые нужны бизнес-логике.
Адаптеры реализуют порты в конкретной среде.
Типовые сборки повторяемо создают API.
Модуль фреймворка связывает готовый API с React, Vue или другим фреймворком.
Владелец графа удерживает экземпляр API и завершает его жизненный цикл.
2026-07-30 13:22:45 +03:00
```
## Базовая форма домена
2026-07-30 13:22:45 +03:00
```text
src/domains/
└── auth/ # домен
├── business/ # обязательный модуль
2026-07-30 13:22:45 +03:00
│ ├── errors/
│ ├── lib/
│ ├── ports/
│ ├── services/
│ ├── types/
│ └── index.ts
├── presets/ # необязательная группа
│ └── application/ # модуль типовой сборки
2026-07-30 13:22:45 +03:00
│ ├── adapters/
│ └── index.ts
├── adapters/ # необязательная группа
│ └── identity-provider/ # самостоятельный модуль адаптера
2026-07-30 13:22:45 +03:00
│ └── index.ts
└── react/ # модуль фреймворка
2026-07-30 13:22:45 +03:00
├── hooks/
├── providers/
└── index.ts
```
Модуль `business` обязателен. Группы `presets` и `adapters`, а также модули фреймворков появляются только при реальной потребности. Каталоги `types`, `errors`, `lib`, `services`, `tests`, `ui`, `client` и `server` не становятся самостоятельными корневыми ветками домена.
2026-07-30 13:22:45 +03:00
Домен может находиться непосредственно в `domains` или внутри навигационной группы. Группа не меняет его границы, направление зависимостей и доступность модулей домена.
2026-07-30 13:22:45 +03:00
## Публичные границы
У корня домена нет общей точки входа для исполняемого кода. Внешний код импортирует публичный API конкретного модуля:
2026-07-30 13:22:45 +03:00
```ts
import { authFactory, isAuthError } from '@/domains/auth/business'
import { createApplicationAuth } from '@/domains/auth/presets/application'
import { AuthProvider, useAuth } from '@/domains/auth/react'
```
`@/domains/auth/business` является публичным API отдельного модуля, а не глубоким импортом. Пути вида `@/domains/auth/business/services/...` и общий импорт `@/domains/auth` нарушают границу.
2026-07-30 13:22:45 +03:00
## Карта черновика
- [Терминология](./terminology.md)
- [Граница домена](./domains/domain.md)
- [Модуль бизнес-логики](./domains/business.md)
- [Фабрика, порты и адаптеры](./domains/factory-ports-adapters.md)
- [Типовые сборки и SSR](./domains/presets.md)
- [Модуль React](./domains/framework-bindings.md)
2026-07-30 13:22:45 +03:00
- [Зависимости](./dependencies.md)
- [Тестирование](./domains/testing.md)
- [Проверка](./validation.md)
- [Пример переноса домена](./domains/auth-example.md)
2026-07-30 13:22:45 +03:00
- [Открытые вопросы](./domains/open-questions.md)
## Канонические правила
Level 3 использует правила Level 1 и Level 2, а также [дополнительный реестр Level 3](../rules/level-3.md). Тематические документы объясняют правила, но не объявляют их повторно.