如何设计一个可以在其他项目中复用的class
How to design a class that can be reused in other projects
我们想要一把椅子 class 来玩游戏。
我们如何创建这个 class 以便它也可以在另一个游戏中工作?
并通过考虑坚实的原则。
例如,假设我们有 2 个游戏:一个是扑克牌游戏,另一个是类似侠盗猎车手的游戏。在扑克游戏中,class 应该有一个 id
、playersited() : player
、state : full
、empty
、reserved
。我现在可以想到这些属性。但是在第二个游戏中,椅子不一定需要 id
或 playersited()
功能。那么我该如何设计这个可以在其他游戏中重复使用的class呢?
您正在寻找可以在不同游戏中重复使用的通用游戏对象,但它可能具有不同的属性和不同的功能,具体取决于游戏。
简单的 UML 答案
如果你只是单纯从UML的角度来看,这个设计问题很简单:画一个classGameObject
,把你想要的属性和操作放到里面常见的。然后在不同游戏的模型中,只需使用继承创建一个专业化:PokerObject
和 GrandCloneObject
,您可以在其中添加游戏特定的属性和操作。
但是,当您开始设计与其他 class 的链接(可重用或不可重用)时,这种表面上的简单性会隐藏很多难点,而当您开始查看它们的交互时,甚至更多。
这种通用设计的局限性
此外,您还需要 SOLID 设计。然后,LSP 将通过强制您将对象之间的可重用交互仅依赖于公共部分来降低可重用性。
如果最终只有 10% 的设计真正可重用,而 90% 是特定于游戏的,那么您将没有任何优势,只会通过人为拆分 class 使代码更加复杂。在这里我联合@kigiri 的评论:“只是不要”
更好的方法
但是,如果您正在寻找真正可在更大范围内重复使用的东西,那么如果您不看 Chair
、"Weapon"、"Item",就有一个解决方案,但是在更高的抽象层次上。
在这里,我只能推荐您阅读 Mike McShaffry 的 Game Coding Complete 一书,它将向您介绍一种非常强大的架构模式,称为 Entity Component System。
想法是放弃具有非常具体 class 的深层嵌套 class 层次结构,但更喜欢非常扁平的模型:
- 实体:这些是游戏中使用的主要对象,无论游戏是什么
- Components:这些由实体拥有,代表实体可以拥有的属性(例如 LivePoints、Force,...),或实体应具有的行为有(例如 renderFixedObject、soundWhenClicked 等)。
此设计允许开发高度可重用的对象,允许在可重用实体和组件之上添加游戏特定组件。
我们想要一把椅子 class 来玩游戏。 我们如何创建这个 class 以便它也可以在另一个游戏中工作? 并通过考虑坚实的原则。
例如,假设我们有 2 个游戏:一个是扑克牌游戏,另一个是类似侠盗猎车手的游戏。在扑克游戏中,class 应该有一个 id
、playersited() : player
、state : full
、empty
、reserved
。我现在可以想到这些属性。但是在第二个游戏中,椅子不一定需要 id
或 playersited()
功能。那么我该如何设计这个可以在其他游戏中重复使用的class呢?
您正在寻找可以在不同游戏中重复使用的通用游戏对象,但它可能具有不同的属性和不同的功能,具体取决于游戏。
简单的 UML 答案
如果你只是单纯从UML的角度来看,这个设计问题很简单:画一个classGameObject
,把你想要的属性和操作放到里面常见的。然后在不同游戏的模型中,只需使用继承创建一个专业化:PokerObject
和 GrandCloneObject
,您可以在其中添加游戏特定的属性和操作。
但是,当您开始设计与其他 class 的链接(可重用或不可重用)时,这种表面上的简单性会隐藏很多难点,而当您开始查看它们的交互时,甚至更多。
这种通用设计的局限性
此外,您还需要 SOLID 设计。然后,LSP 将通过强制您将对象之间的可重用交互仅依赖于公共部分来降低可重用性。
如果最终只有 10% 的设计真正可重用,而 90% 是特定于游戏的,那么您将没有任何优势,只会通过人为拆分 class 使代码更加复杂。在这里我联合@kigiri 的评论:“只是不要”
更好的方法
但是,如果您正在寻找真正可在更大范围内重复使用的东西,那么如果您不看 Chair
、"Weapon"、"Item",就有一个解决方案,但是在更高的抽象层次上。
在这里,我只能推荐您阅读 Mike McShaffry 的 Game Coding Complete 一书,它将向您介绍一种非常强大的架构模式,称为 Entity Component System。
想法是放弃具有非常具体 class 的深层嵌套 class 层次结构,但更喜欢非常扁平的模型:
- 实体:这些是游戏中使用的主要对象,无论游戏是什么
- Components:这些由实体拥有,代表实体可以拥有的属性(例如 LivePoints、Force,...),或实体应具有的行为有(例如 renderFixedObject、soundWhenClicked 等)。
此设计允许开发高度可重用的对象,允许在可重用实体和组件之上添加游戏特定组件。