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

问题描述 投票:1回答:1

我们想要一个游戏的椅子类。我们如何创建这个类,以便它可以在另一个游戏中工作?并通过考虑坚实的原则。

想象一下,例如,我们有2个游戏:一个是扑克游戏,另一个是像游戏一样的大型盗窃汽车。在扑克游戏中,该类应该有idplayersited() : playerstate : fullemptyreserved。我现在可以想到这些房产。但在第二场比赛中,主席并不需要idplayersited()功能。那么我怎样才能设计出可以在其他游戏中重用的这个类呢?

uml class-design reusability
1个回答
2
投票

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

Simple UML answer

如果您只是从UML角度来看它,那么这个设计问题很简单:绘制一个类GameObject,在其中添加您想要常见的属性和操作。然后在你的不同游戏的模型中,只需使用继承创建一个特化:PokerObjectGrandCloneObject,你可以在其中添加游戏特定的属性和操作。

但是,当您开始设计与其他类(可重用或不可重用)的链接时,这种明显的简单性会隐藏许多难点,当您开始查看它们的交互时甚至更多。

Limitations of such a generic design

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

如果最终只有10%的设计可以重复使用,而90%是特定于游戏的,那么你将无法获得优势,只需人为地分类,就可以使代码变得更加复杂。在这里,我联合@ kigiri的评论:“只是不要”

A better approach

但是,如果你正在寻找的是一个真正可以在更高规模上重复使用的东西,那么如果你不看一个Chair,“武器”,“项目”,但是在更高的抽象层次上有一个解决方案。

在这里,我只能建议你阅读Mike McShaffry的Game Coding Complete书,它将为你介绍一种非常强大的建筑模式,称为Entity Component System

想法是放弃具有非常特定类的深层嵌套类层次结构,但更喜欢非常平坦的模型:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.