Pull to refresh

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

Level of difficultyEasy
Reading time3 min
Views17K

Все мы понимаем для 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 папки где описаны наши сущности.

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

domain/entities/Todo.entity.ts
domain/entities/Todo.entity.ts

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

domain/repository/Todo.repository.ts
domain/repository/Todo.repository.ts

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

domain/repository/Todo.repository.ts
domain/repository/Todo.repository.ts

Над реализацией займусь в слой 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

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

Ссылка на код

Tags:
Hubs:
Total votes 16: ↑3 and ↓13-10
Comments29

Articles