我很高兴这个问题已经被问,因为GWT desperatley需要构建的应用程序的轨道状的方式。一种基于最佳实践的简单方法,适用于所有使用案例的90%,并且具有超易测试性。
在过去的几年里,我一直在使用自己的MVP实现方式,他的观点非常消极,无论主持人告诉他做什么。
我的解决方案包括以下部分:
- 每插件限定所述的方法来控制视觉外观
- 实现类,可以是一个复合或使用外部部件库的接口
- 一个中央主持人用于承载由M个部件组成的N个视图的屏幕
- 每个屏幕的中央模型,其保存与当前视觉外观关联的数据
- 类似于“SourcesAddEvents [CustomerDTO]”的编辑器(编辑器不喜欢这里的java泛型的真实符号,所以我使用了thoe括号),因为否则的话,您将拥有许多相同的接口,这些接口只是类型不同
视图获取对演示者的引用作为其构造函数参数,因此他们可以使用演示者初始化其事件。演示者将处理这些事件并通知其他小部件/视图,或者在调用成功时将gwt-rpc放入模型中。该模型具有一个典型的“Property [List [String]] names = ....”属性更改侦听器机制,它已向主讲者注册,以便通过gwt-rpc请求更新模型到所有视图/窗口小部件感兴趣。
有了这个Appraoch,我已经用EasyMock为我的AsynInterfaces获得了非常简单的可测试性。我还可以轻松地交换视图/小部件的实现,因为我必须重写的是通知某个事件的发布者的代码 - 无论底层部件(按钮,链接等)如何。
问题,我的方法:
- 我目前的执行使得它很难对不同屏幕的中心模型之间的数据同步值。假设您有一个显示一组类别的屏幕,另一个屏幕允许您添加/编辑这些项目。目前很难将这些更改事件传播到屏幕边界,因为这些值会缓存在这些模型中,并且很难发现我们是否有些东西很脏(在传统的web1.0-html中会很容易-dumb-terminal类型的场景与服务器端声明式缓存)。
- 视图的构造函数参数可以实现超级简单的测试,但是如果没有可靠的Dependency-Injection框架,则会在“onModuleLoad()”中出现一些UGLY工厂/设置代码。当我开始这个时,我不知道谷歌GIN,所以当我重构我的应用程序时,我会用它来摆脱这个样板。一个有趣的例子是GIN-Trunk中的“HigherLower”游戏。
- 我没有第一次获得历史记录,所以很难从我的应用程序的一部分导航到另一部分。我的方法并不了解历史,这是一个严重的衰退。
我对这些问题的解决方案:
- 使用GIN删除设置样板,是很难维持
- 虽然从GWT-Ext的移动GXT,使用它的MVC框架作为EventBus到连接/分离模块化屏幕,以避免缓存/同步问题考虑某种类型的“放置” - 像Ray Ryan在I/O 09的演讲中描述的那样,它在GXT-MVC和GWTs-Hitory方法
- 使用MVP的小工具隔离数据访问
摘要:
我不认为可以使用一个单一的“MVP”的方式为整个应用程序。一个明确需要应用程序导航的历史记录,像GXT-MVC这样的事件总线来连接/分离屏幕,以及MVP,以便轻松测试小部件的数据访问。
因此,我提出了一个分层的方法,结合了这三个要素,因为我相信“one-event-mvp-system”-solution不会起作用。导航/屏幕附加/数据访问是三个独立的问题,我将在接下来的几个月里重构我的应用程序(转移到GXT),以分别利用所有三个事件框架(最佳工具)。所有这三个元素都不需要意识到对方。我知道我的解决方案只适用于GXT项目。在编写大型GWT应用程序时,我觉得我不得不在客户端重新创建类似Spring-MVC的东西,这真的很糟糕,因为花费大量时间和大脑力量去吐出像Spring MVC这样优雅的东西。 GWT需要一个应用程序框架,远远超过编译器人员如此努力工作的微小JS优化。
但这些小小的JS-优化是什么使GWT如此之快 - 这是更复杂的框架基础平台,如果正常进行,可以提供抽象的所有优点,而不会产生很多深功能承滴盘的成本/发送(GWT将优化/内联它们)。 – Chii 2009-08-06 10:54:02
特别是在2.0中的代码分割时,GWT对于平均开发人员IMO来说足够快。不要误会我的意思,我不想忽视这些优化的重要性。但是开发人员面临现实世界的问题,并且会从传统的做事方式 - 应用程序框架 - 中获益更多。 – Sakuraba 2009-08-06 14:33:09
Sakuraba - 我同意你的看法,GWT需要某种约定优先配置机制来组织代码。我不在乎它是否被称为MVC或MVP,我只是想要一些简单易用的东西。 我已经使用了GXT MVC [1],它的工作原理是白色,当你实现历史记录时,它可能会令人困惑。对我而言,历史是GWT应用程序最重要的方面之一,我发现它很容易早期实现,而不是事后实施。 我倾向于MVP b/c谷歌推荐它(见JP的回答如下)。 [1] http://raibledesigns.com/rd/entry/gxt_s_mvc_framework – 2009-08-07 13:03:01