java - 数据驱动设计,引用数据

标签 java oop

我正在努力为我的游戏提出一个好的设计。我目前正在测试一个数据驱动的项目系统,我希望这个系统非常灵活。

  • 我有一把武器,需要某种类型的弹药。
  • 我有某种弹药类型的实际弹药。

如果玩家想要发射武器,我需要查找其库存中是否有正确的弹药类型。对于需要保存弹药类型引用的实际弹药也是如此。当玩家拾取已经拥有的弹药时,应该将其相互添加。

我目前正在考虑的是弹药类型的一个类,它有一个“短”字符串供引用,因为字符串在 Json 文件中更具可读性。这个类还保存弹药的信息,如正确的名称和一些额外的信息。最后,我创建了一个列表来保存不同类型的弹药。

然后,当我创建实际的弹药(元素)时,我将从文件生成的弹药类型列表中选择一种类型。该弹药元素可容纳其数量。当弹药被射击并且有东西被击中时,我可能会在这里使用接口(interface)和工厂来处理不同类型的弹药(爆炸弹药、穿刺弹药、轻型弹药的行为都不同)。

然后,当武器想要开火时,我通过查找“短”字符串来检查相应的弹药是否在玩家库存中。

我想知道我是否走在正确的道路上。我对我的引用系统使用“短”字符串表示弹药类型有疑问。如果我创建我的弹药类型的工厂,我可以检查我的武器射击方法是否有该类类型的弹药,并且我只会使用工厂中的简写字符串来创建各种对象。

如果我想使用工厂并进行 OOP,我需要很多类。

[Ammo]
    [Bullet]
        [762mm] //I know this is not a valid class name, have to come up with something.
        [5.56mm]
        [Etc.] //Plenty more to come thanks to data driven
    [Rocket]
        [Tornado]
        [Etc.] //Plenty more
    [Grenade] //Launcher
        [Etc.]
    [Etc.] //..

但是对于每种类型,我都可以有一个界面并创建功能。我可以通过比较类别轻松比较弹药的类型。

如果我通过简写字符串使用引用,则不必创建所有类、接口(interface)和工厂,但必须在长语句中设置弹药规则。从长远来看,事情可能会变得困惑。

对此或其他“更好”的方法有什么想法吗?

最佳答案

由于以下原因,我建议不要采用差异化的 OOP 方法:

  • 数据驱动

你说弹药和武器将通过数据驱动设计来创建。这一切都很好,但如果您需要为每种类型的弹药创建一个新的子类,您仍然需要实际实现该新类。这是针对每种弹药的。在游戏中获取新弹药变得很容易......

哪种弹药适合哪种枪需要放在某个地方的逻辑。您可以在 OOP 中完成此操作,但您也可以将所有相关信息保存在通用数据表中(数据驱动!给您!)。您的代码将仅实现一般规则,但不会实现子弹类型与枪支等的实际关系。我会将其存储在数据库中。您的代码保持不变,但行为是数据驱动的...缺点当然是您的测试现在需要处理来自数据库的数据。

  • OOP 与对象组合

如果您的对象确实遵循这个相当严格的模型,那么 OOP 就一切都很好。我真的不是弹药方面的专家,所以我可能是错的,但是是否有可能想到共享几种父类型特征的弹药实体?这种关系很难在 OOP 中建模。这是 JAVA OOP 的一个缺点,因为你不能继承多个 parent 。相反,您应该研究对象组合。

我认为您关于人类可读标识符的短字符串的想法是可以的。这些也应该来自您的数据,并且不应该进行硬编码。

关于java - 数据驱动设计,引用数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31491237/

相关文章:

java - 使用 CDI 的生产者对 HashMap 的注入(inject)不明确

java - 如何执行使用另一个 jar 的 jar

.net - 数据库层设计问题

c++ - 如何从 C++ 中的另一个实例访问一个实例的信息?

java - Java 中抽象属性的解决方法

java - 我说 Java 强制程序员使用 OOP 而 C++ 不使用 OOP 对我来说正确吗?

java - 如何在原生 Android 应用程序中渲染 epub 文件?

java - 如何将文本发送到在 selenium webdriver 中使用自动完成功能的搜索框

java - 如何从表中获取值?

python - 如何一次更改一个类的所有对象?