Architecture 为什么州不能成为MVP中演示者的一部分?

Architecture 为什么州不能成为MVP中演示者的一部分?,architecture,mvvm,theory,mvp,Architecture,Mvvm,Theory,Mvp,我读到它说: MVC和 MVP也有他们的问题。其中一个 是视图状态的持久性。 例如,如果模型 域对象,不知道任何事情 关于UI,而视图没有 实现任何业务逻辑,然后 我们将在哪里存储数据状态 视图的元素,例如选定的 项目?福勒想出了一个解决办法 以表示模型的形式 模式 我想知道为什么演示者不能保持视图状态?它已经包含了所有视图逻辑 据我所知,在MVC和MVP中,状态一直处于视图中。在PM和MVVM中,状态保持在表示模型中。为什么演示者不能在这种情况下跟随PM并包含视图的状态 这里还有一篇文章说Pr

我读到它说:

MVC和 MVP也有他们的问题。其中一个 是视图状态的持久性。 例如,如果模型 域对象,不知道任何事情 关于UI,而视图没有 实现任何业务逻辑,然后 我们将在哪里存储数据状态 视图的元素,例如选定的 项目?福勒想出了一个解决办法 以表示模型的形式 模式

我想知道为什么演示者不能保持视图状态?它已经包含了所有视图逻辑

据我所知,在MVC和MVP中,状态一直处于视图中。在PM和MVVM中,状态保持在表示模型中。为什么演示者不能在这种情况下跟随PM并包含视图的状态


这里还有一篇文章说Presenter不持有视图状态,而持有视图状态:

我认为你说视图在MVP中存储视图状态是完全正确的:这只是MVP中“关注点被分离”的方式。在“clean MVP”视图中,视图状态保留在视图中,而不是在演示者中。演示者可以使用视图界面提供的方法查询视图的状态

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

只需了解使用PM或MVP模式的一般动机

在福勒的书中,他说:

表示模型是一种 从中提取表示行为 看法因此,这是一个替代方案 对控制器和无源器件进行监控 看法这对允许你 没有UI的测试,支持一些 多视图和分离的形式 这些问题可能会让事情变得更容易 开发用户界面

福勒继续说:

与被动的观点和观点相比 监督控制员、陈述 模型允许您编写 完全独立于视图 用于显示。您也不需要依赖视图来存储状态。 缺点是你需要一个 系统之间的同步机制 表示模型和视图


我不同意你在问题中引用的说法:

MVP的问题之一是视图状态的持久性

这不是问题:这是一种选择。IMO Fowler没有提到这种“视图状态的持久性”作为使用表示模型而不是MVP的动机,不管是什么

我不太确定Fowler的“tostorestate”是否意味着“跨应用程序生命周期”意义上的持久性。但不管怎样,关键是这是一个权衡的选择:当您使用演示模型而不是MVP时,您将得到

  • 视图状态更好的可测试性
  • 视图相对于(存储)视图状态的独立性
  • “程序员”可以创建PM,“UI设计器”可以分别在视图上工作
以牺牲

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

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

它打破了这种模式。WPF的力量是通过s。其中视图“查看”数据类型并“膨胀”到其定义的数据模板。MVP还允许“视图优先”的方法;这样可以更容易地从定义的ViewModel更改视图。示例:如果您的ViewModel公开了IList客户,您可以轻松地更改视图,而不是更改视图和控制器(MVC)。我不同意不应“存储视图元素(如选定项)的状态”的说法许多属性可以是模型的一部分,有助于保存视图状态,例如“IsSelected”属性,而不会破坏模式。在您提到的摘要中,作者指出:“MVP将更多工作委托给视图并删除控制器。它引入了封装视图状态和命令的Presenter类。“因此,文章中似乎存在矛盾。@Marijn是的,我两天前才注意到。我不知道该怎么想。你认为状态应该在Presenter中吗?在clean MVP中,你不认为;我更新了我的答案,试图更清楚地反映这一点。