Skip to content

Структура функционального блока

Структура следует фактическим owners, а не фиксированному шаблону папок. Для экосистемы Endge это рекомендация: она помогает одинаково читать packages и приложения, но не требует создавать пустые layers.

Federation-first feature

Feature с собственной Federation разделяет её kernel и дочерние Modules:

text
feature/
├── kernel/
│   ├── FeatureFederation.ts
│   ├── config/
│   ├── constants/
│   ├── domain/
│   ├── model/
│   ├── services/
│   ├── tools/
│   ├── types/
│   └── ui/
└── modules/
    ├── Leaf_Module.ts
    └── structured-module/
        ├── Structured_Module.ts
        ├── config/
        ├── constants/
        ├── domain/
        ├── model/
        ├── services/
        ├── tools/
        ├── types/
        └── ui/

kernel принадлежит самой Federation: здесь находятся её declaration, orchestration и feature-level сущности. modules содержит только Modules этой Federation и принадлежащие им внутренние slices.

Feature без Federation

Если feature не владеет Federation и набором Modules, она сама является functional root:

text
feature/
├── config/
├── constants/
├── domain/
├── model/
├── services/
├── tools/
├── types/
└── ui/

Обёртки kernel и modules в этом случае не создаются. Они обозначают реальную архитектурную модель, а не обязательный уровень вложенности.

Когда создавать папку Module

Leaf Module, состоящий только из класса, остаётся одним файлом непосредственно в modules. Собственная папка появляется, когда Module уже владеет дополнительным domain/model, Service, adapter, config, tool, UI или submodule.

text
modules/
├── Clock_Module.ts
└── schedule/
    ├── Schedule_Module.ts
    ├── domain/
    ├── services/
    └── ui/

Роли папок

ПапкаОтветственность
domainBusiness contracts, entities, rules и domain values
modelStateful application/runtime models владельца
servicesСвязные operations и orchestration без собственного Module identity
configРасширяемая конфигурация владельца
constantsСтабильные именованные identities и values
adapters, clientsРеализации внешних contracts
toolsЧистые scoped-утилиты без state и side effects
typesTechnical и framework contracts functional root
uiPresentation, принадлежащая этому owner

Появление domain не переносит в него все типы. Business contracts находятся в domain/types, а технические contracts Federation или Module остаются в соседнем types.

Минимальная структура

Создавайте slice после появления реальной ответственности. Пустые domain, services, types или ui не улучшают архитектуру.