Как я добился чистой архитектуры на фронтенде

Все мы понимаем для enterprise решений требуется тщательного анализа в плане проектирование и этому уделяется не мало времени, от структуры папок, описании регламента по стилям или коду, подключение микрофронтов и если эта не учитывать мы получаем в своем роде монолита, где все хаотично разбросано и в целом эта не плохо работает до определенного поры времени.

За основу своей чистой архитектуры я применил методологию проектирования DDD (Domain-Driver-Design). Что эта значит в кратце

  1. Основное понимание предметной области: DDD нацелено на то, чтобы разработчики и эксперты предметной области вместе работали над пониманием бизнес‑логики и задач, решаемых приложением. Это помогает создавать более эффективные и соответствующие предметной области решения.

  2. Определение моделей предметной области: DDD ставит модель предметной области в центр разработки, помогая разработчикам создавать четкое представление о бизнес‑логике и правилах, определяющих вашу систему.

  3. Язык моделирования: DDD ставит задачу разработчикам использовать язык, который понимают и разделяют и технические и предметные эксперты. Это упрощает коммуникацию и обеспечивает более четкое понимание между разработчиками и экспертами предметной области.

  4. Разделение на слои: DDD рекомендует разделение приложения на слои, включающие слой предметной области, слой приложения и слой представления. Это упрощает сопровождение и масштабирование приложений.

Для примера был кейс получить данные о задачах из https://jsonplaceholder.typicode.com/ и отобразить их. Начал с того что настроил пустой React Vite проект без лишних надстроек, далее занялся со структурой папок, в принципе здесь ничего нового, как сказано выше основной концепцией DDD эта четкое представление о бизнес‑логике и правилах, определяющих вашу систему.

Сущность todos

Сущность todos

Внутри папки features/todos, можно будет увидеть следующее: папка с получением данных то бишь наши репозитории и модели, папка непосредственно с domain сущностью максимально абстрактная логика и папка presentation отвечающий за представление нашей логики.

Начнем с domain папки где описаны наши сущности.

domain/entities/Todo.entity.ts

Создаю интерфейс ITodoEntity и описываю поля которые ожидаю получить.

73dc13f002cd4501db92df66202a0539.png

domain/repository/Todo.repository.ts

Описываю интерфейс репозитория, ожидаю получить getTodos

ef4365102862e4a30d49e7f13d8ccc6c.png

domain/usecases/getTodos.ts

Создаю usecase который ожидает получить ответ из getTodos

401bc0c183fc980a941f41009d8690ea.png

Над реализацией займусь в слой data где будут обращение апи, реализация класса Todo.repository и Todo.entity.

Реализация класса TodoRepository, как вы могли заметить в конструктор попадает todoApiService, аналогично для usecase’ов тоже, их я буду получать через DI.

Todo.repository-impl.ts

Todo.repository-impl.ts

Модель TodoModel реализует TodoEntity, сериализацию полей и всякого рода валидации

Todo.model.ts

Todo.model.ts

Работа с апи я унаследовал пакет ts-retrofit аналогично пакету retrofit, которая используется под андроид. Ее я плюсами я посчитал быстро описывать интерфейсы для апи обращений через декораторы.

Todo.api.ts

Todo.api.ts

Связь между ними будет закладываться через конструкторы с помощью Dependency Injection, для этого я взял за основу очень удобный и подходящий пакет awilix

src/config/di

src/config/di

Ее настройка довольна проста и в использовании тоже, преимущественно эта — управление циклами жизни экземплярами класса.

Переходим к слою features/presentation

Во вьюхе будут 2 папки, эта компоненты и наш store, за основу store’а я решил использовать MobX, почему не Redux вы скажите… эта в избыточности большого шаблонного кода, и одна из плюсов mobx эта — мультисторы, ее подключение с awilix я будет выигрышным вариантом чем redux, так как стор будет описываться классом, а не так как мы привыкли видеть в redux.

presentation/store/Todo.store.ts

presentation/store/Todo.store.ts

Ее мы также подключаем к нашей DI, чтобы получить наши usecase’ы. И остается за малым эта наша вьюха.

presentation/components/Todos.tsx

presentation/components/Todos.tsx

В заключении я бы хотел сказать, что данная архитектура возможно не самая лучшая, но ее идея в плане чистой архитектуры остается. В процессе ее можно будет расширить я думаю доп слоями до подключение микрофронтов.

© Habrahabr.ru