【发布时间】:2009-12-17 17:01:07
【问题描述】:
所以这个问题是从这里 (how to deal with multiple event args) 开始的。这个问题让我开始思考这个问题,但它的不同之处足以保证它自己的线程。
我正在创建一个游戏(出于娱乐和学习目的),并且想知道我是否使用了良好的设计标准。我想我可能在关注点分离上使用了 OTT,或者只是把整个事情弄错了,但我希望不是这样。重写它没有问题,因为我想学习“最佳实践”及其实际应用。
编辑
让我稍微解释一下这款游戏,它基于 Jawbreaker,这是一款在许多手机上都能找到的游戏 (quick demo found here)。目标是选择成组的球,将它们从比赛中移除并获得尽可能多的分数。
我正在尝试将其扩展一点,并设置不同类型的板,球以不同的方式移动,不同的球类型,球可能只是去他们被告知的地方,或者他们可能会沿途做一些事情。
下面是我创建的对象的结构,第一行显示 DLL 及其对象,第二行显示这些对象引用的内容:
(来源:ggpht.com)
这是我做 UML 的尝试:
alt text http://yuml.me/3279d2ac
Click here to link to full page for UML, makes it a little larger and hopefully easier to read
Objects DLL 包含游戏中使用的基本对象、球和棋盘。它们不包含任何关于它们如何对情况采取行动/反应的逻辑(球确实实现了 CompareTo 和 Equals 方法)。 IBall 的实现可能有 X 个(对于 IBoard 也是如此,尽管我想象的不会那么多)。
InstanceManager DLL 被用作创建对象的一种方式,不确定这是 100% 需要的,它本可以在对象 DLL 中使用。工厂是具有各种重载方法来创建 IBall 对象的静态类。 BallFactory 可以采用 BallType Enum、A Drawing.Color 对象等。 BoardFactory 非常相似。 Jawbreaker 是一个单例对象,它处理诸如保存一个非常经常使用的随机对象和一些 GameConfiguration 数据之类的事情(与本主题不太相关)。
引擎 DLL 是大部分工作发生的地方。 LogicFactories 使用 BallType 和 BoardType 对象来创建相关的逻辑对象。逻辑对象用于控制 IBall 和 IBoard 对象的工作方式。 BallLogic 告诉球在其事件触发时它可以做什么。例如,当一个球被选中时,会在 Ball Logic 上调用一个方法,说明板上 Y 上的 Ball X 已被选中。然后,球可以做任何它的类型的球应该/可以做的事情。 BoardLogic 非常相似,它处理董事会的行为方式。
引擎对象是另一个单例,它是 GUI 与整个游戏交互的方式。 GUI 不会直接实例化任何其他对象。
总而言之,IBall 和 IBoard 类只保存有关它们的数据,Logic 类处理所有功能。
我想知道的是:
1) 这是一种明智的做法吗?
2) (通常)逻辑是否应该与对象/数据分开?
3) 我在关注点分离方面做得太过分了吗?
4) 关于设计/结构的任何其他 cmets
编辑
我使用几个单例的部分原因是为了方便在一个地方访问数据而无需一直保持对象,也只是因为它是一个单一的游戏,不会扩展到高端或跨多台机器。我确实知道它们不是很好,也不是我经常使用的东西,但感谢 cmets。
感谢您的想法和反馈。
【问题讨论】:
-
虽然你对你的设计的解释很清楚,但我认为如果你把你的设计作为一个 UML 类图(比如说)你可以更清楚地理解你的信息。在阅读文本时,我必须在脑海中不断绘制箭头以了解所有这些类如何交互。
-
非常好,今晚会这样做并尽快把它放上去。谢谢萨提什
-
看看 Visual UML 或 Netbeans UML,它将帮助您将类设计为 uml。
-
您的课程似乎没有那么复杂,所以我会使用yuml.me 来创建图表。
-
真的很喜欢yuml.me,很酷。谢谢
标签: design-patterns separation-of-concerns