Slide 1

Slide 1 text

Архитектура для шаблона 1 Семён Белялов Datasolution [email protected] telegram: @bouxroix

Slide 2

Slide 2 text

О чем доклад? 1. Freemarker templates 2. Наша архитектура, и что потенциально может делать шаблон 3. Пример создания шаблона нового экрана, реализующего нашу архитектуру и делающего максимально много 4. For fun шаблон нового проекта или модуля 2

Slide 3

Slide 3 text

Предыдущий доклад 3 https://youtu.be/H-gRJ3xsan0

Slide 4

Slide 4 text

Что было в том докладе? 1. Подробное освящение структуры freemarker шаблонов 2. Создание шаблоном fragment и presenter 3. Базовые классы с moxy 4. Подготовленные к конфигурации DI 5. Создание recycler adapter 4

Slide 5

Slide 5 text

Почему бы нам не создать свои шаблоны, которые делают максимально много? 5

Slide 6

Slide 6 text

Требования к шаблонам 1. Использование наших базовых классов 2. Формирование основных архитектурных слоев (пары класс интерфейс) 1. UI: views, viewmodels 2. Domain: interactors 3. Data: repositories 3. Автоматическая конфигурирование DI 4. Работа с навигацией 6

Slide 7

Slide 7 text

Приоритеты 1. Компилируемость после работы шаблона (работа из коробки) 2. Простота шаблона (без лишнего неиспользуемого функционала) 3. Максимальная ответственность шаблона 4. Clean архитектура с DI 7

Slide 8

Slide 8 text

Компоненты приложения 8

Slide 9

Slide 9 text

1. Добавление скоупа с основными компонентами приложения 9

Slide 10

Slide 10 text

2. Добавление вью к существующему скоупу. Shared viewmodel 10

Slide 11

Slide 11 text

3. Добавление интерактора и/или репозитория к существующим скоупам 11

Slide 12

Slide 12 text

Разработку приложения можно описать комбинацией этих сценариев Основные сценарии в разработке 12 1. Добавление нового scope с view, viewmodel, interactor, и repository 2. Добавление вью к существующей скоупу (shared view model) 3. Добавление интерактора или репозитория к существующим скоупам

Slide 13

Slide 13 text

13 Краткая структура шаблонов https://habr.com/ru/company/redmadrobot/blog/274897/

Slide 14

Slide 14 text

1. template.xml ui вид и изменяемые параметры 2. globals.xml.ftl переменные на основе template 3. recipe.xml.ftl команды с шаблонами файлов 4. *.ftl шаблоны файлов 14 Краткая структура шаблонов

Slide 15

Slide 15 text

1. Создает файл по шаблону 2. Изменение файла шаблоном 3. Копирует файлы (ресурсы) 15 recipe.xml.ftl

Slide 16

Slide 16 text

Шаблон НЕ может мержить .kt файлы, .xml .gradle может 16

Slide 17

Slide 17 text

Наш стек технологий 1. Kotlin 2. Jetpack (viewmodel, livedata, databinding, navigation, etc) 3. DI Toothpick 17 Создаем шаблоны нашей конфигурации

Slide 18

Slide 18 text

Создаем шаблоны нашей конфигурации 18

Slide 19

Slide 19 text

Шаблон новой фичи 1. Все зависит от screenName, фрагмент, xml, viewmodel interactor repository. (Даже title в туллбаре и label в nav graph) 90% случаев будет называться так, остальное исключение 2. addToolbar addList Как boolean позволяет выбирать 4 варианта фрагмента максимально лаконично 3. Считаем что сценарий когда не нужен репозиторий редким, а когда не нужен и интерактор еще реже 4. Делаем single activity, генерятся только фрагменты 19

Slide 20

Slide 20 text

Например фрагмент 20

Slide 21

Slide 21 text

Layout xml 21

Slide 22

Slide 22 text

Списки с databinding 1. Простые списки отличаются друг от друга только layout xml 2. Один базовый адаптер 3. Не нужен шаблон адаптера 22

Slide 23

