Allen Holub的文章(您提到的那篇文章)是完全正确的,至少在进行面向对象时,您不应该索要数据。不,显示事物不是打开对象的有效借口。
如果您有个
Book,则要求
Book使其显示!它不应该不管是否使用一个
JTextField或
JTable或什么的。当然,根据您的要求,您可以执行以下操作:
public final class Book { ... JComponent display() { ... }}当然,面向对象的要点是您要尝试本地化更改(尽可能限制为一类)。唯一的方法是将依赖于相同事物的功能本地化(最好是)相同的类。也称为增加“内聚力”。
因此,现在,如果
Book内部结构发生变化,则所有内容(包括如何
Book显示)都在其
Book本身内,因此无需“搜寻”使用的代码
Book。
现在,答案是“干净”的,因为您正在将演示代码与“业务逻辑”混合在一起。可能有趣的是,不将演示文稿与“业务逻辑”混合在一起的整个想法来自早期,那时我们仍然认为演示文稿可能是“远程”到“业务对象”的,而“业务对象”可能是由多个应用程序用于不同的事物。就是
多层设计。YAGNI。大多数时候,没有真正的理由在单个应用程序中具有人为的技术界限。只要
Book知道它是GUI应用程序的一部分,就不会造成任何危害,并且拥有真正的好处(可维护性)。
编辑:这是`display()方法的详细显示方式,其中显示了标题和作者(Swing的伪代码):
public final class Book { private final String title; private final List<Author> authors; ... public JComponent display() { JPanel bookPanel = new JPanel(); bookPanel.add(new JLabel(title)); JList authorsList = new JList(); // Or similar for (Author author: authors) { authorsList.add(author.display()); } bookPanel.add(authorsList); return bookPanel; }}然后,您可以
add()将该组件简单地放置到想要在其中显示书的任何回转容器中。



