Ответ @RS Conley дает очень широкое представление о предмете, и я согласен с большинством. Единственное, что я думаю иначе, так это в чистой прибыли.
MVVM - это архитектура для 95% приложений в WPF.
Выбирать любую другую архитектуру означает соглашаться на что-то меньшее, чем лучшее, что вы можете получить. В ситуации RS Conley пассивный просмотр может быть лучшим выходом, но это далеко от нормального случая.
Чтобы понять, чем лучше MVVM, давайте посмотрим, что он теряет, переходя на подход PassiveView.
Ремонтопригодность
В пассивном представлении ViewModel знает о IView, что означает, что SRP (принцип единой ответственности) не сохраняется. Контроллер в PassiveView напрямую взаимодействует как с моделью, так и с представлением, и поэтому выполняет две совершенно разные вещи!.
В MVVM ViewModel, который является сердцем приложения, имеет только одну заботу: он должен содержать состояние и логику приложения. Ремонтопригодность такого кода действительно превосходит PassiveView, MVP или MVC.
Это правда, что PassiveView лучше, когда дело доходит до Coverege автоматических тестов, но IMHO, хорошая ремонтопригодность кода гораздо важнее. Возможность тестирования помогает убедиться, что вы не нарушаете свой код, в то время как ремонтопригодность помогает не создавать проблемный код с самого начала.
Когда дело доходит до ремонтопригодности, MVVM и PresentationModel являются развитием предыдущих архитектур пользовательского интерфейса, и это потому, что принцип SRP соблюдается очень строго. Напишите достаточно кода в MVVM, и вы поймете, что я имею в виду.
Смешиваемость
Еще одна особенность, в которой MVVM действительно силен, - это смешиваемость. Поскольку все состояние приложения сохраняется в ViewModel, легко подделать данные во время разработки, что позволяет значительно повысить производительность. Это невозможно создать в PassiveView, MVP или MVC, потому что во всех этих архитектурах контроллер должен активно помещать данные внутрь представления. В MVVM данные просто «перескакивают» в представление, и поэтому их можно высмеивать.
Возможность тестирования
Это действительно место, где PassiveView превосходит MVVM. Если 100% охват пользовательского интерфейса модульными тестами имеет для вас решающее значение, тогда это большое дело. Однако в большинстве ситуаций покрытия, которое позволяет вам MVVM, более чем достаточно, и вы обычно добавляете еще один уровень тестирования с использованием обычного тестирования пользовательского интерфейса (что, кстати, вы в конечном итоге будете делать в PassiveView).
Я думаю, что тестируемость - менее важная из трех функций. Отсортированные по важности, это ремонтопригодность, смешиваемость и тестируемость.
Где MVVM - неправильный выбор?
В прошлом году я участвовал в ~ 15 проектах WPF и Silverlight, все из которых идеально подходят для MVVM. Я думаю, что там, где логика представления чрезвычайно велика, например, в играх, MVVM может быть неправильным выбором. Кроме игр, я не могу придумать категорию приложений, которая не подошла бы лучше всего с MVVM, за исключением особых ситуаций, как упоминал Р.С. Конли.
person
Elad Katz
schedule
02.03.2011