淺入簡介 iOS 架構模式:MVC 與 MVVM 的優勢與取捨
MVC / MVVM 這些都是什麼

MVC / MVVM 這些都是什麼
我們常聽到的 MVC、MVVM 這些其實都是不同種的軟體架構模式(Architectural Pattern),跟設計模式(Design Pattern)有異曲同工之處,它們同樣都是要來解決相似的問題,如下面所列出的:
- 提升可維護性
- 提升可重用性
- 提升可擴展性
- 提升開發協助效率
- 降低複雜性
只不過軟體架構模式是專注在整個應用程式的整體架構,而設計模式專注在程式碼上的解法,可以發現它們只是在不同層級處理類似的事情。
那回到主題 MVC、MVVM 就是在架構層面提供不同的解法,而這些並沒有絕對的最好或最壞,而是要依照實際開發情況去做考量。
就從 MVC 開始說起

最早我在接觸到這個是在使用 ASP.NET MVC 開發網頁時所了解到的。
這個架構應該也是許多人第一次會碰到的吧(還是只有我?),因為我覺得它是最簡單最好理解的一種,它主要把整個專案拆解成 Model、View、Controller 以實現關注點分離( Seperate of Concerns, SoC),目的就是為了讓各個程式能夠專注做自己的事情而不要做職責之外的事,好處就如同上一章節所說的這裡不在贅述,那下面我來說明它們分別要做的事。
- Model:說白了就是資料模型,用來處理資料面的事情,例如打 API 大家最熟悉的 Request、Response 介面都確定了所以你就會寫一個結構去存放;又或是今天是跟資料庫去進行讀寫也一樣,只有 Model 能夠直接的對資料庫進行操作。
- View:這個如同字面意思,就是我們應用程式所看到的畫面,像是 Storyboard、Xib、SwiftUI 等,顯示的畫面或是對畫面進行設定都屬於這一部分。
- Controller:這可以想像它是介面 Model 跟 View 之間的橋樑,負責它們之間的構通,這樣說可能覺得很籠統把剩餘的事丟給它(事實上是這樣沒有錯),例如:畫面切換、商業邏輯、將 Model 的資料更新到 View 中(反之亦然)。
許多工程師一定都懂 DRY(Don’t Repeat Yourself),能做一次的絕不做第二次,讓東西都能夠盡量重複運用,那回頭看 Model 應該最常被用在各個地方,而 View 基本上也是能夠重複用在很多地方,而 Controller 通常都緊密的跟 View 綁住了,很難再利用到別處。
變種:Apple MVC

這個身為 iOS 開發者應該都懂,ViewController 總是太肥啦!因為可以從名字看出來它除了負責 Controller 也有負責 View 的部分,像是畫面的生命週期也都在這裡處理,所以如上圖看到的它們是被緊密的綁在一起密不可分,所以 MVC 或是 AppleMVC 在做單元測試(我想學 TDD 來讓我《更有自信的寫完程式及重構》)時會更難。
所以在這裡 Controller 了負責的任務有許多,這裡我參考自 iPlayground 的演講簡報內容,完整演講可以到這查看從MVC到MVVM,再到MVVMC的開發經驗分享 — 黃惠勤

為什麼 MVC 這麼好還需要 MVVM

有注意到我在前一章節有說到 Controller 是處理剩下的事情嗎,意味著它會越來越肥變成大家戲稱的 Massive-View-Controller ,所以 MVVM 出來就是為了解決 Controller 職責過大的問題。
這個架構分別是 Model、View、ViewModel 感覺也是分三塊而且 ViewModel 這個名字第一次看到可能也會霧煞煞, 我自己的理解就是它做它負責原本 Controller 應該做的事,在 iOS 中的 ViewController 也被歸類到 View 之中,從此之後它只做跟畫面相關的處理!
這樣讓 ViewModel 跟 View 解耦之後變得更純粹,也會讓單元測試的進行更加容易了。

而在這個架構中還有一個特點是 Data-Binding,就是當資料有異動時畫面就會一起更新,常見的方式是使用 FRP(Functional Reactive Programming)或是 KVO 等方式都可以達成,FRP 常見的就是 RxSwift 或是蘋果在 2019 年推出的 Combine,可以減少對畫面更新的操作,缺點就是門檻較高需要花時間去學習,像我覺得自己也沒有非常熟悉的情況下,對資料流就會覺得變得比較複雜不直覺。
後記
其實這個應該也是老掉牙的主題了,主要是想幫助自己與大家更加釐清整個觀念,所以用比較概念性的方式去說明,也就沒有深入的帶實作,之後若有機會深入的說明時可能人會帶大家實戰一遍,因為架構本身就是算抽象層了,各位聽完沒有什麼 Feel 很正常(也可能是我寫的問題XD),工作上或是練習實作後會比較有感覺,網路上很多教學可以去試試看。

參考資料
- iOS 中小型App 通用項目架構方案
- 談 iOS 架構:從 MVC 到 VIPER,以及 Redux
- 歡迎來到真實世界 — 原來是那個傳說中的MVVM阿
- Swift Tutorial: An Introduction to the MVVM Design Pattern
- 被誤解的 MVC 和被神化的 MVVM
- 從MVC到MVVM,再到MVVMC的開發經驗分享 — 黃惠勤