2009-11-06 65 views
10

我在使用winform时正在使用MVP。但是当我开始使用WPF或Silverlight时,我转向了MVVM。MVP VS MVVM - 为什么

我唯一注意到的是,我们不需要在MVVM模式中的View和ViewModel之间同步数据,因为它具有强大的绑定。

我的问题是〜

1)绑定(帮助我们不要手动同步查看和视图模型)是使用MVVM唯一的优势。

2)有没有其他MVVM优于MVP?有什么区别?

3)下面的代码是MVVP模式还是MVVM或两者兼而有之?

interface IView{ 

    void ShowMessage(string message); 

} 

class View : IView { 
    public void ShowMessage(string message){ 
       MessageBox.Show(this, message); 
    } 
} 

class ViewModel{ 

private IView view; 

public ViewModel(IVew view){ 

    this.view = view; 

} 

........ 

view.ShowMessage("This is a msg"); 

} 

谢谢。

+1

关于SO的相关文章:[http://stackoverflow.com/questions/839118/composite-guidance-for-wpf-mvvm-vs-mvp] – Marc 2009-11-06 07:34:47

+0

这是VM不应该意识到View的角色吗?关于View的界面? – Mark 2009-11-06 07:49:36

+0

如果我喜欢在保存后将焦点设置到控件上,那么该怎么办?我应该创建一个附加属性来设置焦点吗? – Mark 2009-11-06 07:53:10

回答

5

实施例是MVP,通过这条线明确规定:

view.showMessage("This is a msg"); 

虽然从MVP和MVVM产生的代码可能看起来微不足道在类似的例子,这些模式是显著不同。如果你怀疑MVVM只是微软MVP的名字,那不是。

这是微软的一个不太知名的PM(演示模型)模式的名称 - 您可能需要阅读其描述。

+1

是的。感谢您回答问题#3。问题1和问题3呢? 我已阅读关于演示模型,但我不是很清楚。你能回答我的问题1和2吗?谢谢。 – Mark 2009-11-06 07:48:00

+0

不,是的。我真的没有看到在这里复制粘贴MSDN的点 – ima 2009-11-06 08:41:03

11

我意识到你的问题已在两年前提出过,但我想在使用MVVM超过一年之后给出我的意见。

-1-我不确定你在问什么,但我想你问的是:绑定MVVM的唯一好处是什么?答案是不。分离关注点,绑定和高效测试是MVVM的主要优势。有许多次要的好处,但我不会进入这些。绑定绝对精彩,因为所有同步都是自动化的,这意味着您的工作量减少。此外,关注点的分离意味着视图模型不依赖于视图的类型,因此您可以使用相同的视图模型拥有多个视图。比方说,您创建一个名为ErrorDataViewModel的视图模型。这个类的目的是保存将显示给用户的ErrorType类的列表。 ErrorType基本显示错误信息。 ErrorDataViewModel也有一个名为AllErrorsFixed的布尔属性,让用户知道列表中的所有错误是否已被修复。 AllErrorsFixed是一个简单的属性,它使用linq来查询ErrorTypes.Fixed属性的列表。如果All是固定的,则AllErrorsFixed将返回true。

在Application1中,您的客户希望以简单的网格状方式显示错误。您所做的只是将网格绑定到该视图模型的错误列表。在Application2中,客户希望以更多的导航格式显示错误,他们可以通过表单查看每个错误表单。然后,您所做的就是将表单控件绑定到列表中的每个错误,并将导航设置为从一个记录移动到另一个记录。但是等等,如果我们想要App1同时使用网格和逐个窗体的导航,我们可以做到这一点。更好的是,现在您希望使用Silverlight实现Web界面来替换Application1/Application2或者作为另一种产品,您不必更改视图模型。工作已经完成。

我提到了ErrorsFixed布尔值,好吧,我们忘了在我们的应用程序中实现它。我所要做的就是进入我的视图,添加一个控件或一个列或一个属性测试器,并将其绑定到布尔属性,并完成。

关于测试,测试可以更高效,因为您可以编写测试代码来验证视图模型中的更改,而不会浪费时间运行应用程序并打开视图。这并不能解决所有测试问题,但它消除了许多耗时的步骤。

-2-对MVVM或MVP有没有什么好处。是。一个海报错误地表示一个视图可以在MVVM中拥有多个虚拟机。实际上,一个虚拟机可以有多个视图,因为它不受视图限制。或者换句话说,多个视图可以使用一个VM。因此,在您调用view.ShowMessage()的示例中,MVVM中不会发生这种情况,因为您无法保证视图(WPF或Silverlight或测试类)具有ShowMessage方法。相反,你发起了一个事件。事实上,Prism对此非常棒,因为它具有事件聚合器,所以当您触发事件时,事件聚合器会处理将事件发送到分配给该事件的视图。因此,每个应用的视图都可以处理该事件的合理性。使用MVP,您必须为每个视图创建一个Presenter。这非常耗时。

-3-您的示例代码是MVP。

+1

他可能意味着一个视图和它的子视图可以有不同的视图模型。从技术上讲,您可以根据用户输入或后端事件交换视图模型。 – 2013-11-11 23:20:38

2

我之前已经回答了一些类似的问题,但你可能对您有用太:

两者的主要特点在Android电子环境中使用。

MVP模式:模型,视图和演示层

  • 于彼;
  • 查看代表用户对Presenter的输入;两层应该有 ,1对1的关系;

  • 查看和模型没有紧密耦合,用于明确区分
    的问题;

  • 视图通过数据绑定直接连接到模型;

  • 简单的单元测试,作为Presenter第一层的接口,可能会很快模拟出 ;

MVVM模式:

包括三个关键部分:

  • 模型(业务规则,数据访问类),

  • 视图(用户界面)

  • ViewModel(作为视图之间的代理和模型);
  • 伟大的解决方案来处理与Windows相关的任务 基金会系统(WPF)和Silverlight应用程序框架;
  • 提供更清晰的UI和应用程序逻辑分离;
  • 单元测试更容易,因为有上查看

功能比较不依赖

让我们放在一起MVP的要领VS MVVM比较。我们也应该强调,我们不是在倡导一种或一种模式。

代码度量: MVP可能会产生更多的类和Java代码。在MVVM中,有更多的Java类,但每类的代码更少。

可维护性: MVP很容易学习,修改,添加功能。使用MVVM添加新功能可能需要库的一些经验。

逻辑:在MVP中,View实际上是您的应用程序,而Presenter处理应用程序流。在MVVM中,代码类(ViewModel)是应用程序,而View则是允许用户与应用程序交互的界面。

数据输入:从MVP开始,而不是主持人。 MVVM中的输入始于View,而不是ViewModel。

映射和参考: MVP中视图和演示者之间的一对一映射,它们之间没有引用。 MVVM中View和ViewModel之间的一对多映射,没有参考。

最后的话

显然,架构模式演变。 MVVM倾向于成为一个非常整洁和令人担忧的工具。同时,MVP模式已经足够灵活,已经从各种图书馆中受益。

还有一点很清楚的是,您不必严格遵守MVP或MVVM。在大多数情况下,我们无法纯粹以单一模式构建应用程序,这很好。主要的事情是将视图,模型和它们之间的逻辑分开。

何时使用MVP以及何时使用MVVM,您可能会问?建议隐藏在数据绑定中。在无法绑定datacontext的情况下,大多数开发人员更喜欢MVP(Windows Forms就是一个很好的例子)。由于接口较少,维护代码较少,所以在可能绑定datacontext的情况下,MVVM是首选。

通过的blog

1

两个MVP和MVVM是MVC的衍生物的材料(见时间表和这些是如何演变)。它们之间的关键区别在于每个图层对其他图层的依赖关系以及它们彼此间的绑定程度。

MVC:框架库

客户端 Backbone.js的,knockback.js,Spine.js,angular.js。

服务器端 ASP.NET MVC,Spring MVC的,的Ruby-on-Rails的

MVP:框架库

客户端 Riot.js,GWT

服务器端 ASP.NET ,JSP Servlets

MVVM:Framework Library

客户端 Knockout.js,剑道(MVVM)

服务器端 WPF(台式机)或Silverlight,Windows Phone的应用程序(XAML),Adobe Flex的

为了回答这些具体问题:是的,除了MVVM中的双向绑定,ViewModel公开了一个Observable,它是绑定双向数据的MVVM的主要优势。