【问题标题】:An own class for everything [closed]一个自己的类的一切[关闭]
【发布时间】:2012-04-06 20:27:37
【问题描述】:

我正在制作客户管理软件。有几个 JPanel 上面有很多内容,不断与数据库通信。数据库中是客户数据、产品等。
为了更快地访问数据库数据,首先我将它们全部加载到它自己的 ArrayList 中,例如ArrayList<Customer>。如果用户更改此数据,则必须在类和数据库中都进行更改。
由于 JPanel View 看起来非常“完整”(挤满了其他 JPanel 和 JTabbedPanes,使用 CardLayout 切换),我认为最好为每个“主要” JPanel 创建一个自己的类并将它们全部与 @987654323 链接@.
例如 JPanel Customer 的一个自己的类,可以查看和编辑所有客户数据,产品等也是如此。

有意义还是不方便?我只想这样做是为了外包代码并使类更清晰,尤其是View
有没有类似设计模式的东西来处理这个问题?

【问题讨论】:

  • 您在寻找 ORM(对象关系映射)吗?
  • 方便或不方便,做起来就很容易知道了。然后您可以比较在两组代码中查找或更改内容的难易程度。我有根据的猜测是,您会发现分解后的代码更容易阅读和维护。

标签: java swing oop class


【解决方案1】:

所以您的程序由一个单独的类组成,该类是 JPanel 的子类,并且包含对您 UI 中使用的所有其他组件的引用?而且您想知道是否应该将该 UI 的某些部分分解为其他类。

简而言之,是的。您总是可以通过将部分代码移出到新类中来将任何类分解为聚合类,并使原始类包含对新类的引用。这称为委托或提取类重构。您可以在 Martin Fowler 的《重构》一书中了解这种技术。

创建作为整个 UI 一部分的其他 UI,例如 CustomerPanel,是一种很好的思考方式。通过这样做,您还可以解耦 UI 的各个部分。创建这些较小的类以将所有依赖项移动到新类时要小心。如果您想将主 UI 的引用传递回聚合类,那么您可能还没有完全解耦您的类。这应该表明您没有对要提取的类承担足够的责任,或者它们应该共享一些其他依赖项。

基本上规则是,如果您提取一个类,它不应该有对包含它的类的引用。参考应该更像是一棵树而不是图表。他们可以共享一个模型类,但不能在视图之间创建循环。

您可能会觉得这很有趣: GUI guidelines for swing

【讨论】:

  • 写得很好。谢谢,1+。
  • 我很好奇你的指南帖子中链接到上面的一个声明。你声明永远不要使用SwingUtilities.invokeAndWait(),但是我已经读到这应该在 JApplet 的 init 方法中启动 GUI 代码时使用,如 here 所述。
  • @HovercraftFullOfEels 它们是两个不同的用例。在小程序指南中,他们说您应该使用它的原因,但仅限于生命周期方法,是这些方法由小程序容器本身而不是由事件调度程序线程调用。然而,在您的 Swing 应用程序(或小程序)正常运行期间,您只需要对该线程中出现的事件做出反应。本质上,applet 案例是针对 applet 容器不足的一种变通方法。
  • @HovercraftFullOfEels 好问题。有些用例需要 invokeAndWait() ,但它们通常是您指出的那种极端情况。像 Swing 这样的 UI 开发人员要求您习惯于放弃对事物时间的绝对控制。对于那些认为严格控制事情何时发生是关键的新开发人员来说,这很不舒服,这意味着在不应该使用的时候调用invokeAndWait()。这就是我建议的真正目的。
【解决方案2】:

我不确定我是否理解您的意图,但看起来您希望实现分解级别,这将允许您外包某些 UI 组件并重用它们,嗯,基本上实现尽可能低的耦合。除了@chubbard 所说的,我建议您研究MVP 模式并在组件之间使用基于事件的交互而不是引用它们。这可以消除不必要的依赖并带来更多的可重用性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 2016-12-03
    相关资源
    最近更新 更多