Viewmodel MVVM — это преобразователь значений, [1] то есть он отвечает за экспонирование (преобразование) объектов данных из модели таким образом, чтобы ими можно было легко управлять и представлять. В этом отношении viewmodel — это больше модель , чем view , и обрабатывает большую часть (если не всю) логики отображения view. [1] Viewmodel может реализовывать шаблон mediator , организуя доступ к внутренней логике вокруг набора вариантов использования, поддерживаемых view.
Модель–представление–модель представления также называется моделью–представлением–связующим устройством , особенно в реализациях, не связанных с платформой .NET . ZK , фреймворк веб-приложений, написанный на Java , и библиотека JavaScript KnockoutJS используют модель–представление–связующее устройство. [3] [5] [6]
Компоненты шаблона MVVM
Модель
Модель относится либо к модели домена , которая представляет реальное состояние контента (объектно-ориентированный подход), либо к слою доступа к данным , который представляет контент (подход, ориентированный на данные). [ необходима цитата ]
Вид
Как и в шаблонах модель-представление-контроллер (MVC) и модель-представление-презентатор (MVP), представление — это структура, макет и внешний вид того, что пользователь видит на экране. [7] Оно отображает представление модели и получает взаимодействие пользователя с представлением (щелчки мыши, ввод с клавиатуры, жесты касания экрана и т. д.), а также перенаправляет обработку этих действий в модель представления через привязку данных (свойства, обратные вызовы событий и т. д.), которая определена для связи представления и модели представления.
Посмотреть модель
Модель представления — это абстракция представления, выставляющая публичные свойства и команды. Вместо контроллера шаблона MVC или презентатора шаблона MVP, MVVM имеет связующее звено , которое автоматизирует связь между представлением и его связанными свойствами в модели представления. Модель представления была описана как состояние данных в модели. [8]
Главное различие между моделью представления и презентатором в шаблоне MVP заключается в том, что презентатор имеет ссылку на представление, тогда как модель представления — нет. Вместо этого представление напрямую привязывается к свойствам модели представления для отправки и получения обновлений. Для эффективной работы требуется технология привязки или генерация шаблонного кода для привязки. [7]
Декларативные данные и привязка команд неявно присутствуют в шаблоне MVVM. В стеке решений Microsoft связующим элементом является язык разметки XAML . [10] Связующий элемент освобождает разработчика от необходимости писать шаблонную логику для синхронизации модели представления и представления. При реализации вне стека Microsoft наличие технологии декларативной привязки данных делает этот шаблон возможным, [5] [11] а без связующего элемента обычно вместо этого используют MVP или MVC и приходится писать больше шаблонного кода (или генерировать его с помощью какого-либо другого инструмента).
Обоснование
MVVM был разработан для удаления практически всего кода GUI (« code-behind ») из слоя представления с помощью функций привязки данных в WPF (Windows Presentation Foundation) для лучшего разделения разработки слоя представления от остальной части шаблона. [3] Вместо того, чтобы требовать от разработчиков пользовательского опыта (UX) писать код GUI, они могут использовать язык разметки фреймворка (например, XAML ) и создавать привязки данных к модели представления, которая пишется и поддерживается разработчиками приложений. Разделение ролей позволяет интерактивным дизайнерам сосредоточиться на потребностях UX, а не на программировании бизнес-логики. Таким образом, слои приложения могут разрабатываться в нескольких рабочих потоках для более высокой производительности. Даже когда один разработчик работает над всей кодовой базой, надлежащее разделение представления от модели более продуктивно, поскольку пользовательский интерфейс обычно часто и поздно меняется в цикле разработки на основе отзывов конечного пользователя. [ необходима цитата ]
Шаблон MVVM пытается получить оба преимущества разделения функциональной разработки, предоставляемые MVC, при этом используя преимущества привязок данных и фреймворка, привязывая данные как можно ближе к чистой модели приложения. [3] [4] [12] [ необходимо разъяснение ] Он использует связующее устройство, модель представления и любые функции проверки данных бизнес-слоев для проверки входящих данных. Результатом является то, что модель и фреймворк управляют как можно большим количеством операций, устраняя или минимизируя логику приложения, которая напрямую манипулирует представлением (например, code-behind).
Критика
Джон Госсман раскритиковал шаблон MVVM и его применение в конкретных случаях, заявив, что MVVM может быть «излишним» при создании простых пользовательских интерфейсов. Он считает, что для более крупных приложений предварительное обобщение viewmodel может быть сложным, а крупномасштабное связывание данных может привести к снижению производительности. [13]
^ ab Smith, Josh; et al. «Мысль: MVVM устраняет 99% потребности в ValueConverters». Группы Google .
↑ Мартин Фаулер (19 июля 2004 г.). «Презентационная модель проектирования». Martin Fowler.com.
^ abcdef Смит, Джош (февраль 2009 г.). «Приложения WPF с шаблоном проектирования Model–View–ViewModel». Журнал MSDN .
^ ab Госсман, Джон (8 октября 2005 г.). «Рассказы от умного клиента: Введение в шаблон Модель/Представление/Модель представления для создания приложений WPF».
^ ab Massey, Simon (9 апреля 2011 г.). "Шаблоны представления в ZK" . Получено 24 марта 2012 г.
^ Стив Сандерсон. «KnockoutJS».
^ ab "The MVVM Pattern". msdn.microsoft.com . 4 октября 2012 г. Получено 29 августа 2016 г.
^ Пит Вайсброд. "Model–View–ViewModel Pattern for WPF: Yet another approach". Архивировано из оригинала 1 февраля 2008 г.
^ Microsoft (3 апреля 2024 г.). «Учебник: создание веб-API с помощью ASP.NET Core».
^ Wildermuth, Shawn (11 мая 2010 г.). "Windows Presentation Foundation Data Binding: Часть 1". Microsoft . Получено 24 марта 2012 г. .
^ "ZK MVVM". Potix . Получено 24 марта 2012 .
^ Карл Шиффлетт. "Изучение WPF MV-VM". Архивировано из оригинала 13 апреля 2009 г. Получено 5 июня 2009 г.
^ Госсман, Джон (4 марта 2006 г.). «Рассказы от умного клиента: преимущества и недостатки MV-VM». AI Skills Challenge .