整个GWT MVP与Activity和Places的混淆

21

阅读了一段时间并观看了 Google IO 视频后,我仍然不清楚 MVP 与 Activity 和 Places 之间的关系。

我找到了一篇较早前发布的帖子 --> GWT 2.2 MVP vs. GWT 2.1 Activities-Places

"MVP 架构。MVP 是一个概念,而其中一种方法是使用 places-activities 框架"

我也听说 "Presenter 类似于 Activity"

我们可以使用 "Activity 和 Places" 而没有 MVP

我们可以将 "Activity 和 Places" 与 MVP 混合使用

"MVP 只是我们如何组织项目,以便我们可以轻松地测试和组织代码"

然后,我正在尝试弄清楚这样的东西 --> http://code.google.com/p/gwt-platform/

我感到非常困惑。我希望有一个能够结束所有困惑的一站式帖子。

4个回答

21

简而言之:Places和Activities与MVP无关。

Places是关于在应用程序中导航:您从一个地方到另一个地方。而Activities建立在Places之上,帮助将“您看到的内容”与“您所在的位置”绑定在一起:

  • 当我在SO的主页上时,主要部分显示所有主题的问题列表,右侧顶部显示我的喜欢标签并帮助我设置标签过滤器,然后下面是广告,下面是最近标签的列表,然后是最近徽章的列表。
  • 在这个问题页面上,主要部分显示问题及其答案,右侧顶部替换了有关问题标记的信息,然后是广告、相关问题和链接问题。

每个“部分”(区域)都由监听PlaceChangeEvent并询问其关联的ActivityMapper应该在该区域显示哪个ActivityActivityManager管理。

这一切都是关于导航的。

与MVP没有关系(尽管官方文档如此说)。但如果您使用MVP,则可能会使您的活动成为“presenter”,控制一个“view”(活动将将其传回到其start方法中接收的AcceptsOneWidget参数)。这不是一条规则,例如,Google在mobilewebapp样本中正在进行experimenting活动和主持人的解耦。


“如果你使用MVP”,这句话的确切意思是什么?我的意思是,如果我自己将模型-视图-表示器分离出来,并使用自己的实现使它们相互交互到一个接口上? - Nitish Upreti
如果活动是Presenter,它们之间不就有关系了吗?:| - Nitish Upreti
1
关于“如果您使用MVP”:MVP是一种模式,所以我的意思是“将演示逻辑放入活动中(即使其成为一个Presenter),并将视图放在另一个类中”。关于您的第二条评论,如果我说“视图通常会是Composite”,这是否与MVP有关?也许更清楚的是,如果我说MVP和活动是正交的问题(一个是编码模式,另一个是关于应用内导航的工具/微框架)。 - Thomas Broyer
MVP架构与Activities和Places之间存在关联!Activities旨在成为Presenter。Google文档:严格来说,MVP架构并不涉及浏览器历史记录管理,但是可以像本文所示那样将Activities和Places与MVP开发一起使用。在以下文章中https://developers.google.com/web-toolkit/doc/latest/DevGuideMvpActivitiesAndPlacesactivities实现Presenter接口... - Ronan Quillevere
活动在担任演示者方面发挥得非常好,但它们并不是作为演示者而设计的。您对 https://code.google.com/p/google-web-toolkit/source/detail?r=10185 有什么看法? - Thomas Broyer

9
MVP 代表 Model, View, Presenter,是一种编程模式。它只是从MVCModel, View, Controller)模式进化而来。参见 MVC wikipedia page
MVP 和 MVC 的区别在于,在 MVP 中,模型和视图互不了解。在 MVP 中,你的视图应尽可能简单。所有交互都由 Presenter 处理。这只是一种适当组织代码的方式。
有些人创建了框架,以减少组织代码的工作量。可以查看不同的 MVP 实现。这很容易在网上找到。
MVP 使您的代码更容易测试,因为您可以轻松地将视图替换为另一个实现(通常是 Mock),该实现会伪造视图的行为。因此,您无需在浏览器环境下运行测试(GWT 视图是 HTML 视图)。因此,您的测试速度会更快。
Google 文档说:

活动和场所框架允许您在应用程序中创建可书签的URL。

因此,活动和场所不仅仅是一个MVP框架。尽管一个活动是一个Presenter

public interface Activity {

  String mayStop();

  void onCancel();

  void onStop();

  void start(AcceptsOneWidget panel, EventBus eventBus);
}

你可以使用Activity接口作为你的Presenter,而不必使用Google的Places和其他对象。但在这种情况下,你可能需要编写自己的Activity Manager来负责启动和停止你的活动。在开始和停止时,你可能想创建你的视图,将其添加到DOM中,注册你的事件处理程序等。当你停止时,你会想要销毁所有这些。
在一些其他的MVP实现中,你可以找到具有相同作用的bind()和unbind()方法。
来自Google的Activity Place实现的强大之处在于Place对象背后的所有对象,它们将使你的活动开始或停止,并处理历史记录。
如其他人所述,Place只是你URL的表示。
Google的Activity Place实现涉及许多对象。下面是一个模式,以帮助你理解。你会发现,活动只是整个事情中的一小部分。你可以在我的博客文章中找到更多细节

enter image description here


7

活动是Presenter。地点只是历史令牌的包装。

混淆始于Google IO视频,其中介绍了MVP GWT概念,但没有给出实现。因此,人们开始自己滚动。然后,谷歌编写了2.1文档,在其中详细说明了该概念,并仅提供了一些示例代码进行下载。稍后在2.2中,他们介绍了他们的完整实现,包括活动等。

因此,如果您想走MVP路线,您需要选择您的实现。活动可能是最好的选择,因为它是官方的。


0

有两个独立的维度

设计模式 - 没有模式 - MVP

导航和屏幕遍历 - 没有导航 - 活动和位置

您可能拥有一个可以遵循以下任一应用程序

  • 没有MVP,没有活动和位置
  • 仅MVP
  • 仅活动和位置
  • MVP与活动和位置

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接