Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CodeFest 2019. Евгений Ртищев (Сбербанк Онлайн) — iOS. Всё есть MVC: зачем же нужны другие архитектуры?

16b6c87229eaf58768d25ed7b2bbbf52?s=47 CodeFest
April 06, 2019

CodeFest 2019. Евгений Ртищев (Сбербанк Онлайн) — iOS. Всё есть MVC: зачем же нужны другие архитектуры?

За последние несколько лет сильно набирают популярность новые типы архитектур в мире iOS: MVCC, MVVM, MVP, VIPER, CleanSwift, YARCH и другие. Каждый доклад по ним начинается с тезиса, что MVC — это Massive View Controllers. Но на практике оказывается, что это не проблема MVC, а проблема вашего кода и конкретной реализации.

MVC — это фундамент, он элегантный и потрясающий, но при этом и самый сложный из всех архитектурных подходов.

В докладе хотелось бы поговорить о том как эффективно использовать MVC, свободно переходить от одной архитектуры к другой и как осознанно выбрать именно ту, которая подойдёт вашей команде и проекту.

Обязательно будут освещены аспекты, важные для любого типа архитектуры:
— Задачи и ответственности слоёв
— Границы слоёв
— Декомпозиция каждого слоя (особенно уровня моделей)
— Связанность и переиспользуемость
— Взаимодействие модулей (роутинг и передача параметров)

16b6c87229eaf58768d25ed7b2bbbf52?s=128

CodeFest

April 06, 2019
Tweet

