Насколько повторно используемыми должны быть классы ViewModel?

StackOverflow https://stackoverflow.com/questions/2447026

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

В моем сознании, основная цель MVVM - исключить код, который не может быть легко протестирован с помощью модульных тестов.Поскольку модель представления может быть модульно протестирована, а представление - нет, это достигается за счет того, что представление делается как можно более тупым.В идеале, как это можно сделать с помощью XAML, представление является полностью декларативным и привязывается только к данным модели представления.Отсюда и мантра "никакого кода за этим".

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

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

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

enter image description here

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top