当前位置: 首页 > 面试题库 >

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

松嘉运
2023-03-14
问题内容

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

例如-
如何分隔密钥处理程序,因为它们触发了UI的许多更改,我如何才能将其移到单独的.class文件中,并且仍然能够访问主类中的所有各种小部件,而不必将所有内容传递给处理程序(即,我在click事件之后处理的所有小部件)。

我已经在Google上搜索过,但是没有遇到任何特别好的例子-
知道我可以阅读的任何易读的代码库,看看应该如何做?(gwt自己的tut非常简单,只需将所有内容整理到一个文件中)

谢谢!


问题答案:

我讨厌说些没什么想像力的东西,但是MVC可以工作-它不是最终的工具,但是它可以使您有条理。

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

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

实现此目的的一种方法是将GUI上的大多数或所有控件公开。这听起来有些la脚,但是它们的用法封装在控制器内部,所以这并不是您具有不可控制的访问权限-
实际上,与所有成员都是私有的相比,访问权限的定义更清晰/定义更好,但是您的视图代码与控制器结合在一起。

具体技巧:

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

我很久以前学过的一个非常古老的GUI技巧,不要让各种微型处理程序以不同的方式修改GUI,而是让所有“活动”按钮和控件在GUI中设置状态,然后调用一个方法来将该状态应用于GUI上的所有控件。当您超越普通的GUI时,这可能会节省生命。如果不清楚,请发表评论,并为您提供示例。

属性表:

GUI有一个特例-
属性表样式GUI。我已经做了很多这些,它们使人为地狱而烦恼。它们往往具有数十或数百个控件,每个GUI控件往往都绑定到模型中的特定字段,并且只有几百行复制和粘贴样板代码连接它们,每组都复制并粘贴了几行项目已更改-
每个控件至少需要3行代码(创建控件,复制值输入和复制值输出)。

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

MVC的示例:

注意,这只是一个示例,有数百万种方法可以执行MVC。

在您的MAIN中:

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

在我看来

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

在MyController中

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

在MyModel中:

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

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

而且,正如我上面所说的,如果我使用属性表,我会在MyController中投入更多的工作,这是因为如果您不聪明,那么最终会得到大量的样板行。

请注意,View和Controller几乎总是配对。您不能只用Web视图替换Swing视图并期望控制器保持不受干扰-
但是对于视图或控制器,模型永远都不应更改。



 类似资料:
  • 比如 其实相当于 代码不需要手动处理就可以执行。

  • 我在macOS上多个文件夹中的多个项目中工作。我通常通过运行以下命令开始处理它们: 这总是会打开一个新窗口,显示我在该项目中工作的最后一个文件。我的下一步是关闭所有标签页,如果编辑器被拆分,我必须像拆分编辑器那样做很多次。 有没有一个设置可以让我总是从一个干净的状态开始? 我认为与此问题相关的设置如下: 我尝试,但行为保持不变。 另外,如果可能,此信息存储在哪里(打开给定文件夹的文件)?这是文件夹

  • 我有以下课程: 这只是其中一个例子,我有一些类似的其他类,我将它们作为依赖注入到其他类中。但是它使我的SchemaFetcher类像一个单例,我不断地向它的每一个方法传递模式定义。这似乎是非常程序化的,我想实际上使模式定义成为数据库模式获取类的实例变量,但在这种情况下,我将无法将模式获取对象注入到我的验证器类中,相反,我应该这样做 但这使我与fetcher紧密耦合,这就是为什么我想首先使用依赖注入

  • 这里有一点背景: 我运行 Win7 我有私有的git存储库并安装了适用于Windows的Github 我不喜欢 适用于 Windows 的 Github 客户端(缺乏功能)。我安装了Git用于Windows(仍然保留Github的Windows) 我在这里的步骤完全 http://dancingmonkeysaccelerated.blogspot.com/2012/03/git-for-wind

  • 问题内容: 一个(很久以前),我写了一个网络蜘蛛,我对该线程进行了多线程处理,以使并发请求能够同时发生。那是我的Python青年时代,在我了解GIL及其为多线程代码造成的相关麻烦之前(IE,大多数时候,这些东西最终都被序列化了!)… 我想对这段代码进行重做,以使其更健壮并性能更好。基本上有两种方法可以执行此操作:我可以使用2.6+中的新多处理模块,也可以使用某种基于反应堆/事件的模型。我宁愿以后再

  • 如果我使用Intellij和Micronaut与lombok和Micronaut数据注释处理器,是否需要进行干净的编译?爪哇14。 对我来说,任何代码更改在下一个应用程序运行时都是不可见的,如果没有干净的编译或者没有?