1 of 51

КАК СПРАВЛЯТЬСЯ СО СЛОЖНЫМИ СПИСКАМИ В iOS И ANDROID

И НЕ СОЙТИ С УМА

Сейдалин Султан

Android / iOS разработчик, Aviata / Chocotravel

2 of 51

НЕМНОГО ОБО МНЕ

Сейдалин Султан

Android + iOS разработчик

3 of 51

`

4 of 51

`

5 of 51

`

6 of 51

UITableView

+

UITableViewDataSource

+

UITableViewDelegate

RecyclerView

+

RecyclerView.Adapter

7 of 51

Chocotravel

Aviata Railways

Aviata (Bookings)

8 of 51

9 of 51

`

10 of 51

Теперь давайте рассмотрим что такое “сложные” списки в нашем понимании

11 of 51

“Сложные” списки

  • Разные типы Cell / ViewHolder
  • Переменчивая последовательность
  • Абсолютно разная логика
  • Непостоянное количество в зависимости от условий

12 of 51

“Сложные” списки

  • Разные типы Cell / ViewHolder
  • Переменчивая последовательность
  • Абсолютно разная логика
  • Непостоянное количество в зависимости от условий

13 of 51

“Сложные” списки

  • Разные типы Cell / ViewHolder
  • Переменчивая последовательность
  • Абсолютно разная логика
  • Непостоянное количество в зависимости от условий

14 of 51

“Сложные” списки

  • Разные типы Cell / ViewHolder
  • Переменчивая последовательность
  • Абсолютно разная логика
  • Непостоянное количество в зависимости от условий

15 of 51

Booking Information Cell

Passengers Information Cell

Total Sum Information Cell

Refund Cell

16 of 51

Разбивка по типам Cell

Flight Info Cell

Passengers Info Cell

Total Sum Cell

Refund Cell

17 of 51

Flight Info Cell

Fare Families Cell

Passenger Info Cell

Proceed Button Cell

18 of 51

Разбивка по типам Cell

Fare Families Cell

Flight Info Cell

Passenger Info Cell

Proceed Button Cell

19 of 51

Старое решение iOS

20 of 51

Старое решение Android

21 of 51

Старое решение Android

22 of 51

Минусы

  • Массивный UITableViewDataSource / RecyclerView.Adapter
  • Много if - else условий
  • Сомнительная гибкость (open-closed principle)
  • Переиспользовать cell становится трудно
  • Boilerplate code

23 of 51

Минусы

  • Массивный UITableViewDataSource / RecyclerView.Adapter
  • Много if - else условий
  • Сомнительная гибкость (open-closed principle)
  • Переиспользовать cell становится трудно
  • Boilerplate code

24 of 51

Минусы

  • Массивный UITableViewDataSource / RecyclerView.Adapter
  • Много if - else условий
  • Сомнительная гибкость (open-closed principle)
  • Переиспользовать cell становится трудно
  • Boilerplate code

25 of 51

Минусы

  • Массивный UITableViewDataSource / RecyclerView.Adapter
  • Много if - else условий
  • Сомнительная гибкость (open-closed principle)
  • Переиспользовать cell становится трудно
  • Boilerplate code

26 of 51

Минусы

  • Массивный UITableViewDataSource / RecyclerView.Adapter
  • Много if - else условий
  • Сомнительная гибкость (open-closed principle)
  • Переиспользовать cell становится трудно
  • Boilerplate code

27 of 51

Как нам справляться с такими “сложными” списками?

Проблема

28 of 51

Задачи

  • Как нам сохранить гибкость при создании таких “сложных” списков?
  • Как нам не плодить гигантские UITableViewDataSource и RecyclerView.Adapter?
  • Как нам оставить возможность легко расширять и дополнять списки?

29 of 51

Задачи

  • Как нам сохранить гибкость при создании таких “сложных” списков?
  • Как нам не плодить гигантские UITableViewDataSource и RecyclerView.Adapter?
  • Как нам оставить возможность легко расширять и дополнять списки?

30 of 51

Задачи

  • Как нам сохранить гибкость при создании таких “сложных” списков?
  • Как нам не плодить гигантские UITableViewDataSource и RecyclerView.Adapter?
  • Как нам оставить возможность легко расширять и дополнять списки?

31 of 51

Мысли

  • Не привязываться к определенным моделькам
  • Не привязываться к определенным Cell / ViewHolder / Adapter
  • Разделить адаптеры, чтобы каждый выполнял свою цель
  • Переиспользовать Cell / ViewHolder где угодно как кубики LEGO

32 of 51

Мысли

  • Не привязываться к определенным моделькам
  • Не привязываться к определенным Cell / ViewHolder / Adapter
  • Разделить адаптеры, чтобы каждый выполнял свою цель
  • Переиспользовать Cell / ViewHolder где угодно как кубики LEGO

33 of 51

Мысли

  • Не привязываться к определенным моделькам
  • Не привязываться к определенным Cell / ViewHolder / Adapter
  • Разделить адаптеры, чтобы каждый выполнял свою цель
  • Переиспользовать Cell / ViewHolder где угодно как кубики LEGO

34 of 51

Мысли

  • Не привязываться к определенным моделькам
  • Не привязываться к определенным Cell / ViewHolder / Adapter
  • Разделить адаптеры, чтобы каждый выполнял свою цель
  • Переиспользовать Cell / ViewHolder где угодно как кубики LEGO

35 of 51

36 of 51

Решение

37 of 51

Cell View Models

Delegate Adapters

38 of 51

Cell View Models

39 of 51

Delegate Adapters

40 of 51

FlightInfoCellViewModel

PassengersCellViewModel

TotalSumCellViewModel

41 of 51

UITableViewCell

UITableViewCell

UITableViewCell

42 of 51

43 of 51

FlightInfoAdapterModel

PassengersAdapterModel

TotalSumAdapterModel

44 of 51

FlightInfoAdapter

PassengersInfoAdapter

TotalSumAdapter

45 of 51

FlightInfoAdapter

PassengersInfoAdapter

TotalSumAdapter

RefundAdapter

CompositeAdapter

46 of 51

47 of 51

Плюсы

  • SRP: Разделили каждый элемента списка и наделили собственными обязанностями
  • OCP: Расширять и дополнять списки стало легко. Не требуется модифицировать уже существующую реализацию
  • Пропали массивные адаптеры и UITableViewDataSource
  • Легко менять порядок и подключать/убирать элементы словно LEGO

48 of 51

Минусы

  • Много файлов
  • Немного усложнена обработка кликов

49 of 51

Cell View Models

Delegate Adapters

Полезные ссылки

https://habr.com/ru/post/341738/

http://hannesdorfmann.com/android/adapter-delegates

https://flawlessapp.io/blog/advanced-mvvm-tableview-tutorial/

50 of 51

Вопросы?

51 of 51

БЛАГОДАРЮ ЗА ВНИМАНИЕ!