MVP与MVVM - 为什么?

Mar*_*ark 13 mvp design-patterns mvvm

当我使用WinForm时,我正在使用MVP.但是当我开始使用WPF或Silverlight时,我转向了MVVM.

我注意到的唯一事情是,由于强大的绑定,我们不需要在MVVM模式中同步View和ViewModel之间的数据.

我的问题是:

1)绑定(这有助于我们不手动同步View和ViewModel)使用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");

}
Run Code Online (Sandbox Code Playgroud)

小智 14

我意识到你的问题已在两年前提出过,但我想在使用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.实际上,一个VM可以有多个视图,因为它不依赖于视图.或者换句话说,多个视图可以使用一个VM.因此,在您调用view.ShowMessage()的示例中,这不会发生在MVVM中,因为您无法保证视图(WPF或Silverlight或测试类)具有ShowMessage方法.相反,你发射一个事件.实际上,Prism很棒,因为它有事件聚合器,因此当您触发事件时,事件聚合器会处理将事件发送到分配给事件的View.因此,每个应用程序的视图都可以处理它认为合适的事件.使用MVP,您必须为每个视图创建一个Presenter.这非常耗时.

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


小智 7

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

MVP模式:

  • 由 Model、View 和 Presenter 层组成;
  • 视图将用户输入委托给 Presenter;两层都应该有 1 对 1 的关系;

  • View 和 Model 没有紧密耦合以明确分离
    关注点;

  • View直接通过数据绑定连接到Model;

  • 简单的单元测试,作为Presenter第一层的接口可以快速模拟;

MVVM 模式:

包括三个关键部分:

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

  • 查看(用户界面),

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

功能对比

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

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

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

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

数据输入:从MVP中的View开始,而不是Presenter。MVVM 中的输入以 View 开始,而不是 ViewModel。

映射和引用: MVP中View和Presenter一对一映射,之间没有引用。MVVM中View与ViewModel的一对多映射,无参考。

最后的话

显然,架构模式在不断发展。MVVM 有成为一种非常简洁和令人担忧的工具的趋势。同时,MVP 模式足够灵活,已经受益于各种库。

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

你可能会问什么时候用MVP,什么时候用MVVM?建议隐藏在数据绑定中。在无法绑定数据上下文的情况下,大多数开发人员更喜欢 MVP(Windows 窗体就是一个很好的例子)。在可以使用数据上下文绑定的情况下,MVVM 是首选,因为接口较少,需要维护的代码也较少。

通过博客的材料。


ima*_*ima 5

示例是MVP,由此行明确定义:

view.showMessage("This is a msg");
Run Code Online (Sandbox Code Playgroud)

虽然MVP和MVVM产生的代码在普通示例中可能看起来相似,但这些模式明显不同.如果你怀疑MVVM只是微软的MVP名称,那就不是了.

它是微软的名称PM(演示模型)模式 - 您可能想要阅读其描述.