【问题标题】:java / gwt UI coding - clean codejava / gwt UI 编码 - 干净的代码
【发布时间】:2010-02-23 17:11:48
【问题描述】:

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

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

我已经用 Google 搜索过,但没有遇到任何特别好的示例 - 知道我可以阅读任何易于阅读的代码库以了解它应该如何完成吗? (gwt 自己的 tuts 非常基础,只是把所有东西都放在一个文件中)

谢谢!

【问题讨论】:

    标签: java user-interface


    【解决方案1】:

    我不想说一些如此缺乏想象力的话,但 MVC 有效——它不是终极的,但它可以让你开始有条理。

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

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

    实现此目的的一种方法是将 GUI 成员上的大部分或所有控件设为公共成员。这听起来有点蹩脚,但它们的使用被封装在控制器内部,所以它不像你有无法控制的访问——事实上,你的访问比你的所有成员都是私有的但你的视图代码与控制器结合起来更清晰/更好地定义。

    具体技巧:

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

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

    属性表:

    GUI 有一种特殊情况——属性表样式 GUI。我已经做了很多这样的事情,他们很烦人。它们往往有几十或几百个控件,每个 GUI 控件往往与模型中的特定字段相关联,只有数百行复制和粘贴样板代码连接它们,每组复制和粘贴几个项目已更改——每个控件至少需要 3 行代码(创建控件、复制值和复制值)。

    我总是用“智能”控制器编写这些控制器——它可以智能地将控件绑定到某些数据,而无需任何唯一代码。这可能会变得棘手,如果这是您的问题,请在 cmets 中告诉我,我可以就您可能尝试的一些技巧向您提供一些一般性建议。我已经从一个最小的反射解决方案变成了一个完整的基于 XML 的解决方案。如果我再做一次,我可能会考虑基于注释。


    MVC 示例:

    注意,这只是一个例子,有百万种方法来做 MVC。

    在您的主目录中:

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

    在我的视图中

    • 可能会扩展框架
    • 大部分组件都是公共最终的(公共最终按钮 b=new Button())
    • 如果公共成员让您感到紧张,请使用 getter - 与公共最终成员具有相同的 EXACT 效果,但语法稍加一些。
    • 请记住,您可以在构造函数中设置最终成员。
    • 可能有通用方法,如 reset(),但 MyController 可能是一个更好的地方。

    在我的控制器中

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

    在 MyModel 中:

    这将是一个典型的模型类,它将包含您的业务逻辑(大多数情况下不用作 GUI 的一部分,这更像是 MyController 中的 GUI 逻辑。控制器倾向于在您的业务逻辑中设置值然后调用一些方法像 updated() 来控制一些业务逻辑。它不应该知道 GUI——这是你的“纯”业务类。

    有时 GUI 可能会调用 update() 或其他方法来触发某些数据更改,然后从模型中重新加载 GUI 控件——这是在模型不知道的情况下将业务逻辑与 GUI 集成的相当好的方法关于图形用户界面...

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

    请注意,视图和控制器几乎总是配对的。您不能只用 Web 视图替换 Swing 视图并期望控制器保持不受干扰——但模型不应该因视图或控制器而改变。

    【讨论】:

    • 哈哈,我喜欢滴灌 :) 所以你建议我在我的主页/类的开头实例化一个“关键处理程序”类,然后在其中调用处理程序方法?还是我创建一个空的(ish)主类,并在这里实例化三个类?我的头,如你所见,正在转圈?我在哪里可以看到您认为的简单示例?谢谢!
    【解决方案2】:

    您应该先看看 GWT 应用程序的最佳实践:

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

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

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

    【讨论】:

    • 我同意,MVC 不是唯一的模型,事实上,总的来说,我并不喜欢它——它只是帮助您开始组织起来的一种方式。 MVP 是另一种情况——每个实施这两种方法的人都有不同的看法。真正的诀窍是分离功能以提供干净、最小的接口。无论哪种方法最能帮助您,都可以是个人选择。 +1,很好的参考。
    猜你喜欢
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 2010-10-28
    相关资源
    最近更新 更多