---
# System prepended metadata

title: 從MVC到MVVM，再到MVVMC的開發經驗分享 - 黃惠勤
tags: [iPlayground2019]

---

從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` 
