2012-02-01 66 views
1

我想真正得到一个好主意如何在OOP术语中思考,所以我有一个半假想的场景在我的脑海中,我正在寻找有些想法。模拟大量与其他对象相关的对象(“有”)

如果我想为不同类型的人进行互动模拟,他们每个人都可以在不同的“技能”中获得不同的熟练水平,那么最佳的方法是什么?

这真的是“技能”的东西,我有点着迷。我的要求如下:
- 每个人无论是“拥有”一个技能或不
- 如果人有一技之长,他们也有与技能
-I需要一种方法来查找和相关的“熟练程度”挑选出每个具有一定技能或者某种水平的人 - 设计需要可扩展(即,我需要能够在后面添加更多“技能”)

我考虑了以下选项:

  1. 对于我所包含的每一项技能都有一个巨大的枚举, e人类包含一个 “int技能[TOTAL_NUM_SKILLS]”成员。该阵列将具有“未获得技能”的零,以及1到(最大)熟练水平的“获得技能”。

  2. 具有相同的巨人枚举,并有专人类包含地图与技能相关的技能(从ENUM)和数字,这样你可以只添加所获得的技能,地图等一批关联这办法。

  3. 创建的每一个技能的具体类,并让每个从一个抽象基类继承(ISkill,说的),并有专人类有地图ISkill的

真的,选项1看起来像是直截了当的没有废话的做法。请批评;有没有理由不接受?有更多的面向对象的方式来做到这一点吗?

我知道选项3现在没有什么意义,但是如果我决定稍后再延长这一点,让技能不仅仅是与他们相关的熟练程度的东西(即,实际上将新动作与技能相关联( ISkill :: DoAction等),这是否有意义作为一个选项?

对于广泛的问题,我只想看看这种思路是否有意义,或者如果我吠叫完全错误的树

+0

请停止标记标题和签名帖 – 2012-02-24 16:46:45

回答

1

选项1的问题在于未来的兼容性,假设您将此框架发布给客户,那么客户已经构建了这个数组,其值为TOTAL_NUM_SKILLS,每个人。但是,只要您尝试添加其他技能,特别是在尝试重新排序技能时,就会失败。

如果客户使用RPC框架,客户端和服务器通过线路传递Person对象会怎么样?现在,除非客户在同一时间升级客户端和服务器,否则RPC调用会中断,因为现在客户端和服务器期望不同长度的数组。这可能特别棘手,因为客户可能只拥有客户端,或者只拥有服务器,并且无法一次升级。

但它变得更糟。假设客户端在某个文件中写出了一个Person对象到磁盘。如果他们决定将一个人序列化为一个简单的数字列表,那么新技能将导致反序列化代码失败。更糟糕的是,如果你在你的枚举中重新排列技能,反序列化代码可能工作得很好,但给出了错误的答案。

我想正是针对你的原因选项3:以后你可以添加更多的功能,并安全地这样做(当然,除了那些every public change is a breaking change如果你的客户一定的行使边界情况在语言的事实)。

+0

有趣。你有没有遇到这样的情况? – 8bitcartridge 2012-02-01 21:40:16

0

如果你想在不改变整体程序结构的情况下增加技能,我会考虑某种外部数据文件,你可以在不重新编译代码的情况下更改。想想你想在一个非常大的项目中做到这一点。选择技能的人可能是一个没有编程能力的设计师。他可以在XML文件中编辑技能,但不能在C++代码中编辑。

如果您定义了XML中的技能,它自然会延伸到存储更多数据与每种技能。您的玩家也可以被序列化为XML文件。

当您在运行时设置玩家的技能时,您可以从XML文件构建一个键入技能名称的哈希表。如果列举玩家的技能比查询玩家是否具备某种技能更为常见,则可以使用字符串向量。

当然,这个解决方案会使用更多的内存,运行速度比您的枚举解决方案慢。但它可能会足够好,除非你与你的计划中的数百万玩家打交道。