Действительно ли MVVM бессмыслен? [закрытый]

Бессмысленна православная реализация MVVM? Я создаю новое приложение, и я рассмотрел Windows Forms и WPF. Я выбрал WPF, потому что это соответствует требованиям завтрашнего дня, и предложите большую гибкость. Существует меньше кода и легче внести существенные изменения в Ваш UI с помощью XAML.

Так как выбор для WPF очевиден, я полагал, что могу также пойти полностью при помощи MVVM как моя архитектура приложения, так как это предлагает смешиваемость, разделительные проблемы и тестируемость единицы. Теоретически, это кажется красивым как Святой Грааль программирования UI. Это краткое приключение; однако, превратился в реальную головную боль. Как ожидалось на практике я нахожу, что обменял одну проблему на другого. Я склонен быть одержимым программистом в этом, я хочу сделать вещи правильный путь так, чтобы я мог получить правильные результаты и возможно стать лучшим программистом. Шаблон MVVM просто завалил мой тест на производительности и только что превратился в большой взлом yucky!

Очевидный рассматриваемый вопрос добавляет поддержку Модального диалогового окна. Корректный путь состоит в том, чтобы поднять диалоговое окно и связать его с моделью представления. Получение этого работать является трудным. Для пользы из шаблона MVVM необходимо распределить код в нескольких местах всюду по слоям приложения. Также необходимо использовать тайные конструкции программирования как шаблоны и lamba выражения. Материал, который заставляет Вас уставиться на экран, царапающий Вашу голову. Это делает обслуживание и отладку кошмара неизбежными, когда я недавно обнаружил. Я имел о поле, хорошо работающем, пока я не получил исключение во второй раз, когда я вызвал его, говоря, что оно не могло показать диалоговое окно снова, после того как оно закрывается. Я должен был добавить обработчик событий для близкой функциональности к диалоговому окну, другому в реализации IDialogView его и наконец другом в IDialogViewModel. Я думал, что MVVM сохранит нас от такого экстравагантного хакерства!

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

Я - планирование отказывания от шаблона представления MVVM, по крайней мере, его православная реализация его. Что Вы думаете? Это стоило проблемы Вам, если у Вас был кто-либо? Я - просто некомпетентный программист или делаю MVVM не, чем он расшевелен, чтобы быть?

90
задан BoltClock 4 August 2011 в 05:17
поделиться

5 ответов

Извините, если мой ответ стал немного длинным, но не вините меня! Ваш вопрос тоже длинный.

Таким образом, MVVM не бесполезен.

Ярким примером является добавление поддержки для модального диалогового окна. Правильный способ - открыть диалоговое окно и привязать его к модели представления. Заставить это работать сложно.

Да, это действительно так.
Однако MVVM предоставляет вам способ отделить внешний вид пользовательского интерфейса от его логики. Никто не заставляет вас использовать его везде, и никто не держит пистолет у вашего лба, чтобы заставить вас создать отдельную ViewModel для всего.

Вот мое решение для этого конкретного примера:
Как пользовательский интерфейс обрабатывает определенные входные данные, ViewModel не занимается. Я бы добавил код в файл View .xaml.cs, который создает экземпляр диалогового окна и устанавливает тот же экземпляр ViewModel (или что-то еще, если необходимо) в качестве его DataContext.

Чтобы извлечь выгоду из шаблона MVVM, вы должны распределить код в нескольких местах по уровням вашего приложения. Вы также должны использовать такие эзотерические программные конструкции, как шаблоны и лямба-выражения.

Ну, вам не обязательно использовать его в нескольких местах. Вот как я мог бы решить эту проблему:

  • Добавьте XAML в представление и ничего в .xaml.cs
  • Запишите логику каждого приложения (кроме того, что напрямую работает с элементами пользовательского интерфейса) внутри ViewModel
  • Весь код, который должен выполняться пользовательским интерфейсом, но не имеющий ничего общего с бизнес-логикой, помещается в файлы .xaml.cs

Я думаю, что цель MVVM в первую очередь состоит в разделении логики приложения и конкретного пользовательского интерфейса. , что позволяет легко изменять (или полностью заменять) пользовательский интерфейс.
Я использую следующий принцип: представление может знать и предполагать все, что хочет от модели представления, но модель представления НИЧЕГО не может знать о представлении.
WPF предоставляет удобную модель привязки, которую вы можете использовать для достижения именно этого.

(Кстати, шаблоны и лямбда-выражения не являются эзотерическими при правильном использовании. Но если вы не хотите, не используйте их.)

Вещи, которые заставляют вас смотреть в экран, почесывая голову.

Да, я знаю это чувство. Именно то, что я почувствовал, когда впервые увидел MVVM. Но как только вы освоитесь, это больше не будет плохо.

