Дизайн - альтернатива хранению исполняемого кода в 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.
Мои два варианта, на мой взгляд, плохи, но по-разному.
Каждый NPC получает свой собственный класс Java и является сущностью первого класса в логике сервера. Все NPC реализуют
interact()
метод и добавление или изменение NPC требует нажатия кода.Каждый NPC получает новый столбец в БД с исполняемым файлом JS, который запускается через механизм сценариев в Java. Это немного опасно, но и просто хлопотно. Написание JS, которое может вызывать функции БД путем взаимодействия с кодовой базой Java, а затем сохранять ее в виде строки в базе данных, не очень удобно.
В настоящее время я использую вариант 2, но не слишком далеко, и мне интересно, есть ли приемлемый способ справиться с чем-то вроде этого, что лучше.
1 ответ
Хранение исходного кода в базе данных мало чем отличается от хранения изображений или документов. Однако я верю, что вы ищете какой-нибудь декларативный язык ( DSL) для описания NPC, а не императивную программу, реализующую его. Самый простой способ - создать расширяемый DSL на основе XML или JSON. В этом случае документ XML может быть сохранен в базе данных как часть данных профиля персонажа.