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 是首选,因为接口较少,需要维护的代码也较少。
通过博客的材料。
示例是MVP,由此行明确定义:
view.showMessage("This is a msg");
Run Code Online (Sandbox Code Playgroud)
虽然MVP和MVVM产生的代码在普通示例中可能看起来相似,但这些模式明显不同.如果你怀疑MVVM只是微软的MVP名称,那就不是了.
它是微软的名称PM(演示模型)模式 - 您可能想要阅读其描述.