AndrewChupin / VkTestTask

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

VkTestTask

CircleCI

Базовое описание архитектуры:


Архитектура приложения сочетает принципы подходов MVI и MVVM Данная архитектура не использует паттерн Command для реализации MVI, объекты типа Action, Effect заменены функциями, дабы избежать дополнительных аллокаций объектов.

Базовые компоненты архитектуры:

  • class ViewProperty - lite реализация LifeData, не требует передачи объекта LifecycleOwner, но при подписке возвращает объект Disposal, от которого View(Fragment) может отписаться.
  • interface marker ViewState - имплементируется конкретной реализацией ViewState, необходим для создания контракта, содержит в себе поля типа ViewProperty
  • interface Dispatcher - имплементируется классом ViewModel, в нем декларируются события к которым имеет доступ View(Fragment)
  • interface StateHolder - наследуется интерфейсом Dispatcher, предоставляет доступ View(Fragment) к ViewState
  • interface StateController - выполняет функции Reducer, наследуется от интерфейса StateHolder
  • class Store - содержит бизнес логику приложения

Ситуации применения различных классов:

  • Если экран не передает никаких action и у него отсутствует State, который необходимо хранить существует реализация без ViewState и Dispatcher, достаточно унаследовать реализацию Fragment от класса BaseFragment
  • Если экран передает action, но имеет state, существует реализация для Fragment - класс FragmentWithDispatcher и для Dispatcher - интерфейс Dispatcher
  • Для экранов который могу передавать эвены и имеют state необходимо использовать реализацию для Fragment - FragmentStateful, Dispatcher - DispatcherStateful

Обоснование использования библиотек:

Необходимое:

  • Kotlin - требование ТЗ
  • RecyclerView - отображение списков
  • Material - LifecycleActivity
  • Lifecycle - ViewModel

Опциональное:

  • Dagger 2 - для экспериментов с архитектурой, в целом не нужен
  • Cicerone - легковесная библиотека, как и Dagger, для приложения с 2 экранами лишнее, но экспериментов с архитектурой пойдет
  • RxJava, RxAndroid - можно удалить

На удалении:

  • Glide - в Road Map на удаление

RoadMap:

  • Добавить WindowInsets на экране результата для поддержки навигации 10 Android
  • Удалить библиотеку Glide, выполнять операцию Crop на верней поверхности изображения, чтобы было видно лицо
  • На старых телефонах подтормаживает при открытии экрана результата, проверить systrace(телефон тормозит сам по себе временами, возможно вина не в приложении, но сомневаюсь)
  • Поддержка горизонтальной ориентации(не придумал как можно использовать 9-patch кнопки на горизонтальной ориентации)
  • Улучшить поддержку планшетов(на данный момент настраиваются количество колонок на экране результата и максимальный размер кнопок, на экране Игры)
  • Cards на экране результата слишком маленькие и перекрывают все изображение когда имя актера и название шоу длинное
  • Экран истории игр
  • Добавить время которое дается для выбора героя(на экране игры)
  • Архитектура
  • Добавить в UI-тесты кейсы на проверку порядка GameCard на экране Game и Result и проверить, что ответы совпадают
  • Изменить API Swipeable элементов
  • Заменить дизайн кнопок на экране игры
  • Добавить обработку ошибок чтения из Assets

Заметки

  • Core компонент разрабатывался почти с нуля и на данный момент имеет некоторые недостатки
  • Так как в приложении почти нет бизнес-логики возможно стоило бы перенести код из Repository в Store
  • В приложении имеются UI-тесты для основных кейсов работы с View
  • UI приложения написан исключительно в коде для дальнейших замеров производительности
  • В плане архитектуры еще подумаю как реорагизовать StateController и ViewModel(Dispatcher) сейчас выглядят неважно, так же обнаружил проблему с обработкой
  • Swipeable API разрабатывался на основе https://github.com/yuyakaido/CardStackView

About


Languages

Language:Kotlin 100.0%