Design patterns MVP vs MVVM——为什么?

Design patterns MVP vs MVVM——为什么?,design-patterns,mvvm,mvp,Design Patterns,Mvvm,Mvp,当我使用WinForm时,我正在使用MVP。但当我开始使用WPF或Silverlight时,我转向了MVVM 我注意到的唯一一点是,由于强大的绑定,我们不需要在MVVM模式中与View和ViewModel之间的数据同步 我的问题是: 1) 绑定(帮助我们不手动同步视图和视图模型)是使用MVVM的唯一优势吗 2) MVVM比MVP还有其他优势吗?有什么区别 3) 下面的代码是MVVP模式还是MVVM模式,或者两者都是 interface IView { void ShowMessage(st

当我使用WinForm时,我正在使用MVP。但当我开始使用WPF或Silverlight时,我转向了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");

}

MVP就是一个例子,这一行清楚地定义了MVP:

view.showMessage("This is a msg");
虽然MVP和MVVM产生的代码在普通示例中看起来很相似,但这些模式却有很大的不同。如果你怀疑MVVM只是微软MVP的名字,那就不是了


这是一个不太为人所知的PM(演示模型)模式的微软名称-您可能想阅读它的描述。

我知道您的问题两年前就被问到了,但我想在与MVVM合作一年多后给出我的意见

-1-我不知道你在问什么,但我想你在问:绑定是MVVM的唯一优势吗?答案是否定的。关注点分离、绑定和高效测试是MVVM的主要好处。有很多小的好处,但我不想谈这些。绑定是绝对美妙的,因为所有同步都是自动化的,这意味着对您来说工作量更少。此外,关注点分离意味着视图模型不依赖于视图类型,因此可以使用同一视图模型拥有多个视图。例如,假设您创建了一个名为ErrorDataViewModel的视图模型。此类的目的是保存将向用户显示的ErrorType类的列表。ErrorType基本上显示错误信息。ErrorDataViewModel还有一个名为AllErrorsFixed的布尔属性,它让用户知道列表中的所有错误是否都已修复。AllErrorsFixed是一个简单的属性,它使用linq查询ErrorTypes列表。Fixed属性。如果全部修复,AllErrorsFixed将返回true

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

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

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

-2-MVVM或MVP有什么优势吗。对一张海报说MVVM中一个视图可以有多个VM是不正确的。实际上,一个VM可以有多个视图,因为它不绑定到一个视图。换句话说,多个视图可以利用一个VM。因此,在调用view.ShowMessage()的示例中,这不会发生在MVVM中,因为您不能保证视图(WPF或Silverlight或测试类)具有ShowMessage方法。相反,你触发了一个事件。事实上,Prism在这方面非常棒,因为它有事件聚合器,所以当您触发事件时,事件聚合器将处理将事件发送到分配给该事件的视图。因此,每个应用程序的视图都可以处理它认为合适的事件。使用MVP,您必须为每个视图创建一个演示者。这非常耗时


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

它们的主要功能都用于Android环境

MVP模式:

  • 由模型层、视图层和演示者层组成
  • 查看演示者的用户输入;这两个层都应该有 一对一的关系

  • 视图和模型没有紧密耦合以清晰地分离
    关注

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

  • 简单的单元测试,作为演示者第一层的接口 快速嘲笑

MVVM模式:

包括三个关键部分:

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

  • 视图(用户界面)

  • ViewModel(作为视图和模型之间的代理)
  • 处理与Windows演示文稿相关任务的绝佳解决方案 基础系统(WPF)和Silverlight应用框架;李>
  • 提供更清晰的UI和应用程序逻辑分离
  • 单元测试更容易,因为它不依赖于视图
功能比较

让我们把MVP和MVVM的要点放在一起进行比较。我们还应该强调,我们不是在提倡一种或一种模式

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

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

逻辑:在MVP中,视图实际上是您的应用程序,而Presenter处理应用程序流。在MVVM代码类(ViewMo)中