Java 什么都有自己的班级

Java 什么都有自己的班级,java,swing,oop,class,Java,Swing,Oop,Class,我正在制作一个客户管理软件。有几个JPanel上有很多内容,不断地与数据库通信。数据库中有客户数据、产品等。 为了更快地访问数据库数据,首先我将其全部加载到自己的ArrayList中,例如ArrayList。如果用户更改此数据,则必须同时在类和数据库中更改此数据。 由于JPanel视图看起来非常“满”(塞满了其他JPanel和JTabbedPane,通过CardLayout切换),我认为最好为每个“主”JPanel创建一个自己的类,并将它们与视图链接起来 例如,JPanelCustomer的一个

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

这是合理的还是不合理的?我只想把代码外包出去,让类更清晰,尤其是
View


是否有类似于处理此问题的设计模式的东西?

因此,您的程序由一个类组成,该类是JPanel的子类,并且包含对UI中使用的所有其他组件的引用?您想知道是否应该将该UI的部分划分为其他类

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

创建作为整个UI一部分的其他UI(如CustomerPanel)是一个很好的思考方法。通过这样做,您还可以解耦UI的各个部分。创建这些较小的类以将所有依赖项移动到新类时要小心。如果您想将对主UI的引用传递回聚合类,那么您可能还没有完全解耦您的类。这应该是一个迹象,要么你没有给你提取的类赋予足够的责任,要么他们应该共享一些其他的依赖关系

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

你可能会发现这很有趣:

那么您的程序由一个类组成,该类是JPanel的子类,并且包含对UI中使用的所有其他组件的引用?您想知道是否应该将该UI的部分划分为其他类

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

创建作为整个UI一部分的其他UI(如CustomerPanel)是一个很好的思考方法。通过这样做,您还可以解耦UI的各个部分。创建这些较小的类以将所有依赖项移动到新类时要小心。如果您想将对主UI的引用传递回聚合类,那么您可能还没有完全解耦您的类。这应该是一个迹象,要么你没有给你提取的类赋予足够的责任,要么他们应该共享一些其他的依赖关系

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

你可能会发现这很有趣:

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

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

您正在寻找ORM(对象关系映射)吗?通过这样做可以很容易地发现它有多方便或不方便。然后您可以比较在这两组代码中查找或更改内容的容易程度。我的猜测是,你会发现分解后的代码更容易阅读和维护。你在寻找ORM(对象关系映射)吗?通过这样做可以很容易地发现它有多方便或不方便。然后您可以比较在这两组代码中查找或更改内容的容易程度。我的猜测是,你会发现分解后的代码更容易阅读和维护。写得很好。谢谢,还有1+。我很好奇你的指导原则帖子中有一句话链接到上面。您声明从不使用
SwingUtilities.invokeAndWait()
,但是我已经了解到,在JApplet的init方法中启动GUI代码时应该使用此选项,如前所述。@HovercraftFullOfEels它们是两种不同的用例。在applet指南中,他们说您应该使用它的原因(但仅限于生命周期方法)是这些方法由applet容器本身调用,而不是由事件调度器threa调用