Окно "Около" работало нормально ...

Зачем вы помещали ViewModel за окном "Около"? Нет смысла в этом.

Большинство наборов инструментов MVVM скрывают диалоги, и когда они обращаются к ним, они представляют собой просто окна предупреждений, для которых не требуются настраиваемые интерфейсы или модели просмотра.

Да, потому что сам факт, что элемент пользовательского интерфейса находится в том же окне, или другом окне, или находится на орбите Марса в данный момент, не касается ViewModels.
Разделение проблем

РЕДАКТИРОВАТЬ:

Вот очень красивое видео с названием Создайте свою собственную структуру MVVM . Стоит посмотреть.

61
ответ дан 24 November 2019 в 07:07
поделиться

Я решаю проблему с диалогами с помощью жульничества. My MainWindow реализует интерфейс IWindowServices, который предоставляет все диалоговые окна, зависящие от приложения. Затем мои другие ViewModels могут импортировать интерфейс служб (я использую MEF, но вы легко можете просто передать интерфейс через конструкторы вручную) и использовать его для выполнения того, что необходимо. Например, вот как выглядит интерфейс моего небольшого служебного приложения:

//Wrapper interface for dialog functionality to allow for mocking during tests
public interface IWindowServices
{
    bool ExecuteNewProject(NewProjectViewModel model);

    bool ExecuteImportSymbols(ImportSymbolsViewModel model);

    bool ExecuteOpenDialog(OpenFileDialog dialog);

    bool ExecuteSaveDialog(SaveFileDialog dialog);

    bool ExecuteWarningConfirmation(string text, string caption);

    void ExitApplication();
}

Это объединяет все исполнения диалогов в одном месте, и его можно легко отключить для модульного тестирования. Я следую шаблону, согласно которому клиент диалога должен создать соответствующую ViewModel, которую затем можно настроить по мере необходимости. Блокирует вызов Execute, после чего клиент может просмотреть содержимое ViewModel, чтобы увидеть результаты диалога.

Более «чистый» дизайн MVVM может быть важен для большого приложения, где вам нужна более чистая изоляция и более сложная композиция, но для приложений малого и среднего размера я считаю практическим подходом с соответствующими службами для выявления требуемых хуков, вполне достаточно.

5
ответ дан 24 November 2019 в 07:07
поделиться

Я видел ту же проблему во многих реализациях MVVM, когда дело доходит до (модальных) диалогов. Когда я смотрю на участников шаблона MVVM, у меня возникает ощущение, что чего-то не хватает для создания связного приложения.

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

Но отсутствует:

  • Кто создает ViewModels?
  • Кто отвечает за рабочий процесс приложения?
  • Кто является посредником между ViewModels, когда им нужно взаимодействовать друг с другом?

Мой подход состоит в том, чтобы представить (Сценарий использования) Контроллер , который отвечает за недостающие точки. Как это работает, можно увидеть в примерах приложений WPF Application Framework (WAF) .

-1
ответ дан 24 November 2019 в 07:07
поделиться

Трудно заставить это работать. Чтобы воспользоваться шаблоном MVVM , вам необходимо распределить код в нескольких местах на уровнях вашего приложения. Вы также должны использовать конструкции эзотерического программирования , такие как шаблоны и выражения lamba .

Для обычного модального диалогового окна? Вы определенно делаете что-то не так - реализация MVVM не должна быть такой сложной.

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

MVVM, MVC, Document-View и т. Д. - это старое семейство шаблонов. Есть недостатки, но нет фатальных недостатков того типа, который вы описываете.

8
ответ дан 24 November 2019 в 07:07
поделиться

Нет, это не бессмысленно, но сложно осмыслить, хотя сам узор смехотворно прост. Есть масса дезинформации и различные группы, которые борются за правильный путь. Я думаю, что с WPF и Silverlight вам следует использовать MVVM, иначе вы будете чрезмерно кодировать и пытаться решать проблемы в новой модели, используя «старую» методологию форм выигрыша, которая только приведет вас к неприятностям. Это в большей степени относится к Silverlight, так как все должно быть асинхронным (здесь возможны взломы, но вы должны просто выбрать другую платформу).

Я бы посоветовал прочитать эту статью Упрощение WPF TreeView с помощью шаблона ViewModel внимательно посмотрите, как можно хорошо реализовать MVVM и позволить вам изменить менталитет форм выигрыша на новый образ мышления в MVVM. Короче говоря, когда вы хотите что-то сделать, сначала примените логику к ViewModel, а не к View. Вы хотите выбрать товар? Изменить значок? Не перебирайте элементы пользовательского интерфейса, просто обновите свойства модели и позвольте привязке данных сделать все необходимое.

0
ответ дан 24 November 2019 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: