java/gwt UI编码-干净代码

java/gwt UI编码-干净代码,java,user-interface,Java,User Interface,我已经开始使用gwt编写一些基本的java代码,我有点担心我的主类的重要性 例如,如何划分键处理程序,因为它们触发了对UI的大量更改,我如何将其移动到一个单独的.class文件中,并且仍然能够访问主类中的所有不同小部件,而不必将所有内容传递给处理程序(即,单击事件后我操作的所有小部件) 我在谷歌上搜索过,但没有遇到任何特别好的例子——知道有没有任何易读的代码库可以让我看看应该怎么做?(gwt自己的图坦卡蒙非常基础,只是把所有东西都放在一个文件中) 谢谢 我不想说这么缺乏想象力的话,但MVC是可行

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

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

我在谷歌上搜索过,但没有遇到任何特别好的例子——知道有没有任何易读的代码库可以让我看看应该怎么做?(gwt自己的图坦卡蒙非常基础,只是把所有东西都放在一个文件中)


谢谢

我不想说这么缺乏想象力的话,但MVC是可行的——它不是终极的,但它可以让你开始有条理

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

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

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

具体技巧:

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

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

属性页:

GUI有一个特例——属性表样式的GUI。我做过很多这样的事情,它们让人非常恼火。它们往往有几十个或数百个控件,每个GUI控件往往绑定到模型中的特定字段,只有数百行复制和粘贴样板代码将它们连接起来,每个组复制和粘贴时都会更改一些项目——每个控件至少有3行代码(创建控件、复制值输入和复制值输出)

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


MVC示例:

注意,这只是一个例子,有一百万种方法可以实现MVC

主要是:

  • 实例化MyView
  • 实例化MyModel
  • 实例化MyController(myView、myModel)
  • myView.setVisible(true)
在我看来

  • 可能会扩展框架
  • 大多数组件都是公共最终按钮(公共最终按钮b=新按钮()
  • 如果公共成员让您感到紧张,请使用getter——与公共最终成员的效果完全相同,只需使用一点额外的语法
  • 请记住,您可以在构造函数中设置最终成员
  • 可能有诸如reset()之类的常规方法,但MyController可能是更好的选择
在MyController中

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

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

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

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


请注意,视图和控制器几乎总是成对的。您不能仅将Swing视图替换为web视图,并期望控制器保持不受干扰——但视图或控制器的模型永远不应更改。

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

他们谈论的一个概念是MVP(而不是MVC)来构造应用程序