【发布时间】:2013-01-17 09:59:42
【问题描述】:
我一直在看这个教程 https://developers.google.com/web-toolkit/articles/mvp-architecture 我想知道的是,对于这种 MVP 风格,每次用户更改页面并创建一个新的 Presenter 实例时效率如何。如果主持人是单身人士会更好吗?我的最终目标是使用 PhoneGap 部署应用程序,这样任何性能提升都会很有用。
【问题讨论】:
我一直在看这个教程 https://developers.google.com/web-toolkit/articles/mvp-architecture 我想知道的是,对于这种 MVP 风格,每次用户更改页面并创建一个新的 Presenter 实例时效率如何。如果主持人是单身人士会更好吗?我的最终目标是使用 PhoneGap 部署应用程序,这样任何性能提升都会很有用。
【问题讨论】:
这完全取决于您的实施。
如果您希望将状态保存在您的视图中,您可以使用单例演示者/视图。
效率更高,因为您不需要重新初始化视图,但如果另一个视图上的某些事务进行了需要更改第一个视图的更改,则效率会降低。在这种情况下,您需要在第二个演示者中引发一个事件,该事件被第一个演示者捕获并相应地修改视图。这使得应用程序的可预测性降低了一些。
因此,如果每个演示者/视图都是独立的,则可以使用单个视图/演示者。
在任何其他情况下,我都会使用新的演示者/视图来重新初始化视图使用的表单中的数据。
请记住,虽然每个使用应用程序范围变量(例如事件总线)的新演示者都不会被破坏(垃圾收集),这会导致以下问题:
每当您加载视图并引发在相应演示者中捕获的事件时,该事件和所有计算都会发生与生成新演示者/视图一样多的次数。
示例: -Presenter1/View1 已加载并捕获一些事件 -Presenter2/View2 已加载 -Presenter1(新实例)/View1(新实例)已加载并捕获一些事件。 - 事件通过全局事件总线引发 -Presenter1 捕捉事件 -Presenter1(新实例) 捕获事件
因此,本质上(这不是规则),新的演示者为 GWT 应用程序提供了一个具有完整回发感觉的网页,而在另一种情况下,您拥有加载现有表单的桌面应用程序感觉。
希望这会有所帮助。
【讨论】:
不要使用单例...糟糕!
如果您懒惰地初始化演示者并保存它们的引用以供重复使用,则不必每次都创建一个新实例。
看一下我从https://developers.google.com/web-toolkit/articles/mvp-architecture-2#code_splitting 中提取和修改的以下示例,以突出显示如何重用演示者,类似于重用视图的方式。
public void onValueChange(ValueChangeEvent<String> event) {
String token = event.getValue();
if (token != null) {
if (token.equals("list")) {
GWT.runAsync(new RunAsyncCallback() {
...
public void onSuccess() {
// lazily initialize our views and presenters, and keep them around to be reused
if (contactsView == null) {
contactsView = new ContactsViewImpl<ContactDetails>();
}
if (contactsPresenter == null) {
contactsPresenter = new ContactsPresenter(rpcService, eventBus, contactsView);
}
contactsPresenter.go(container);
}
});
}
...
}
除了通过 RunAsyncCallback 进行代码拆分的性能优势之外,本质上,您可以将每个 Presenter 引用为 AppController 类字段,并在切换历史令牌时重用它们。
【讨论】:
我建议您使用gwt-platform。我在几个项目中使用它并且从未遇到任何性能问题。它非常强大,可以帮助您构建应用程序,以便在将来更轻松地扩展它,同时保持良好的性能。
【讨论】: