Насколько многоразовыми должны быть классы ViewModel? - PullRequest
7 голосов
/ 15 марта 2010

Я работаю над приложением WPF и структурирую его, используя шаблон MVVM.Изначально у меня была идея, что ViewModels можно использовать повторно, но теперь я уже не уверен.

  • Можно ли повторно использовать мои модели ViewModel, если мне нужны аналогичные функции для приложения WinForms?
  • Silverlight не поддерживает все возможности WPF - могу ли я использовать повторно для приложений Silverlight?
  • Что делать, если я хочу создать графический интерфейс Linux для своего приложения.Тогда мне нужен ViewModel для сборки в Mono - это то, к чему я должен стремиться?
  • И т. Д.

Итак;следует ли писать классы ViewModel с одним конкретным представлением или думать о возможности повторного использования?

Ответы [ 4 ]

13 голосов
/ 15 марта 2010

Чтобы ответить на ваш вопрос, подумайте о принципе единой ответственности:

«У класса должна быть одна и только одна причина для изменения.»

I 'Можно сказать, что в разумных пределах вы обычно не хотите повторно использовать ViewModel для нескольких представлений.Основная причина, по которой я бы поспорил, заключается в том, что это даст вашей ViewModel более чем одну причину для изменения.Другими словами, это должно было бы измениться, если изменилось одно или другое представление, и, по моему мнению, это две причины для изменения.Где это останавливается?В этом случае я бы оставил все как есть и привязал бы одну ViewModel к представлению.

Еще одна вещь, о которой нужно подумать с MVVM с WPF - это Data Templating.Это гораздо проще сделать, если каждая ViewModel обслуживает один и только один вид.

3 голосов
/ 15 марта 2010

На мой взгляд, главная цель MVVM - устранить код, который не может быть легко протестирован модульными тестами . Так как модель представления может быть проверена модулем, но представление не может, это достигается, делая вид максимально тупым. В идеале, как это можно сделать с XAML, представление является полностью декларативным и привязывается только к данным в модели представления. Отсюда мантра «нет кода позади».

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

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

3 голосов
/ 15 марта 2010

В общем, примените принцип ЯГНИ - он вам, вероятно, не понадобится. Если вы не видите, что эти вещи могут произойти, я бы придерживался самого простого подхода, чтобы ваше программное обеспечение работало в соответствии с вашими требованиями.

0 голосов
/ 24 декабря 2016

Это старый вопрос, поэтому я не решаюсь добавить еще один ответ. Но все ответы, опубликованные до сих пор, упустили из виду. Ответ от MSDN очень ясен: ViewModel специально предназначен для совместного использования многими представлениями в различных ОС, как показано на следующем рисунке:

enter image description here

В противном случае это неизбежно приведет к избыточному коду.

...