所以这个问题是从这里开始的(如何处理多个事件参数)。这个问题让我开始思考这个问题,但它的不同足以保证它自己的线程。
我正在创建一个游戏(出于娱乐和学习目的),并且想知道我是否使用了良好的设计标准。我想我可能已经在关注点分离上进行了 OTT,或者只是把整个事情弄错了,但我希望情况并非如此。重写它没有问题,因为我想学习“最佳实践”和它们的实际应用。
编辑
让我稍微解释一下这个游戏,它基于 Jawbreaker 一个在许多手机上发现的游戏(快速演示在这里找到)。目标是选择分组的球以将它们从比赛中移除并获得尽可能多的分数。
我正在尝试将其扩展一点,并使用不同类型的板,球以不同的方式移动,不同的球类型,球可能只是去他们被告知的地方,或者他们可能会沿途做一些事情。
所以这是我创建的对象的结构,第一行显示了 DLL 及其对象,第二行显示了这些对象引用的内容:
(来源:ggpht.com)
这是我做 UML 的尝试:
单击此处链接到 UML 的完整页面,使其更大一些,希望更易于阅读
对象 DLL 包含游戏中使用的基本对象、球和棋盘。它们不包含任何关于它们如何对情况采取行动/反应的逻辑(球确实实现了 CompareTo 和 Equals 方法)。IBall 的实现可能有 X 个(对于 IBoard 也是如此,尽管我想象的不会那么多)。
InstanceManager DLL 被用作创建对象的一种方式,不确定这是 100% 需要的,它本可以在对象 DLL 中使用。工厂是具有各种重载方法来创建 IBall 对象的静态类。BallFactory 可以采用 BallType Enum、A Drawing.Color 对象等。 BoardFactory 非常相似。Jawbreaker 是一个单例对象,它处理诸如保存一个非常经常使用的随机对象和一些 GameConfiguration 数据(与本主题不太相关)之类的事情。
Engine DLL 是大部分工作发生的地方。LogicFactories 使用 BallType 和 BoardType 对象来创建相关的逻辑对象。逻辑对象用于控制 IBall 和 IBoard 对象的工作方式。BallLogic 告诉球在其事件触发时它可以做什么。例如,当一个球被选中时,会在 Ball Logic 上调用一个方法,说明板上 Y 上的 Ball X 已被选中。然后,球可以做任何它的类型的球应该/可以做的事情。BoardLogic 非常相似,它处理董事会的行为方式。
引擎对象是另一个单例,它是 GUI 与整个游戏交互的方式。GUI 不会直接实例化任何其他对象。
所以总结一下 IBall 和 IBoard 类只保存关于它们的数据,逻辑类处理所有功能。
我想知道的是:
1)这是一种明智的方法吗?
2)(通常)逻辑应该与对象/数据分开吗?
3)我是否在关注点分离方面走得太远了?
4) 关于设计/结构的任何其他意见
编辑
我使用几个单例的部分原因是为了简单地在一个地方访问数据而无需一直保持对象,也只是因为它是一个单一的游戏,不会扩展到高端或跨多台机器. 我确实知道它们不是很好,也不是我经常使用的东西,但感谢您的评论。
感谢您的想法和反馈。