Files
friflex_flutter_starter/tools/rfc/RFC-projects_structure.md

6.6 KiB
Raw Permalink Blame History

Структура проекта

Рекомендуемая структура проекта (может отличатся в зависимости от проекта и согласований)

  • / - папка проекта
  • /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 )
    • /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.