【问题标题】:Java Sprite should be merged with Data StructureJava Sprite 应该与 Data Structure 合并
【发布时间】:2011-02-06 14:26:15
【问题描述】:

我正在构建自己的 Canvas 风格的 JPanel 子类,它将绘制节点和弧线图。 作为此应用程序的一部分,我将节点的绘制委托给精灵类节点,即

Class Visualiser extends JPanel {

    ...

    paintComponent(Graphics g) {
        ...
        node.draw(g);
        ...
    }
}

但我也有一个用于数据结构的类节点。我不关心命名法,我可以调用一个 NodeSprite 来避免冲突等......

我想知道是否将数据结构和精灵类合并为一个,因为从逻辑上讲,它们都描述了相同的现实世界事物,或者这样做会产生任何负面影响,例如性能,或者一般不好设计。

有什么建议吗?

【问题讨论】:

  • 为什么你的Node sprites 会自己画,还是我误解了你的设计?
  • 我心中的概念是将绘制节点的逻辑传递给它自己的类。这样,如果我想要一种不同类型的精灵,我就不必将越来越多的逻辑放入我的 JPanel 子类中。你有更好的设计模式吗?

标签: java oop swing data-structures sprite


【解决方案1】:

如果NodeSprite 有不知道如何打印自己的行为,它将违反single responsibility principle。如果它只知道如何绘制,我会保持这种状态并考虑将其重命名为 NodeSpritePrinter 或类似的名称。

【讨论】:

  • @Tyler 我明白你的意思,看起来这会在可以避免的类之间增加很多通信。 Java 中存在接口的部分原因肯定是允许类具有多种职责?
  • @Adam - OO 概念的一个重要组成部分是对象可以相互通信。对象之间的通信是一件好事
  • @Tyler 是的,我想。我认为这也可能会产生性能开销,因为为每个节点保留一个 NodeSprite,并在此更改时使其与整个节点列表保持同步。
  • @Adam - 你的Node 数据结构有任何行为吗?你的NodeSprite除了画画还有其他行为吗?
  • @Tyler 我不完全确定我理解 Node 类打印机中 Printer 的措辞,但是不可能有一个方法 draw(),它(在任何子类中)可能或可能不会被覆盖——这仍然允许通过一段代码来绘制子类?
【解决方案2】:

如果 NodeSite 只是绘制一个节点。然后我会很想把它们结合起来。有时将视图与模型分开是很好的设计意义,但在某些情况下这样做肯定会产生不必要的复杂性。

此外,Node 听起来是一个非常通用的名称。无论如何,最好给它一个更具体的名称。

【讨论】:

  • 谢谢。你说如果它只是绘制一个节点——它通常还能做什么?
  • 另外,我不确定是否有更具体的名称。我没有为其绘制图表的特定域。我能想到的只有节点和顶点..
  • @Adam,我不确定您是否还有其他 NodeSite 绘制/表示的项目。现在我再看一遍,Node 可能是个好名字。
【解决方案3】:

缺点是将绘画代码与节点的域逻辑混合在一起。这不会是一场灾难,但它会使代码不那么清晰易读。为域对象及其表示建模的并行类集的模式是一种古老而光荣的模式,并且确实在 AWT 本身中使用 - 对于每个组件,都有一个相应的“本地对等点”。我会采取两门课的方法;它更好地分离了职责,并且没有真正的缺点。

【讨论】:

    猜你喜欢
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2014-03-05
    • 2022-12-01
    • 2011-07-02
    • 2012-08-17
    相关资源
    最近更新 更多