Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

MVC MVVM MVVMC

1,167 views

Published on

本次主題會介紹MVC的開發,並提及MVVM架構的設計及其解決的問題,最後會再切入MVVMC,進一步了解它想解決哪一些問題。基於產品的維護性、可讀性、可測試性等來分析架構的理念及重要性,再來就是一些實戰經驗分享。個人認為重要的不是學習這些架構而是它們解決的問題和理念,從中了解並思考為什麼要這樣設計

  • Be the first to comment

MVC MVVM MVVMC

  1. 1. MVC⇢MVVM⇢MVVMC 開發經驗分享 iPlayground 2019 @nghuiqin
  2. 2. ⾃肥時間 • NG(⾺來⻄亞⼈) • Develop from iOS 6, 7 • 在台灣⼯作快滿5年
  3. 3. 前⾔ 我沒有要說MVC的壞話 MVC其實是很多巨頭APP的根基
  4. 4. 簡介 • MVC介紹 → 常犯的問題 → 如何避免和維護 • MVVM解決什麼 → 實戰⼼得 → 優化 • MVVMC再進化 → 實戰⼼得 → 要注意的坑
  5. 5. Model View Controller MVC
  6. 6. MVC常遇到的問題
  7. 7. Controller 背負的責任 Fetch models Views layout Business Logic Routing Logic Selectors (Handle actions) Miscellaneous (Location, Map, Event…) Delegates
  8. 8. 如何 減輕Controller的負擔
  9. 9. 有些職責Model該做 Fat Model Skinny Controller
  10. 10. 模組化設計 → reusability
  11. 11. Utilities APIManager IAPHelper LocationManager AccountManager Reachability iCloudManager Singletons
  12. 12. Extension (Category)
  13. 13. 程式的品質 Code Quality UNIT TEST
  14. 14. View Controller View Business Logic Account State MVC 寫測試遇到瓶頸 Controller 會帶⼀些我們 不需要的Code Business Logic 有可能被 其他View/Object影響 …
  15. 15. Model View Controller MVC MVVM Model ViewModel View
 (Controller)
  16. 16. Controller 背負的責任 Fetch models Views layout Business Logic Routing Logic Selectors (Handle actions) Miscellaneous (Location, Map, Event…) Delegates
  17. 17. MVVM - Controller ⼯作量 initViewModel Views layout Routing Logic Selectors (Handle actions) Delegates
  18. 18. MVVM Model ViewModel View
 (Controller) 我很單純
  19. 19. ViewModel Binding to View → → → →
  20. 20. Unit Test Controller Business Logic Account State ViewModel View … 就有理由不⽤寫 Controller的單元測試
  21. 21. MVVM 實戰經驗談 我遇過的問題
  22. 22. 是不是所有View都需要 ViewModel? 不需要 簡單的畫⾯可以省略
  23. 23. 畫⾯複雜ViewModel好肥 StreamRoomViewModel 不負責任的假設 如果你的畫⾯跟17 App⼀樣很炫炮 MessageBox ViewModel GiftPanel ViewModel RankingViewModel AnimationViewModel 沒有⼈⽣來就可以寫完美的code, 持續 refactor 吧 GO!
  24. 24. 設計上比MVC花更多時間 某種程度上強迫你去理解完整的商業邏輯 先別動⼿寫Code,先思考。 畫好你的框架再填入內容
  25. 25. ViewModel 處理的資料/狀態 變多的時候... 我還是讀得朦傻傻
  26. 26. ViewModel 優化 更好讀、測試更好寫 順便釐清責任
  27. 27. Inputs/Outputs Protocol 始於Kickstarter在Java&Swift設計的⼀個VM structure https://github.com/kickstarter/native-docs/blob/master/vm-structure.md
  28. 28. 實作ViewModel ⽤Input約束其他物件的控制 ⽤Output約束出⼝,只做readOnly
  29. 29. Binding的時候也好讀
  30. 30. 寫Unit Test的時候也簡單
  31. 31. Model View Controller MVC MVVM Model ViewModel View
 (Controller) MVVMC Model ViewModel View
 (Controller) Coordinator
  32. 32. MVVMC 變形有很多種 我個⼈使⽤的是Green⼤⼤寫的Coordinator (比較單純,沒太多元素) https://github.com/nghuiqin/Todo-RxSwift-MVVMC/tree/master/Library
  33. 33. MVVM - Controller 責任 initViewModel Views layout Routing Logic Selectors (Handle actions) Delegates
  34. 34. Controller 責任-1 initViewModel Views layout Selectors (Handle actions) Delegates Routing logic Coordinator initVC
  35. 35. Controller 增加可重複使⽤性
  36. 36. Controller 責任-1 initViewModel Views layout Selectors (Handle actions) Delegates Routing logic Coordinator initVC 視情況⽽定
  37. 37. App Coordinator Login Coordinator MainTab Coordinator Register Coordinator Home Coordinator Setting Coordinator Detail Coordinator
  38. 38. Dependency Injection 消滅Singleton的存在
  39. 39. Singleton 的隱患 關聯性問題 Coupling Issue → 到底是誰改了它的值? → 想像⼀下Global Variable的可怕,海底撈針 → 寫測試的時候,它的狀態要怎麼控制?(難)
  40. 40. 定義App Dependency 靠Coordinator指派下去
  41. 41. 在ViewModel/View裡 設計Dependency的取⽤
  42. 42. DI + Protocol 簡化 單元測試
  43. 43. 現在我可以⾃由決定這個ViewModel的狀態 ⽬標就是測試ViewModel + Dependency邏輯正確
  44. 44. 建議DateFormatter也可以當 Utilities Dependency
  45. 45. 蘋果在這裏告訴你DateFormatter很貴 https://developer.apple.com/library/archive/documentation/Cocoa/ Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html
  46. 46. 寫MVVMC可能 會遇到的坑
  47. 47. 不建議使⽤xib/Storyboard 為了讓Dependency inject起來漂亮
  48. 48. Coordinator 注意回收的問題 依你使⽤的Coordinator的設計⽽定 我的情況是在原⽣回到上⼀⾴時下需要特別處理 另外就是可能被ViewController/ViewModel retain
  49. 49. AppDependency傳入的⽅法 由於Coordinator是有層層關係 App → B → C → D 如果只有D需要dependency的東⻄ B、C的Coordinator也會需要帶
  50. 50. MVVMC學習成本頗⾼ 真諦是理解為什麼要這樣設計 好像離⼤神更進⼀⼩步了 以後⾯試拿出來說嘴 (X
  51. 51. • 選擇適合你團隊的架構 • 沒接觸過MVVM的話,可先從MVVM開始 • 有必要跟風MVVMC嗎? 看團隊意願 • 個⼈建議全新專案 + 團隊認可這個⽅案 • ⼀⼈團隊沒有太多時間QAQ: MVC其實也不賴啦 結語
  52. 52. “Keep it simple, stupid.” 先從簡單的開始
  53. 53. References Follow Green • Github: @Greenchiu , Twitter: @handkid Kickstarter Inputs/Outputs Protocol • https://github.com/kickstarter/native-docs/blob/master/ vm-structure.md 想要了解更多MVVMC實作,可以參考我的練習 • https://github.com/nghuiqin/Todo-RxSwift-MVVMC/

×