老梗的MVC v.s. MVVM🥸
紀錄個人理解,有錯請不吝糾正,感謝
MVC(Model-View-Controller)

MVC
- Model:
- 負責資料儲存、型別定義,當資料有變化時,通知controller
- View:
- 呈現UI畫面,接收使用者的輸入,通知controller
- Controller:
- Model和View之間的中介,接收使用者的輸入,然後根據這些輸入對Model進行操作,最後更新View以反映Model的變化。
優點:
- 三大職責分離
- View/Model可被重用
缺點:
- 實際上商業邏輯跟UI容易混雜
- 難寫測試
MVVM(Model-View-ViewModel)

MVVM
- Model:
- 跟MVC的Model一樣,負責資料儲存、型別定義。
- View:
- 跟MVC的View一樣,負責呈現用戶界面,與MVC中的View相似。
- ViewModel:
- 作為View和Model之間的連接器,管理View所需的數據和狀態。使得View與Model解耦合,同時負責為View提供可綁定的數據。
最主要差異為用資料驅動view的更新(Data Binding),當資料異動時,去更新view
優點:
- 商業邏輯跟UI可分開,比較不會出現Massive View Controller的問題
- 容易寫測試
缺點:
- Data Binding 會導致較大的記憶體消耗
- View跟VM綁定,難重用
MVC v.s. MVVM最大差異?
個人覺得是在Controller跟ViewModel的更新的行為。MVC收到通知需要Controller主動去觸發更新,MVVM則因為已經跟資料綁定,當資料的狀態發生變化時,ViewModel會被通知,然後通過綁定自動更新相應的View。這種更新是被動的,因為是由綁定機制隱式地觸發和管理的。
MVVM的商業邏輯應該寫在哪?
有人說可以寫在VM裡,有人寫在VM很差要寫在Model。
我覺得可能要看複雜度來決定,VM的主要功能是把原始資料轉換成給View顯示用的資料。如果邏輯跟這個View有關是OK的。但如果是與這個View無關的邏輯的話(Application logic),可以在VM和Model中間再做一個service layer,這個service也屬於Model的一部分。
參考資料:
https://ithelp.ithome.com.tw/articles/10289734
https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html
https://front-chef.coderbridge.io/2021/02/27/mvc-mvvm/
https://stackoverflow.com/questions/37671866/should-i-implement-business-logic-on-a-model-or-a-viewmodel
https://softwareengineering.stackexchange.com/questions/429244/the-right-place-for-app-logic-in-mvvm-context