Slide 23 text

Shared view model 23 https://developer.android.com/topic/libraries/architecture/viewmodel#sharing

Slide 24

Slide 24 text

Shared view model 24

Slide 25

Slide 25 text

Предполагаем single activity 25 Одно AppActivity Так проще шаблон, он генерит только фрагменты, и возможно так грамотнее.

Slide 26

Slide 26 text

Nav component 26

Slide 27

Slide 27 text

DI scopes 27

Slide 28

Slide 28 text

Очень удобно и просто привязать feature scope к жц viewmodel 1. viewmodel просто реализует данный делегат 28 DI: Toothpick

Slide 29

Slide 29 text

DI: Toothpick 29 Весь новый скоуп объявляется в новых файлах, шаблон идеально ложится.

Slide 30

Slide 30 text

DI: Если был бы Dagger 2 30 Для всех действий он требует редактировать существующие файлы, component, module или application

Slide 31

Slide 31 text

DI: Если был бы Koin 31 Для всех действий он требует редактировать существующие файлы, application, module

Slide 32

Slide 32 text

Dagger, koin, toothpick и шаблоны 1. Действие добавление фичи. Koin и dagger в любом случае требуют менять module, .kt файл, что шаблон делать не может. В toothpick эта логика в новых файлах. При конфигурировании скоупа старый код не меняется. Принципиальное отличии toothpick. 32

Slide 33

Slide 33 text

View вне DI скоупа 1. Реализация shared view model без изменения скоупа 2. Независимость скоупов с shared view model 3. Простота привязывания жц скоупа к вьюмодели 33 Плюсы 1. Отсутствие провайдинга зависимостей в конструктор вьюмодели Минусы

Slide 34

Slide 34 text

Генерируемые файлы 1. Добавление нового скоупа 2. Добавление вью к существующему скоупу 34 Итоговая ответственность шаблона

Slide 35

Slide 35 text

Шаблон новой фичи 35

Slide 36

Slide 36 text

Шаблон новой фичи 36 template.xml

Slide 37

Slide 37 text

Шаблон новой фичи 37 globals.xml.ftl

Slide 38

Slide 38 text

Шаблон новой фичи 38 recipe.xml.ftl

Slide 39

Slide 39 text

Шаблон новой фичи 39 Viewmodel.kt.ftl

Slide 40

Slide 40 text

Nav component и шаблон 40 Это xml и шаблон может его мержить

Slide 41

Slide 41 text

Мерж app_nav_graph.xml шаблоном 41

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

Раздельные ресурсные директории 43 Удобно когда они генерятся автоматически

Slide 44

Slide 44 text

Создаем шаблон нового проекта или модуля 44

Slide 45

Slide 45 text

Создаем шаблон нового проекта, модуля 1. В template Определяет шаблон нового проекта или модуля. 5. Нельзя добавлять такие шаблоны, только заменять 45

Slide 46

Slide 46 text

Пробуем сделать шаблон нового проекта или модуля 46

Slide 47

Slide 47 text

Пробуем сделать шаблон нового проекта или модуля 1. По нему формируется список предложенных активити 2. При клике создать новый проект или новый модуль последовательно применяется 2 шаблона. category application и category activity 47

Slide 48

Slide 48 text

Formfactor 48

Slide 49

Slide 49 text

Результат 49

Slide 50

Slide 50 text

Шаблон нового проекта 50 Добавляем к шаблону нового экрана базовые классы и AppActivity screen_globals.xml.ftl screen_recipe.xml.ftl Переиспользуем

Slide 51

Slide 51 text

Результаты 1. Были созданы шаблоны которые делают максимально много 2. Они простые и работают из коробки (новый проект частично) 3. Они используют наш стек технологий 4. https://github.com/roixa/RoixArchitectureTemplates 51

Slide 52

Slide 52 text

Дальнейшие планы 1. Добиться чтобы шаблон новый проекта работал идеально 2. Написать плагин. Возможно он способен сделать сценарий 3 52

Slide 53

Slide 53 text

Спасибо за внимание