设计-在SQL中存储可执行代码的替代方案



我正在开发一款小型浏览器游戏,遇到了一个设计问题,我能想到的唯一解决方案都很糟糕。

它是一个典型的web应用程序-Angular2/HTML/JS前端,带有PostgreSQL数据库的Java服务器,托管在nginx和Tomcat 上的内容

用户可以与各种具有自定义行为的NPC(非玩家角色)进行交互。我已经将这个逻辑通用化了,NPC作为配置行存储在DB中,

  • ID:1
  • 姓名:Sam The NPC
  • ImgURL:"www.mygame.com/img/npc/sam.png">

访问mygame.com/npc/1在JS中向Java中的后端API发出一个GET,以从DB中获取该行,这些值将被绑定并显示。将这些行作为配置行存储在DB中可以添加新的NPC或编辑现有的NPC,而无需重新部署服务器或前端代码。

到目前为止是标准的。然而,我希望NPC山姆是友好的,拜访他会增加玩家的钱。另一个NPC,Steve,应该是敌对的,并从玩家的库存中移除金钱或物品。NPC鲍勃有时可以解锁玩家的任务。

这就是我的困境:每个NPC都有完全不同的任意行为,这意味着我需要每个NPC的可执行代码。

在我看来,我的两个选择都很糟糕,但方式不同。

  1. 每个NPC都有自己的Java类,并且是服务器逻辑中的第一类实体。所有NPC都实现interact()方法,添加或更改NPC需要代码推送。

  2. 每个NPC都会在DB中获得一个新列,其中包含可执行的JS,通过Java中的脚本引擎运行。这有点危险,但也只是一个麻烦。编写JS可以通过与Java代码库交互来调用DB函数,然后将其保存为数据库中的字符串,这是一种笨拙的做法。

我目前正在使用选项2,但还不算太远,我想知道是否有一种可以接受的方法可以更好地处理这样的事情。

将源代码存储在数据库中与存储图像或文档没有太大区别。然而,我相信你正在寻找一些声明性语言(DSL)来描述NPC,而不是实现它的命令式程序。最简单的方法是创建基于XML或JSON的可扩展DSL。在这种情况下,XML文档可以作为角色配置文件数据的一部分存储在数据库中。

相关内容

  • 没有找到相关文章

最新更新