我们想要一个游戏的主席班。 我们如何创建此类,使其也可以在其他游戏中使用? 并考虑坚实的原则。
例如,假设我们有2种游戏:一种是扑克游戏,另一种是类似侠盗猎车手的游戏。在扑克游戏中,班级应具有id
,playersited() : player
,state : full
,empty
,reserved
。我现在可以想到这些属性。但是在第二局中,主席不需要id
或playersited()
函数。那么,如何设计可以在其他游戏中重用的此类?
答案 0 :(得分:2)
您正在寻找可在不同游戏中重用的通用游戏对象,但根据游戏的不同,它可能具有不同的属性和功能。
如果仅从UML角度来看它,则此设计问题很简单:绘制一个类GameObject
,并在其中放入您希望通用的属性和操作。然后,在不同游戏的模型中,只需使用继承PokerObject
和GrandCloneObject
来创建专门化类别,即可在其中添加游戏特定的属性和操作。
但是,当您开始设计与其他类的链接(可重复使用与否)时,这种明显的简单性将隐藏很多困难点,而当您开始查看它们之间的交互时,甚至会隐藏更多的困难。
此外,您还需要SOLID设计。然后,通过迫使您保持对象之间的可重用交互仅依赖公共部分,LSP将降低可重用性。
如果最终只有10%的设计真正可重用,而90%是特定于游戏的,那么您将没有任何优势,只是通过人为地拆分类而使代码变得更加复杂。在这里,我联合@kigiri的评论:“ Just Do n't ”
但是,如果您要寻找的是真正可以大规模重用的东西,那么如果您不关注Chair
,“武器”,“物品”,而是更高层次的抽象,则可以找到解决方案。
在这里,我只能建议您阅读Mike McShaffry的游戏编码完成书,它将为您介绍一种非常强大的体系结构模式,称为Entity Component System。
该想法是放弃具有非常特定类的深层嵌套类层次结构,但希望使用具有以下特征的非常扁平的模型:
此设计允许开发高度可重用的对象,从而允许在可重用实体和组件的顶部添加游戏特定的组件。