Дизайн - альтернатива хранению исполняемого кода в SQL

Я работаю над небольшой браузерной игрой, и у меня возникла проблема с дизайном, и единственное решение, о котором я могу подумать, - это плохо.

Это типичное веб-приложение - Angular2/HTML/JS, Java-сервер с базой данных PostgreSQL, контент, размещенный на nginx и Tomcat.

Пользователи могут взаимодействовать с различными NPC (неигровыми персонажами), которые все ведут себя по-своему. Я обобщил эту логику, NPC хранятся в БД в виде строк конфигурации,

  • ID: 1
  • Имя: Сэм NPC
  • ImgURL: "www.mygame.com/img/npc/sam.png"

Доступ к mygame.com/npc/1 вызывает GET в JS для внутреннего API в Java, чтобы получить эту строку из БД, и эти значения будут связаны и отображены. Хранение их в виде строк конфигурации в БД позволяет мне добавлять новые NPC или редактировать существующие без повторного развертывания сервера или внешнего кода.

Пока все стандартно. Тем не менее, я хочу, чтобы Сэм был дружелюбным, и посещение его увеличивает деньги игрока. Другой NPC, Стив, должен быть враждебным и убирать деньги или предметы из инвентаря игроков. Боб NPC может, иногда, разблокировать квест для игроков.

Вот где я застрял: каждый NPC, имеющий совершенно другое и произвольное поведение, означает, что мне нужен исполняемый код для каждого NPC.

Мои два варианта, на мой взгляд, плохи, но по-разному.

  1. Каждый NPC получает свой собственный класс Java и является сущностью первого класса в логике сервера. Все NPC реализуют interact() метод и добавление или изменение NPC требует нажатия кода.

  2. Каждый NPC получает новый столбец в БД с исполняемым файлом JS, который запускается через механизм сценариев в Java. Это немного опасно, но и просто хлопотно. Написание JS, которое может вызывать функции БД путем взаимодействия с кодовой базой Java, а затем сохранять ее в виде строки в базе данных, не очень удобно.

В настоящее время я использую вариант 2, но не слишком далеко, и мне интересно, есть ли приемлемый способ справиться с чем-то вроде этого, что лучше.

1 ответ

Хранение исходного кода в базе данных мало чем отличается от хранения изображений или документов. Однако я верю, что вы ищете какой-нибудь декларативный язык ( DSL) для описания NPC, а не императивную программу, реализующую его. Самый простой способ - создать расширяемый DSL на основе XML или JSON. В этом случае документ XML может быть сохранен в базе данных как часть данных профиля персонажа.