MVM (Model-View-ViewModel) и MVP (Model-View-Presenter) — паттерны проектирования пользовательского интерфейса.
Отличия:
- Связывание:
- MVM использует двустороннее связывание данных (data binding) между View и ViewModel. Изменения в ViewModel автоматически отображаются в View, и наоборот.
- MVP обычно использует одностороннее связывание: Presenter обновляет View, а View уведомляет Presenter о событиях.
- Ответственность View:
- В MVM View — "глупая" (passive), ее основная задача — отображение данных из ViewModel и отправка пользовательских действий обратно в ViewModel. Логика представления полностью находится в ViewModel.
- В MVP View — также "глупая", но Presenter полностью управляет ее обновлением и реакцией на события. View информирует Presenter о событиях, и Presenter решает, как на них отреагировать и как обновить View.
- Тестируемость:
- ViewModel в MVM легко тестируется, так как не зависит от UIKit/AppKit.
- Presenter в MVP также хорошо тестируется, но его зависимость от абстрактного интерфейса View может требовать мокирования.
- Зависимости:
- MVM: View зависит от ViewModel, ViewModel зависит от Model.
- MVP: View зависит от Presenter, Presenter зависит от Model. View и Presenter связаны интерфейсами.
- Координация:
- В MVM View вызывает команды (commands) или методы в ViewModel в ответ на пользовательские действия.
- В MVP View вызывает методы в Presenter через интерфейс, а Presenter вызывает методы для обновления View также через интерфейс.
Пример MVM (схематично):
swift