GWT小部件与MVP

时间:2012-02-25 23:04:36

标签: gwt

我正在寻找有关GWT架构的指导 - 何时使用自包含小部件与MVP /活动/场所。

背景

阅读了Google文档&扫描Stackoverflow,gwt-examples项目提供了这个问题的最佳说明:http://code.google.com/p/gwt-examples/source/browse/trunk_2012/DemoGwtEditor/src/com/gonevertical/client/?r=3138#client%2Fviews

应用程序分为强解耦视图,每个视图对应一个DOM对等体。活动&地方用于管理逻辑/ RPC&给定视图的导航。虽然不精确,但为简洁起见,我将此模式称为MVP。

小部件不符合此模式,包含视图和逻辑/ RPC调用。

上下文

对于这个问题的上下文,我正在考虑使用TabLayoutPanel创建单独的“屏幕”的复杂GWT应用程序。每个标签/屏幕广泛地涉及用户活动。 Mint.com就是这种界面的一个很好的例子:仪表板选项卡,交易选项卡,预算选项卡,趋势选项卡等。每个选项卡都是由许多子组件构建的:图表使用选择器,报表选择器,事务表等

像交易表这样的子组件可能是几个GWT本地的组合 - 例如一张桌子上有几个按钮。谷歌doco将这种子组件显示为被解组为MVP。

假设 - 小部件与MVP

使用MVP处理子组件意味着:

  • 非常大的视野&每个标签
  • 的活动/演示者类
  • 筑巢MVP&文件爆炸(每个子组件5个)

另一方面,作为小部件的子组件意味着:

  • 非常轻松的MVP结构,只是为了管理导航历史 标签;不值得吗
  • 没有分离(因此难以进行单元测试和切换 视图)

问题

  • 这些假设是否正确?
  • 何时在解耦视图/ MVP上使用自定义复合小部件(反之亦然)?

3 个答案:

答案 0 :(得分:2)

要回答这个问题,首先要看一下活动和地点 - 因为活动通常是主持人的双重职责。活动经理负责处理屏幕的某个区域。例如,选项卡区域可以由活动管理器控制,其中每个活动是不同的选项卡。这表明每个标签都有自己的演示者。演示者只需要了解视图UI部分,它需要将数据加载到/从中加载(如果只编辑数据,则可以将其减少到编辑器驱动程序)以及它需要响应事件的项目。登记/> 演示者不需要知道仅与视图响应有关的视图事件,例如公开面板或被选中的事物。演示者参与的唯一时间是UI发送需要一些业务/模型逻辑的事件 - 例如在列表项上显示更多详细信息,创建新列表项或保存模型。

这有帮助吗?

答案 1 :(得分:2)

自定义小部件和MVP无法比较。它们不是一个问题的答案选项,而是两个不同问题的答案。

问题1:我什么时候应该编写自定义小部件? 问题2:我应该使用MVP(或者我应该使用MVC还是不应该使用任何模式)?

首先回答问题2:

使用MVP

  • 对于一个应用程序,如果代码结构过于基本 - ui,服务器命令,ui事件处理等在同一个地方,你会觉得管理多个屏幕/活动很麻烦
  • 当您知道您将拥有多个用于相同功能的UI时。例如,将在桌面浏览器以及移动浏览器上使用的应用程序。你可以有完全不同的观点"桌面和移动设备的实现
  • 当您希望进行单元测试或测试驱动开发时
  • 如果(您或您的团队)有使用MVC或MVP等框架的经验

使用自定义小部件

  • 如果您没有用于此目的的小部件
  • 当您使用多个小部件来实现某些功能时。例如,如果您需要文本字段,则用户键入该字段并在客户端处理输入,并在标签中显示。现在假设您希望在多个位置使用此功能。编写可重用的代码是明智的。自定义小部件可以做到这一点
  • 当您想要增强已经可用的小部件的功能时。例如,您希望按钮的默认单击处理程序以某种方式处理

答案 2 :(得分:1)

小部件和MVP之间的区别并不像你想象的那么清晰 您可以使用MVP模式很好地实现小部件。

这方面的一个例子是GWT自己的CellWidgetsCellTable这样的CellWidgets在内部使用presenters和视图来将视图与逻辑/状态分离。这使得对它们进行单元测试变得容易。

我认为没有完美的解决方案,它可能还取决于用例/应用程序。 我通常会尽量避免从小部件本身进行后端调用(RPC等)。 我尝试以某种方式设计小部件,他们处理和最终显示的数据由演示者从外部设置。
因此,基本上小部件只是像子组件一样查看,这些子组件由演示者填充和控制并嵌入到视图中。

如果您想拥有更复杂的小部件,这些小部件还包含业务逻辑和后端调用,请尝试将MVP模式应用于小部件。

它还取决于您使用的MVP框架类型。通过活动和地点(确定,严格来说不是MVP框架),您通常没有嵌套的演示者(请参阅Thomas Broyer blog)。 当您使用具有GWTP概念的PresenterWidgets MVP框架并允许嵌套演示者时,这会有所不同。