mirror of
https://github.com/smmarty/friflex_flutter_starter.git
synced 2025-12-21 17:10:45 +00:00
81 lines
6.6 KiB
Markdown
81 lines
6.6 KiB
Markdown
# Структура проекта
|
||
|
||
Рекомендуемая структура проекта (может отличатся в зависимости от проекта и согласований)
|
||
|
||
- **/** - папка проекта
|
||
- **/assets** - директория расположения графических ресурсов
|
||
- **/tools/** - все необходимые инструменты для проекта
|
||
- **/docs** - документация проекта
|
||
- **/android** - папка, содержащая нативный код для Android
|
||
- **/aurora** - папка, содержащая нативный код для Aurora
|
||
- **/ios** - папка, содержащая нативный код для IOS
|
||
- **/env** - папка, с внешними переменными окружения
|
||
- **/lib** - код на Dart, Flutter-приложение
|
||
- **/app** - содержит основные настройки нашего приложения
|
||
- **/impls** - реализация интерфейсов
|
||
- **/interfaces** - объявление интерфейсов
|
||
- **/data** - общие поставщики данных
|
||
- **/domain** - общий слой
|
||
- **/presentation** - общий слой
|
||
- **/di** - файлы конфигурации зависимостей.
|
||
- **/routing** - все, что касается роутинга
|
||
- **/features** - фичи приложения, для каждой фичи создается отдельная папка
|
||
- **/feature_name** - подробнее см в разделе Структура feature папок
|
||
- **/data**
|
||
- **/domain**
|
||
- **/presentation**
|
||
- **/gen** - для сгенерированных файлов
|
||
- **/targets** - таргеты для сборок
|
||
- **/prod.dart** - сборка для prod
|
||
- **/dev.dart** - сборка разработки на моковых репозиториях
|
||
- **/stage.dart** - сборка для stage окружения
|
||
|
||
## Пример структуры feature папок
|
||
|
||
- **/data** - слой данных
|
||
- **/dto** - реализация DTO ( [data transfer object](https://ru.wikipedia.org/wiki/DTO) )
|
||
- **/repository** - реализации репозиториев
|
||
- **/domain** - слой бизнес логики
|
||
- **/entity** - модели которые используются для работы в domain/presentation слоях
|
||
- **/repository** - интерфейсы репозиториев, которые используются в domain слое
|
||
- **/state** - state-management
|
||
- **/service** - реализации сервисов
|
||
- **/presentation** - слой представления
|
||
- **/screens** - все экраны должны заканчиваться на Screen, например UserProfileScreen.
|
||
- **/components** - виджеты, которые необходимы для работы в presentation слое. Например: SuperButton, AppTextFields итд.
|
||
|
||
## Пояснение к структуре feature папок
|
||
|
||
### Data (слой данных) Этот слой является поставщиком данных
|
||
|
||
- Repository - сущность, которая реализует внутри себя предоставление данных. Должен реализовывать какой либо интерфейс репозитория из domain слоя.
|
||
- DTO - Dto(Data Transfer Object) модели, и модели с которыми происходит работа в data слое. Например: UserDto;
|
||
|
||
### Domain (слой бизнес логики)
|
||
|
||
- Entity - должны быть в максимально удобном виде для работы внутри Domain и Presentation. Например: UserEntity, ShopEntity;
|
||
- State - управления состоянием - state manager
|
||
- Service - различные сервисы, для выполнения различных задач.
|
||
- interfaces - интерфейсы репозиториев, которые используются в domain слое.
|
||
|
||
### Presentation (слой представления)
|
||
|
||
- сomponents - widget'ы которые реализуют работу какого либо визуального компонента(Buttons,TextFields,Lists, итд). Например: ShopList, RateButton. Модальные окна.
|
||
- screens - widget'ы которые представляют собой экран приложения. Например: UserInfoScreen.
|
||
|
||
## Основные правила общения объектов между папками
|
||
|
||
### В рамках всего приложения
|
||
|
||
- объекты внутри фичи должны быть инкапсулированы и не могут использоваться в других feature;
|
||
- если есть необходимость использовать объект в нескольких feature, его нужно вынести в папку app и использовать как глобальный для всего приложения;
|
||
- сервис, который должен быть использован в нескольких feature, создается как отдельная feature;
|
||
- если создаваемый сервис является платформно-зависимым, его необходимо выносить в app_services. В приложении должен быть только интерфейс.
|
||
|
||
### В рамках одной feature
|
||
|
||
- объекты data слоя не должны ничего знать про объекты слоя presentation. Имеют доступ к объектам entity из domain слоя для преобразования DTO в Entity ;
|
||
- объекты domain слоя не должны ничего знать про объекты слоя data, используемый экземпляр репозитория передается в объекты domain слоя через интерфейс репозитория, расположенного в этом же domain слое;
|
||
- объекты domain слоя не должны ничего знать про слой presentation, не должны использовать компоненты библиотек ui, material, cupertino, widget и прочих, не должны использовать context;
|
||
- объекты presentation слоя не должны ничего знать про объекты слоя data, все взаимодействия непосредственно через объекты слоя domain.
|