为什么州不能成为MVP中的Presenter的一部分?

Tow*_*wer 8 architecture theory mvp mvvm

我读了http://www.codeproject.com/KB/architecture/MVC_MVP_MVVM_design.aspx,它说:

虽然它们很强大,但MVC和MVP都存在问题.其中之一是View状态的持久性.例如,如果作为域对象的Model对UI没有任何了解,并且View没有实现任何业务逻辑,那么我们将在哪里存储View的元素(如所选项)的状态?Fowler以Presentation Model模式的形式提出了一个解决方案.

我想知道为什么Presenter无法持有View状态?它已经拥有所有View逻辑.

据我所知,在MVC和MVP中,状态保持在View中.在PM和MVVM中,状态保存在Presentation Model中.为什么Presenter在这种特殊情况下不能跟踪PM并包含视图的状态?

这是另一篇文章说Presenter没有View状态,而是视图:http://www.codeproject.com/KB/aspnet/ArchitectureComparison.aspx

Mar*_*ijn 8

当你说视图将视图状态存储在MVP中时,我认为你是完全正确的:它只是MVP中"关注点被分离"的方式.在"干净的MVP"中,视图状态保留在视图中而不是在演示者中.演示者可以使用视图界面提供的方法查询视图的状态.

在演示者中保持状态将使演示者成为演示模型和演示者之间的混合体.务实,如果您发现自己有时在演示者中保留一些视图状态,请不要重建您的完整应用程序.

请注意使用PM或MVP模式的一般动机.

在福勒的eeaDev关于演示模型的网络文章中,他指出:

表示模型是一种从视图中提取表示行为的模式.因此,它是Supervising Controller和Passive View的替代品.它允许您在没有UI的情况下进行测试,支持某种形式的多视图以及关注点的分离,这可能使开发用户界面变得更加容易.

福勒继续说道:

与被动视图和监督控制器相比,演示模型允许您编写完全独立于用于显示的视图的逻辑.您也不需要依赖视图来存储状态.缺点是您需要在表示模型和视图之间使用同步机制.

我不同意你在问题中引用的陈述:

[MVP的问题]之一是View状态的持久性.

这不是问题:这是一个选择.IMO Fowler没有提到这种"视图状态的持久性"作为使用Presentation Model而不是MVP 的动机,无论是监督控制器还是被动视图.

我不太确定Fowler是否具有"存储状态"意味着"跨越应用程序生命周期"的持久性.但无论如何,重点是它是一个权衡的选择:当你使用Presentation Model而不是MVP时,你会得到

  • 视图状态的可测试性更好
  • 关于(存储)视图状态的视图独立性
  • "程序员"可以创建PM,"UI设计者"可以单独处理视图

以......为代价

  • 必须将视图与演示模型同步

请注意,由于现代UI同步技术(如.NET的数据绑定),后者的"费用"现在可能比Fowler撰写(2006年)时更少.