От переводчика

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

Структура Flutter-приложения: feature-first или layer-first

Какова наилучшая структура проекта для средних / больших Flutter-приложений?

Скорее всего, нет "правильного" ответа, который подходил бы для всех проектов.

Итак, давайте рассмотрим два популярных подхода, известных как "feature-first" и "layer-first", и узнаем об их различиях.

Структура Flutter-приложения
Структура Flutter-приложения

Итак, что же нам следует выбрать?

Feature-first подход

Подход "функции внутри слоев" (сначала слой) не очень подходит для больших проектов с большим количеством функций.

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

Итак, что же нам следует выбрать?

Подход "функции внутри слоев" (сначала слой) не очень подходит для больших проектов с большим количеством функций.

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

Сперва, лучше всего рассмотреть структуру проекта применительно к архитектуре приложения.

Для справки, давайте рассмотрим эту высокоуровневую архитектуру, состоящую из четырех уровней:

‣ presentation ‣ application (опционально) ‣ domain ‣ data

Разделение архитектуры приложения на слои
Разделение архитектуры приложения на слои

Если ваше приложение достаточно сложное, у нас будет несколько функций.

И каждая фича (функция) может быть представлена группой классов, которые принадлежат к четырем слоям.

Фича — это сленг, название тех или иных признаков предмета, либо явления. Другими словами, это основная функция продукта, утратив которую пользователь расстроится и перестанет им пользоваться. (прим. переводчика)

В этом контексте у нас есть два варианта в отношении структуры проекта:

  • слои внутри объектов

  • объекты внутри слоев

Отношение фич приложения к слоям архитектуры
Отношение фич приложения к слоям архитектуры

Итак, что же нам следует выбрать?

Layer-first подход

Подход "фичи внутри слоев" (layer-first) не очень подходит для больших проектов с большим количеством функций.

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

Пример структы приложения при подходе "Layer-first"
Пример структы приложения при подходе "Layer-first"

Но с подходом "слои внутри фичи" (feature-first) дела обстоят намного лучше.

Для данной фичи все нужные нам файлы находятся в одной и той же папке верхнего уровня.

И мы по-прежнему получаем хорошее разделение между слоями.

Пример структы приложения при подходе "Feature-first"
Пример структы приложения при подходе "Feature-first"

На практике все не всегда просто.

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

И это затрудняет четкое определение различных функций (фич) и соответствующую структуру проекта.

На этом этапе у вас может возникнуть соблазн создать по одной папке для каждого экрана вашего приложения.

Но это ошибка, потому что функции (фичи) - это не экраны.

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

Она вам на Экран!
Она вам на Экран!

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

Это помогает нам определить функции, которые нам нужны, чтобы позже мы могли "создать правильную вещь".

Точка отсчета архитектуры приложения
Точка отсчета архитектуры приложения

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

И в результате вы сможете лучше организовать свой проект.

Отношение фич приложения к слоям архитектуры
Отношение фич приложения к слоям архитектуры

Конечно, к крупным проектам предъявляются некоторые дополнительные требования (инфраструктура, производительность, организационная структура).

Эти проекты часто разделены на полностью независимые модули (пакеты), принадлежащие разным командам.

Но это отличная идея - с самого начала применять дизайн, ориентированный на предметную область.

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

Комментарии (6)


  1. sovaz1997
    09.11.2023 08:50

    Чем-то напоминает супер-урезанную feature-sliced архитектуру (FSD)


  1. valguzin55
    09.11.2023 08:50

    советую присмотреться к архитектуре из этого репозитория https://github.com/imSanjaySoni/NoteApp-Clean-Architecture


    1. DimaLepel Автор
      09.11.2023 08:50

      Спасибо за совет. Обязательно посмотрю реализацию в репозитории. Когда заходит речь об архитектуре, все чаще упоминается BLOC. Настолько ли он Важен и полезен для проектов уровня "Заказать пиццу"?


      1. gev
        09.11.2023 08:50

        BLOC – не архитектура. С помощью BLOC можно построить разные архитектуры.


      1. Nikitakanunov
        09.11.2023 08:50

        Не стоит забывать про легковесную структуру - Cubit


      1. gev
        09.11.2023 08:50

        Если еще не видели, то рекомендую этот плейлист
        https://www.youtube.com/watch?v=cGLBJ8R1OJg&list=PLrnbjo4fMQwYWG8rRW9jaK2KMybYbSDem