如何设计可在其他项目中重用的类

时间:2019-03-27 16:14:34

标签: uml class-design reusability

我们想要一个游戏的主席班。 我们如何创建此类,使其也可以在其他游戏中使用? 并考虑坚实的原则。

例如,假设我们有2种游戏:一种是扑克游戏,另一种是类似侠盗猎车手的游戏。在扑克游戏中,班级应具有idplayersited() : playerstate : fullemptyreserved。我现在可以想到这些属性。但是在第二局中,主席不需要idplayersited()函数。那么,如何设计可以在其他游戏中重用的此类?

1 个答案:

答案 0 :(得分:2)

您正在寻找可在不同游戏中重用的通用游戏对象,但根据游戏的不同,它可能具有不同的属性和功能。

简单的UML答案

如果仅从UML角度来看它,则此设计问题很简单:绘制一个类GameObject,并在其中放入您希望通用的属性和操作。然后,在不同游戏的模型中,只需使用继承PokerObjectGrandCloneObject来创建专门化类别,即可在其中添加游戏特定的属性和操作。

但是,当您开始设计与其他类的链接(可重复使用与否)时,这种明显的简单性将隐藏很多困难点,而当您开始查看它们之间的交互时,甚至会隐藏更多的困难。

这种通用设计的局限性

此外,您还需要SOLID设计。然后,通过迫使您保持对象之间的可重用交互仅依赖公共部分,LSP将降低可重用性。

如果最终只有10%的设计真正可重用,而90%是特定于游戏的,那么您将没有任何优势,只是通过人为地拆分类而使代码变得更加复杂。在这里,我联合@kigiri的评论:“ Just Do n't

更好的方法

但是,如果您要寻找的是真正可以大规模重用的东西,那么如果您不关注Chair,“武器”,“物品”,而是更高层次的抽象,则可以找到解决方案。

在这里,我只能建议您阅读Mike McShaffry的游戏编码完成书,它将为您介绍一种非常强大的体系结构模式,称为Entity Component System

该想法是放弃具有非常特定类的深层嵌套类层次结构,但希望使用具有以下特征的非常扁平的模型:

  • 实体:无论游戏是什么,这些都是游戏中使用的主要对象
  • 组件:这些实体归实体所有,代表实体可以拥有的属性(例如LivePoints,Force等),或者实体应具有的行为(例如renderFixedObject, soundWhenClicked等。)。

此设计允许开发高度可重用的对象,从而允许在可重用实体和组件的顶部添加游戏特定的组件。