這篇是以我自己理解的內容來記錄
所以哪邊有理解錯誤的地方,再麻煩跟我說,感謝~
在開發上,有著許多的 Design Pattern (設計模式)
像是 MVC (Model-View-Controller)、MVVM (Model-View-ViewModel)、MVP (Model-View-Presenter) 等
以 iOS App 來說,Apple 自己是比較傾向 MVC 架構
▲ 圖取自 Apple Developer Documentation
但實際上開發,卻很常會變成 Model+ViewController 的架構
你說,原本的 View 去哪裡了,他去跟 Controller 合為一體了~
然後 App 規模在大一點,可能會變成 Massive View Controller
因為 UI (也就是 View) 跟邏輯運算 (也就是 Controller) 都混在一起
這樣在維護、測試上就會不太方便,所以就延伸出許多的設計模式來改善 MVC 架構
像是開頭提到的 MVVM (Model-View-ViewModel)、MVP (Model-View-Presenter)
再用一次上面的圖 (哈哈哈哈)
▲ 圖取自 Apple Developer Documentation
先來介紹 MVC 各層所負責的事情
- 提高程式的可維護性,MVC 將一個功能區分成許多片段,讓程式變得容易維護
- 在 MVC 中,同一個 Model 可以被不同的 View 重用,提高了程式碼的可重用性
- MVC 的架構容易識別,可以讓工程師快速掌握項目的結構
- MVC 將一個功能分成了三部分,因此多個工程師可以同時開發不同部分的程式碼
- View 與 Controller 綁住了,不易進行 Unit Test
- 要花費較多的時間進行前置規劃
- 要管理較多檔案
▲ 圖取自網路
先來介紹 MVVM 各層所負責的事情
簡單來說,
Model 只能與 ViewModel 做互動,不能與 View/ViewController 互動
ViewModel 會與 Model 還有 View/ViewController 做互動
View/ViewController 只能與 ViewModel 做互動,不能與 Model 互動
- 用 Data Binding 的方式與 View/ViewController 溝通,使 ViewModel 可以不用知道是哪個 View/ViewController
- 商業邏輯不用與 UI 綁在一起,讓 ViewController 可以瘦身
- ViewModel 相對容易執行單元測試 (Unit Test)
- 大型的應用程式中,Data Binding 會導致相當大的記憶體消耗
- 無法簡單重用 View/ViewController,因為與 ViewModel 綁定的關係
- 並無強硬規定 View/ViewController 跟 ViewModel 的關係
(Ex:單向 or 雙向溝通)- 不易除錯,不容易找出 bug 是在 Model 還是 View