從MVC到MVVM,再到MVVMC的開發經驗分享 - 黃惠勤
===
{%hackmd FGRWt1UuTFKk0wSbGgg-SA %}
> 請從這裡開始
## YouTube
{%youtube 0GQXVfahdI4 %}
## Slide
{%slideshare NgHuiQin1/mvc-mvvm-mvvmc-sharing-iplayground-2019 %}
## 前言
我沒有要說很多MVC的壞話
MVC其實是很多巨頭APP的根基
## 簡介
常犯的問題
MVVC解決什麼問題
要注意的問題
### MVC 常見的問題
controller 責任太多
### 如何減少ViewController的負擔(作代碼分類)
* 有些職責讓Model去做
* 模組化
* 避免singleton
* Extension(Category)
#### 程式的品質 Code Quality
* unit test (performance那麼高? 請給我加薪!?)
* 但是MVC寫測試會遇到瓶頸
* 補充:ViewController的職責太多難以去寫測試
### 將程式轉移到ViewModel
* Test Case單純針對ViewModel測試
* 就有理由不去寫ViewController的測試(?)
### 畫面複雜時:ViewModel很肥
* 整理多個ViewModel涵蓋子畫面模組
### ViewModel優化
* 釐清責任
* Inputs/Outputs Protocol
* Binding的時候好讀
* 寫Unit Test也簡單
### MVVMC (C - Coordinator)
Sample code:
https://github.com/nghuiqin/Todo-RxSwift-MVVMC
### Singleton的隱患
* 不知道誰改了他的值
* 想像一下Global Variabal的可怕性
* 寫測試的時候,他的狀態要怎麼控制 (難)
#### Dependency Injection
DateFormatter很貴
### MVVMC再進化 -> 實戰心得 -> 要注意的坑
* 不建議使用Xib/Storyboard
* Coordinator要注意回收的問題,原生回到上一頁時,要特別處理
### AppDependency傳入的方法
* 由於Coordinator有層層關係:
App -> B -> C -> D
* 如果只有D需要,B/C也要的帶要怎麼解決
-> 請大家給建議?勿用萬惡singleton?(myAppManager)
## 結語
* 沒接觸過MVVM,可從先從MVVM開始
* 一人團隊如果沒有太多時間,MVC也不錯
#### 共筆心得
* 關於不建議使用Xib/Storyboard(講者是希望在init func可以很漂亮。但其實透過ViewController Factory的話,其實還是可以很順暢的使用xib/storyboard)
* [Coordinators Essential tutorial. Part I](https://medium.com/blacklane-engineering/coordinators-essential-tutorial-part-i-376c836e9ba7)
* [Coordinators Essential tutorial. Part II](https://medium.com/blacklane-engineering/coordinators-essential-tutorial-part-ii-b5ab3eb4a74)
* Coordinator的作者表示,使用Storyboard話,就是完全不要用segue。因為Coordinator的核心就是,每個ViewController之間不需要知道彼此
* [How to implement flow coordinator pattern](https://medium.com/@pavlepesic/flow-coordination-pattern-5eb60cd220d5)
* [被誤解的MVC與被神化的MVVM](https://www.jianshu.com/p/79591e226d8c)
* Coordinator 採坑心得
* 一定要從AppCoordinator開始(appDelegate開始)
* 一人團隊我覺得是最好的練習跟開始,當你可以很好的運用
* Flow Controller 參考資料
* [Navigation with Flow Controllers](https://mecid.github.io/2019/02/20/navigation-with-flow-controllers/)
* [Massive View Controller 重構:Coordinator 模式與 Flow Controller](https://www.appcoda.com.tw/coordinator/)
###### tags:`iPlayground2019`