这是一个一般性的问题,但我会先给你我的具体问题:
我现在正在为我的程序编写一个GUI,这个程序将采用一个框架的形式,上面放置了各种小部件(标签、文本字段等)。它最初将使用javax.swing
库,但我在库和GUI本身之间保留了一层抽象,以便更容易地创建一个做同样事情的web应用程序。
我想要一个类来表示GUI的布局:也就是说,它应该包含关于各种标签、按钮等在内容窗格上放置位置的所有信息。目前,我正在考虑的实现方式如下:
class Layout
{
public MyLabel titleLabel;
public myTextField sequenceTextField;
[...]
public void drawTitleLabel()
{
titleLabel = new MyLabel("This is the title.");
titleLabel.setLocation(wherever);
titleLabel.draw();
}
public void drawSequenceTextField()
{
sequenceTextField = new MyTextField();
[...]
sequenceTextField.draw();
}
[...]
public void drawGuiFrame()
{
drawTitleLabel();
drawSequenceTextField();
[...]
}
}
因此,我将内容窗格上的每个小部件声明为类Layout
的字段,然后创建绘制每个小部件的方法drawWidgetName
。最后,我创建了一个方法,它调用每个draw...
方法,以便绘制整个GUI。
不过,这似乎是错误的。draw...
方法感觉它们应该是单个窗口小部件本身的方法,而不是整个GUI的大规模布局的方法。这表明我应该创建单独的类TitleLabel
、SequenceTextField
等,每个类都有一个draw
方法,然后在Layout
类中有一个调用所有这些draw
方法的drawGuiFrame
方法(我甚至可以创建一个抽象类,这些新类可以扩展它)。
这样做还有其他一些直接的好处。假设我想合并一个复选框系统以及我的标签和文本区域。然后我可以将其声明为自己的类,并为其提供属性isOptionA
、isOptionB
等,以记录选中了哪个复选框。
但是我有点不愿意以这种方式实现GUI,原因有两个。首先,创建这么多新类会使代码库中有很多小的.java
文件。其次,这些将是非常"一次性"的类:我再也不会使用代码了,因为这些类将纯粹为这个特定的GUI设计。
那么,多少课太多了?仅仅因为你觉得它们应该是类,就可以创建很多只会使用一次的新类吗?正如我所说,尽管我欢迎针对这个特定问题的建议,但我也在寻找关于何时适合添加新类的更一般的建议。
对我来说,拥有单独的类似乎是正确的方法。你将类组织在包、模块和子模块中,这样它们就不应该"扰乱代码库"。java中的一个大型应用程序可以很容易地拥有大量的类,这些类可能仅由单个应用程序使用。这几乎就是java作为一种语言和整个java生态系统的工作方式。
在java中,通常认为类布局越细粒度越好。
我自己喜欢为每个新引入的概念创建一个类。通常一个类可以是任意长的,尤其是如果你在其中使用了大量硬编码的数据http://en.wikipedia.org/wiki/God_object.
如果某个类中有太多的逻辑,就会变得很难阅读。如果你觉得一个类变得太大了,看看这个类中是否有逻辑可以拥有自己的类。