MVVM: форматирует ли ViewModel данные, получаемые из модели?

Я немного запутался в MVVM.

Я понимаю концепцию и вижу преимущества. Моя проблема: передает ли ViewModel данные непосредственно из модели.

Например, предположим, что у меня есть модель «Пользователь» с методом findByName(). ViewModel вызовет это, чтобы передать соответствующие данные пользователя в представление.

Модель, скорее всего, повторно запустит набор объектов «Пользователь», каждый из которых имеет такие свойства, как имя, адрес электронной почты и т. д., а также может иметь методы.

Мой вопрос: должна ли ViewModel возвращать набор объектов User в представление или возвращать реструктурированную версию этого, которая содержит только то, что нужно представлению?

Насколько я понимаю, объект "Пользователь" в данном случае является частью уровня модели и в MVVM View должен зависеть только от ViewModel.

Моя проблема с этим заключается в количестве, казалось бы, избыточной логики привязки, необходимой в ViewModel, которая будет создана для реструктуризации вывода.

Передача набора объектов User непосредственно в представление (через ViewModel) была бы намного проще.


person ix.    schedule 06.10.2010    source источник


Ответы (2)


Конечно, есть небольшая избыточность. Однако, если вы реализуете MVVM, представляя объекты, вы получаете

  • форматировать информацию о модели для представления, не загрязняя модель логикой представления
  • уведомить представление, когда что-либо изменится
  • используйте проверку WPF (если вы используете WPF)
  • запускайте приемочные тесты с уровня виртуальной машины, а не с графического интерфейса, если вы хотите
  • абстрагируйте свою презентацию от любых изменений в модели.

Последнее важно. В настоящее время в основном привязки презентаций являются динамическими и молчат, веб-страницы, WPF, что угодно. Это означает, что если кто-то решит переименовать что-то в модели, это внезапно сломает ваш графический интерфейс, и вы не узнаете.

Помещая виртуальную машину между вашей моделью и представлением, вы защищаете себя от подобных изменений.

Если вы хотите пойти дальше и получить что-то, работающее с пользователями, как они есть, я говорю, сделайте это - это поможет вам быстро получить обратную связь о вашем графическом интерфейсе. Однако в первый раз, когда эти объекты User не делают именно то, что нужно представлению, или вам нужно уведомить представление об изменении, или вы обнаружите, что загрязняете модель, или что-то в привязке разрывается, может быть, сейчас самое время перейти на МВВМ.

person Lunivore    schedule 06.10.2010
comment
Я не использую WPF или silverlight, я использую PHP, и я достиг точки с MVC, когда я осознал его ограничения и то, что MVVM предоставляет многочисленные преимущества по сравнению с прямым взаимодействием с моделью представления. Я не уверен, что многие из ваших пунктов применимы в этом случае. Например, невозможно уведомить представление об изменениях в модели. Мои представления в настоящее время делают что-то вроде этого: ‹table› ‹? $users = $this-›viewModel-›getUsers(); foreach ($users as $user) { ?› ‹tr› ‹td›‹?=$user-›name;?›‹/td› ‹td›‹?=date(DATE_RFC2822, $user-›registrationDate);› ‹/td› ‹/tr› ‹? } ?> - person ix.; 07.10.2010
comment
Я настроил его так, чтобы представление можно было использовать с любой ViewModel, которая имеет определенный интерфейс, это представление становится многоразовым для любого списка пользователей, и вся логика фильтрации была делегирована конкретной ViewModel. Представление выполняет любое форматирование данных. Я думаю, что моя проблема заключается в его ремонтопригодности. Если я добавлю поле в объект User, прежде чем я смогу начать использовать его в связанных представлениях, мне нужно будет обновить связанные ViewModels, что кажется кошмаром с точки зрения обслуживания. Особенно учитывая, что за моделью у меня есть DataMapper, отображающий поля базы данных в объект User. - person ix.; 07.10.2010
comment
Что ж, когда это начинает превращаться в кошмар с точки зрения ремонтопригодности в другом направлении — потому что вы ничего не можете изменить в своей модели, потому что это ломает все ваши представления — это также хорошее время для перехода на MVVM. Возможно, немного раньше. ;) - person Lunivore; 07.10.2010

Разве это не просто переносит разрыв на ViewModels, которые используют модель? Вам все равно нужно пройти и обновить все это.

Если бы я что-то переименовал (например, изменил «фамилию» на «фамилию»), я бы ожидал, что что-то сломается. Я не понимаю, как это исправляет добавление привязки на уровне виртуальной машины.

person Tom B    schedule 09.10.2010