АННОТАЦИЯ 3
Перечень условных обозначений, символов, сокращений, терминов 5
Введение 6
1 Анализ и формулирование требований 8
1.1 Анализ первой версии библиотеки 8
1.1.1 Использование библиотеки 9
1.1.2 Ограничения первой версии 11
1.2 Формулирование требований ко второй версии библиотеки 11
1.2.1 Расширяемость функциональностей экрана при использовании
библиотеки 12
1.2.2 Расширяемость UI-шаблонов библиотеки 12
1.2.3 Использование функциональностей библиотеки без UI-шаблона 12
1.2.4 Требования ко второй версии библиотеки 13
2 Проектирование второй версии библиотеки 14
2.1 Инструменты разработки 14
2.2 Архитектурный подход в проекте 14
2.3 Зона ответственности первой версии библиотеки 17
2.4 Структура второй версии библиотеки 18
2.5 Core-модуль 20
2.5.1 Контейнер состояний 22
2.5.2 Обработка событий 23
2.5.3 Отслеживание событий аналитики 24
2.6 Слой плагинов 26
2.6.1 Плагин PressBackPlugin 27
2.6.2 Плагин PullToRefreshPlugin 28
2.6.3 Плагин LoadDataPlugin 30
2.6.4 Комбинирование плагинов 34
2.7 Возможность подключения плагинов к экрану 34
2.8 Построение Store 36
2.9 UI-шаблон фрагмента со списком 41
2.9.1 Интерфейс FCListFragmentDependencies 42
2.9.2 Собирающий FCUiStateContainerMapper 43
2.9.3 Принцип работы FCListFragmentStore 44
2.9.4 Собирающий FCListFragmentUiStateContainerRenderer 45
2.9.5 Собирающий FCListFragmentUiEventProvider 45
2.9.6 Собирающий FCListFragmentNewsHandler 46
2.9.7 Элементы пользовательского интерфейса и TiRecycler 47
2.9.8 Разделение сущностей шаблона по модулям 47
2.9.9 Расширяемость шаблона 48
3 Реализация библиотеки 49
3.1 Используемые технологии 49
3.2 Типизированный обработчик событий 49
3.3 Реализация плагина LoadDataPlugin 51
3.3.1 Способы загрузки данных 51
3.3.2 Загрузка данных одним запросом 51
3.3.3 Постраничная загрузка данных 53
3.3.4 Структурирование зависимостей плагина 56
3.3.5 Подключение плагина к FCStore 57
3.4 Особенности реализации UI-шаблона 58
3.4.1 Совместное использование плагинов LoadDataPlugin и PullToRefreshPlugin 58
3.4.2 Абстрактный класс FCTemplateListFragment 60
3.4.3 Возможность переопределять логику в сущностях шаблона 60
3.5 Тестирование библиотеки 61
3.5.1 Тестирование Core-модуля 61
3.5.2 Тестирование плагина LoadDataPlugin 62
3.5.3 Тестирование UI-шаблона со списком 63
3.6 Написание документации 64
4 Сравнение объема кода для реализации экрана с библиотекой и без нее 66
4.1 Реализация экрана-примера с использованием второй версии библиотеки ....66
4.2 Сравнение объема кода для реализации экрана 67
4.3 Сравнение объема кода при добавлении новых возможностей на экран 68
Заключение 71
Список использованных источников и литературы 72
В настоящее время мобильные приложения разрабатываются поэкранно. Разработчикам раз за разом приходится писать код для разработки каждого экрана. При этом многие экраны мобильных приложений имеют схожие функциональности, например, экран с вертикальным списком, который можно пролистывать вниз, чтобы в конец списка добавлялись данные. Еще одним примером будет являться то же закрытие экрана по нажатию системной кнопки «Назад» или кнопки на экране.
Схожее поведение на нескольких экранах ведет к тому, что мобильные разработчики пишут много повторяющегося кода по логике работы экрана для каждого экрана. Из этого вытекают многие факторы, например: написание дублируемого кода занимает время, есть возможность ошибиться в написании похожего кода, а также помимо дублируемого кода реализации какой-то логики, дублируются еще и тесты для каждого экрана, которые проверяют одинаковую логику.
В больших компаниях с настроенными процессами разработки написание дублируемого кода и повторяющие друг друга тесты являются еще большей проблемой, так как при добавлении каждого нового куска кода в общую кодовую базу выполняется довольно долгая проверка, что новый код не сломает приложение. Проверка долгая из-за того, что во время нее выполняются все тесты приложения, а наличие повторных тестов увеличивает время выполнения проверки, из-за чего каждый новый кусок кода будет все дольше добавляться в общую кодовую базу. А наличие дублируемого кода логики работы приводит к тому, что больше кусков кода нужно добавлять в общую кодовую базу, из-за чего разработка всего экрана и его появление в кодовой базе будет занимать много времени.
Для решения вышеперечисленных проблем было принято решение разработать внутри проекта первую версию Android-библиотеки для реализации типовых экранов. Она хорошо себя показала, и из-за этого она дорабатывалась и использовалась во все большем количестве экранов. Но в какой-то момент времени ограничения библиотеки не позволили развивать ее дальше, а отсутствие расширяемости со стороны пользователя библиотеки и вовсе сделало библиотеку подходящей только для узкого набора экранов.
Проблема библиотеки заключается в том, что изначально она не разрабатывалась для всех тех целей, для которых ее хочется использовать сейчас. Из-за этого в какой-то момент времени изначальный концепт реализации библиотеки помешал развивать ее дальше и остановил ее прогресс. Но несмотря на это библиотека была настолько удобная, что не хотелось отказываться от ее использования из-за наличия одной кнопки, которую библиотека не подразумевает. Было принято решение - написать «с нуля» вторую версию библиотеки, учитывая опыт разработки первой версии библиотеки и сделанные выводы.
Таким образом, цель работы - разработать вторую версию Android-библиотеки для реализации типовых экранов.
Можно выделить следующие задачи:
1) Проанализировать первую версию библиотеки,
2) Сформулировать требования ко второй версии библиотеки,
3) Спроектировать вторую версию библиотеки,
4) Реализовать вторую версию библиотеки,
5) Провести сравнение объема кода, необходимого для реализации экрана, с использованием библиотеки и без нее.
В процессе работы над второй версией библиотеки была проанализирована первая версия и были сформулированы требования ко второй версии. После этого была спроектирована и реализована вторая версия библиотеки. Библиотека включает в себя три плагина и шаблон фрагмента со списком.
Для разработанной библиотеки были написаны Unit-тесты, чтобы обеспечить ожидаемую логику работы реализованных функциональностей. Также была написана документация с подробным описанием всех основных сущностей библиотеки, написанных плагинов и шаблона.
В целях демонстрации набора классов для реализации экрана с использованием второй версии библиотеки и для сравнения объема кода, необходимого для реализации экрана, без использования библиотеки и с использованием первой и второй версий, был реализован типовой экран со списком статей всеми тремя способами, после чего было проведено сравнение.
Реализованная библиотека готова к применению, в будущем планируется добавлять в нее новые плагины и шаблоны. На данный момент несколько экранов реализовано с применением плагинов библиотеки, а в дальнейшем планируется провести миграцию всех экранов, написанных с использованием первой версии библиотеки, на шаблоны из второй версии библиотеки. Также, скорее всего, планируется опубликовать библиотеку в открытый доступ.
В ходе работы над библиотекой был получен уникальный опыт анализа и формулирования требований, проектирования и реализации библиотеки, которая должна не только уменьшать объем кода, необходимого для реализации экрана, но и быть расширяемой, чтобы увеличить число случаев, когда библиотеку можно использовать. Также был получен опыт написания тестов и документации для библиотеки.
1. Pull-to-refresh модель работы UI:
[Электронный ресурс] /
https://wnfx.ru/pulltorefresh-model-rabotyi-ui/ (дата обращения 29.03.24)
URL:
2. Пагинация: что это такое:
[Электронный ресурс] / URL:
https://kokoc.com/terminy/paginaciya-na-sajte-chto-ehto-takoe/ (дата обращения 29.03.24)
3. Архитектурный подход KoTEA:
[Электронный ресурс] / URL:
https://github.com/tinkoff-mobile-tech/KoTEA (дата обращения 01.04.24)
4. Android SDK:
[Электронный ресурс] / URL:
https://www.techopedia.com/definition/4220/android-sdk (дата обращения 05.04.24)
5. Java:
[Электронный ресурс] / URL:
https://www.java.com/en/download/help/whatis java.html (дата обращения 05.04.24)
6. Kotlin:
[Электронный ресурс] / URL:
https://kotlinlang.org/docs/getting-started.html (дата обращения 05.04.24)
7. Использование Kotlin для Android:
[Электронный ресурс] / URL:
https://kotlinlang.org/docs/android-overview.html (дата обращения 05.04.24)
10. Мобильная аналитика: как отслеживать и анализировать поведение
пользователей в приложении:
[Электронный ресурс] / URL:
https://dzen.ru/a/ZFtqeiYakTqA5lnf (дата обращения 12.04.24)
11. Принципы SOLID: принцип единственной ответственности:
[Электронный ресурс] / URL:
https://web-creator.ru/articles/solid the single responsibility principle (дата обращения
13.04.24)
12. Инкапсуляция:
[Электронный ресурс] / URL:
https://vectree.ru/text/132/3/0 (дата обращения 19.04.24)
13. Строитель (Builder):
[Электронный ресурс] / URL:
https://metanit.com/sharp/patterns/2.5.php (дата обращения 19.04.24)
14. Fragments:
[Электронный ресурс] / URL:
https://developer.android.com/guide/fragments (дата обращения 23.04.24)
15. SwipeRefreshLayout:
[Электронный ресурс] / URL:
https://developer.android.com/reference/androidx/swiperefreshlayout/widget/SwipeRefreshLayo ut (дата обращения 24.04.24)
...33