Transcript

  1. Всё есть MVC: зачем нужны другие архитектуры? Ртищев Евгений Sberbank

    Online
  2. MVC… как интересно !2

  3. !3

  4. MVC ‣Простой архитектурный дизайн ‣Вся ответственность в Controller ‣Massive View

    Controller ‣View связан c Controller ‣Слабая переиспользуемость ‣Невозможно писать тесты !4
  5. MVC ‣MVCC ‣MVVM ‣MVP ‣VIPER ‣CleanSwift ‣Flux ‣RIBs !5

  6. Может быть я ошибаюсь? !6

  7. !7 Я не одинок

  8. Перезагрузка !8

  9. MVC на самом деле: !9 ‣Самый сложный архитектурный дизайн ‣Гибкая

    и масштабируемая архитектура ‣View не связан жёстко c Controller ‣Можно писать тесты ‣MVC подчиняется SOLID ‣Архитектура совместимая с MVVM, VIPER, Flux и др.
  10. MV(X), VIPER, Clean !10 ‣Инородны нативным фреймворкам ‣Красиво решают проблемы

    на словах ‣Порождают новые проблемы
  11. !11

  12. На практике !12 ‣View и Presenter логически связаны ‣didTapButton ‣scrolledListToBottom

    ‣interactivePopGestureRecognizer
  13. На практике !13 ‣Presenter обрастает логикой проксирования ‣UIKit залезает в

    Presenter ‣NSAttributedString ‣DataSource для UITableView, UICollectionView и др. ‣Дублирование DTO (Interactor –> Presenter, Presenter –> View)
  14. На практике !14 ‣Роутинг ‣Смена иерархии (UIViewController, UIView) ‣Alerts, ActionSheet,

    SKSafariViewController ‣Передача параметров из модуля в модуль
  15. Корни проблем ‣Нарушение инкапсуляции ‣Нарушение SOLID ‣Controller в MVC ==

    UIViewController ‣UIViewController == экран ‣Отсутствие разделения по слоям ‣Отсутствие договорённостей по наименованию !15
  16. Как можно с MVC? !16

  17. MVC от Apple !17

  18. Типичный ViewController !18 ‣IBOutlets, constraints, setting Views ‣ViewDelegates + ViewDataSource

    ‣UIGestureRecognizer ‣NSManagedContext ‣URLSession ‣Filtering results ‣pushViewController ‣
  19. MVC от Apple !19 ‣Content Controller ‣Container Controller ‣Coordinating Controller

    ‣Model Controller
  20. Content Controller !20 ‣UITableViewController ‣UICollectionViewController ‣UISearchDisplayController ‣AVPlayerViewController ‣GLKitViewController ‣Ваш UIViewController

    c переопределённым loadView ‣IBOutlets, constraints, setting Views, recognizers в UIView
  21. Container Controller !21 ‣UINavigationController ‣UITabBarController ‣UISplitViewController ‣UIPageViewController

  22. Coordinating Controller !22 ‣UIViewControllerContextTransitioning ‣UIViewControllerAnimatedTransitioning ‣UIDocumentBrowserTransitionController ‣UIStoryboardSegue ‣Ваш Controller, реализующий

    логику изменения иерархии ‣
  23. Model Controller !23 ‣UIDocument / NSDocument ‣NSFetchedResultsController ‣NSArrayController ‣Controller !=

    UIViewController
  24. !24 Model Controllers Model Networking SOA CoreData Data Accessors Rules

    Repositories & DAO Filter, map, combine Common Reused Rules Business logic of App
  25. Покажи мне MVC !25

  26. !26 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let

    controller = SomeViewController() navigationController?.pushViewController(controller, animated: true) } Нарушение инкапсуляции
  27. !27 ListViewController SomeViewController UINavigationController CoordinatingController delegate push push owns Content

    Controller Content Controller Container Controller Coordinating Controller
  28. UIViewController != экран !28

  29. Связанность !29

  30. !30 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let

    controller = SomeViewController() controller.objectId = 12345 navigationController?.pushViewController(controller, animated: true) }
  31. Новый номер Текущий номер Экран успешной смены номера Вводим текущий

    номер Вводим новый номер Пример Подтверждаем смену номера Контроллер смены номера Текущий номер Новый номер Текущий номер Новый номер Новый номер Текущий номер Состояние !31
  32. Model First Architecture ‣aka Feature Driven Development ‣Сперва проектируйте Model

    и Model Controllers ‣Пишите тесты на Model и Model Controllers ‣Интерфейс должен быстро меняться ‣Переиспользуемость –> Заменяемость ‣ !32
  33. Слои и их ответсвенности !33

  34. View Model Controller !34

  35. View Controller Model Content Controller Container Controller Coordinating Controller Model

    Controller !35
  36. !36 View Content Controller Container Controller Coordinating Controller Model Controller

    Model IBOutlets, constraints, settings Views, recognizers ViewDelegates, ViewDataSource Composing UIViewController Transitions, DI Model accessors, business logic, common rules Repositories, DAO, Network, CoreData, Storage View, Presenter Router, Presenter Interactor, Presenter Entity
  37. Mindmap !37 ‣Massive View Controller is not your problem ‣Используйте

    4 типа контроллеров ‣Разделите ответственности ‣Избегайте связанности ‣Проектируйте от модели ‣Интерфейс должен меняться быстро ‣Тестируйте модель и Model Controllers
  38. Как ⚖ выбрать архитектуру? !38

  39. Оцените !39 ‣Размер команды ‣Зрелость и готовность команды ‣Бизнес-требования ‣Окружение

    ‣Искусственные ограничения
  40. СБОЛ сейчас ‣115 iOS-разработчиков ‣90 команд ‣60 внутренних модулей ‣Objective-C

    и Swift ‣Строгая межмодульная архитектура ‣MVC, Clean, VIPER и их разновидности внутри модулей !40
  41. More !41 ‣https://davedelong.com/blog/2017/11/06/a-better-mvc-part-1-the- problems/ ‣http://aplus.rs/2017/much-ado-about-ios-app-architecture/ ‣https://www.youtube.com/watch?v=A1vzcxR-Ss0 ‣https://events.yandex.ru/lib/talks/6706/ ‣https://medium.com/ios-os-x-development/modern-mvc-39042a9097ca ‣https://matteomanferdini.com/ios-architecture-lotus-mvc-pattern/ ‣Apple

    Guide Model-View-Controller
  42. Спасибо за внимание! Писать сюда: @katleta3000