java / gwt UI编码 – 干净的代码

我已经开始使用gwt进行一些基本的java编码了,我对主要课程的重要性有点担心。

例如 – 如何划分键处理程序,因为它们会触发对UI的一些更改,如何将其移动到单独的.class文件中,并且仍然能够访问主类中的所有各种小部件,而不必将所有内容传递给处理程序(即我在click事件后操作的所有小部件)。

我用谷歌搜索,但没有遇到任何特别好的例子 – 知道任何容易清晰的代码库,我可以阅读,看看它应该怎么做? (gwt自己的tuts是非常基本的,只是把厨房 – 每个东西都放到一个文件中)

谢谢!

我讨厌说一些如此缺乏想象力的东西,但MVC的作用 – 它不是终极的,但它可以让你开始有条不紊。

编辑:在搜索一个半相关的主题时,我遇到了与我有类似想法但是更详细的内容。

就GWT而言,这意味着您应该考虑在一个类中布置GUI组件,将所有事件处理放在一秒中,并将对象模型对象与其他两个分开。

实现此目的的一种方法是在GUI公共成员上创建大部分或全部控件。 这听起来有些蹩脚,但是它们的用法被封装在控制器中,所以它不像你有无法控制的访问权限 – 实际上你的访问权限比你所有的成员都是私有的但是你的视图代码与控制器结合在一起更清晰/更好地定义。

具体技巧:

让听众成为他们自己的class级。 您经常可以重复使用它们 – 换句话说,避免使用匿名内部类。 我有时创建一个监听器类,并为每个按钮/控件实例化一个新实例,按下时需要具有类似的效果。 如果我需要它对给定按钮的行为略有不同,我会将一些东西传递给“特殊”处理程序的构造函数,以便他们知道行为有点不同。 如果需要,您还可以创建不同的处理程序子类 – 我只是说不要忘记事件处理程序是类,如果需要,您可以使用inheritance和所有内容。

一个非常古老的GUI技巧很久以前我学会了,尽量不要让各种迷你处理程序以不同的方式修改GUI,而是让所有“活动”按钮和控件在GUI中设置一个状态,然后调用一个单一的方法将该状态应用于GUI上的所有控件。 当你超越一个简单的GUI时,这可以节省生命。 如果我不清楚,请留言,我会为你留下一个例子。

物业单:

GUI有一个特例 – 属性表样式GUI。 我已经做了很多这些,他们像HELL一样恼人。 它们往往有数十个或数百个控件,每个GUI控件往往与模型中的特定字段绑定,只有数百行复制和粘贴样板代码连接它们,每组复制并粘贴一些项目已更改 – 至少每个控件有3行代码(创建控件,复制值和复制值)。

我总是使用“智能”控制器编写这些控制器 – 可以智能地将控件绑定到某些数据而无需任何唯一代码。 这可能会变得棘手,如果这是你的问题,请在评论中告诉我,我可以给你一些关于你可能尝试的一些技巧的一般建议。 我已经从最小化的reflection解决方案转变为基于XML的全面解决方案。 如果我再次这样做,我可能会考虑基于注释。


MVC示例:

注意,这只是一个例子,有一种方法可以做MVC。

在你的主要:

  • 实例化MyView
  • 实例化MyModel
  • 实例化MyController(myView,myModel)
  • myView.setVisible(真)

在我看来

  • 可能会扩展Frame
  • 大多数组件都是公共最终的(公共最终Button b = new Button())
  • 如果公共成员让您感到紧张,请使用getter – 与公共最终成员相同的EXACT效果,并使用一些额外的语法。
  • 请记住,您可以在构造函数中设置最终成员。
  • 可能有一般方法,如reset(),但MyController可能是一个更好的地方。

在MyController中

  • 保存对myView和myModel的引用
  • 在必要时向myView添加监听器(请参阅上面有关监听器的建议)
  • 根据myModel的状态配置myView
  • 按下“完成”按钮时,将状态从myView复制到myModel
  • 通知myModel它的数据已被更新并自行销毁。

在MyModel中:

这将是一个典型的模型类,它将包含您的业务逻辑(大部分不用作GUI的一部分,更像是MyController中的GUI逻辑。控制器倾向于在业务逻辑中设置值然后调用某些方法,如更新( )使一些业务逻辑得到控制。它不应该知道GUI – 这是你的“纯粹”业务类。

有时GUI可能会调用update()或其他方法来触发某些数据更改,然后从模型中重新加载GUI控件 – 这是将业务逻辑与GUI集成的一种相当好的方法,而无需模型了解GUI …

另外,正如我上面所说的,如果我正在使用属性表,我会把更多的工作放到MyController中,因为如果你不聪明的话,你最终会遇到大量的样板文件。

请注意,View和Controller几乎总是配对。 您不能仅仅使用Web视图替换Swing视图并期望控制器保持不受干扰 – 但模型不应该更改为视图或控制器。

您应首先了解GWT应用程序的最佳实践:

http://code.google.com/events/io/2009/sessions/GoogleWebToolkitBestPractices.html

他们谈论的一个概念是MVP(而不是MVC)构建应用程序的概念。 您可以查看Google Code上的示例项目,以了解如何以这种方式构建GWT应用程序:

http://code.google.com/p/gwt-mvp/