Чем заменить eval и как правильно трансформировать человеко-понятное описание в исполняемый код? Я немного не силён в мат части задач такого рода, возможно у таких задач есть определённое название и готовые методики решения, поэтому решил спросить у сообщества. Не смог правильно подобрать запрос к гуглу. Ситуация: 1) Есть код, написанный в парадигме ООП с кучей классов, объектов, методов и т.д. и т.п. 2) Нужно создать человеко-понятный описательный язык со своим синтаксисом (или использовать один из существующих, например xml) так, чтобы исполняемый код из пункта 1 автоматически создавал экземпляры классов, запускал методы и т.д. и т.п на основе скормленного ему файла с описанием. Другими словами: структуру и синтаксис описательного языка нужно как-то заложить в исполняемый код, т.е. создать что-то вроде парсера, только он будет после парсинга полученных данных не выводить их на экран и не записывать в базу, что обычно требуется от парсера, а исполнять инструкции на основе того, какое описание содержат полученные данные. Конечно, действия с полученными данными и исполняемую логику можно покрыть if, else и тд и тп, но на самом деле встроенных средств языков программирования не хватает, т.к. описательная часть вариативна, а значит и количество логики в потенциально создаваемых объектах также вариативно. Например:Имеется класс "Колобок". У него есть метод (некая внутренняя логика), который должен принимать решение при появлении на горизонте субъекта(ов): лиса, волк, заяц, медведь, а также их комбинаций, количество которых конечно. При создании объекта Колобок мы должны задать ему своего рода характер (используя описательный язык), от которого и будут зависеть дальнейшиие действия с другими субъектами игры и их комбинаций. Задача состоит в том, чтобы у каждого колобка был уникальный характер, но в то же время у каждого из них зашиты одинаковые методы (идти, смотреть, говорить, обходить, убегать). Примеры вариативности:- Описательная часть у одного колобка может выглядеть коротко так: при появлении на горизонте лисы - убегать, при появлении зайца - поговорить. У его брата (другой объект) похожий характер, но слегка шальной - при встрече любого героя, отличного от зайца или лисы запускается рандомный метод. - У второго колобка, наоборот, при появлении на горизонте лисы - поговорить с ней (но в случае атаки - убегать), при появлении зайца - обходить стороной, если заяц движется в его сторону - перейти на бег. - У третьего колобка другой характер - говорить только в том случае, когда все остальные герои находятся рядом, в остальных случаях - убегать. И вот эта внутренняя логика у каждого колобка должна быть уникальна и зависеть от параметров-инструкций (характера), переданных при создании объекта "Колобок". Для такого рода задач вроде как используют eval, именно в данный метод можно передать строки с условиями, как мне известно. Но eval опасен, хотя в нём и содержится как раз суть того, о чём я спрашиваю: при создании объектов у каждого из них будет своя, и если того требуется - уникальная логика (характер). Т.е. нужно создать своего рода безопасную альтернативу eval, так скажем. Из описания eval MDN:if(eval(string)){ //do something }string. Строка, представленная JavaScript выражением, оператором или последовательностью операторов. Выражение может содержать переменные и свойства существующих объектов. Кстати, если я правильно понимаю, подобная магия происходит в браузере, когда он считывает html/css и рендерит их, слушает события, такие как ховер, onclick, производит на экране css анимации и т.д и т.п. и всё это происходит на основе описательных языков (html/css), не являющихся исполняемым кодом. У меня задача конечно похожая, поэтому и смотрю в сторону xml, чтобы не городить велосипед, но вот как-то надо сделать связку xml с исполняемым кодом.
Вместо использования eval для выполнения строкового кода в JavaScript, следует использовать более безопасные и надежные методы, такие как Function(), JSON.parse() или new Function(). Например:
Для создания описательного языка с уникальной логикой для каждого объекта, можно разработать специальный парсер, который будет преобразовывать данные в исполняемый код. Например, можно использовать XML для описания характеристик объектов, а затем написать парсер, который будет преобразовывать XML в JavaScript код, создающий и управляющий объектами.
В вашем случае с объектами "Колобок" и их уникальной логикой, можно создать XML файлы, описывающие характеристики каждого объекта, а затем написать парсер, который будет создавать объекты "Колобок" на основе этих XML файлов и запускать соответствующие методы в зависимости от описанных условий.
Например, XML файл для первого колобка может выглядеть так:
Затем парсер будет преобразовывать этот XML в JavaScript код, который будет создавать объект "Колобок" с уникальной логикой для каждого характера.
Это лишь один из возможных способов реализации вашей задачи, и в зависимости от сложности и требований проекта может потребоваться более сложная логика обработки данных. Надеюсь, это поможет вам приступить к решению вашей проблемы!
Вместо использования eval для выполнения строкового кода в JavaScript, следует использовать более безопасные и надежные методы, такие как Function(), JSON.parse() или new Function(). Например:
const code = "console.log('Hello, World!');";const func = new Function(code);
func();
Для создания описательного языка с уникальной логикой для каждого объекта, можно разработать специальный парсер, который будет преобразовывать данные в исполняемый код. Например, можно использовать XML для описания характеристик объектов, а затем написать парсер, который будет преобразовывать XML в JavaScript код, создающий и управляющий объектами.
В вашем случае с объектами "Колобок" и их уникальной логикой, можно создать XML файлы, описывающие характеристики каждого объекта, а затем написать парсер, который будет создавать объекты "Колобок" на основе этих XML файлов и запускать соответствующие методы в зависимости от описанных условий.
Например, XML файл для первого колобка может выглядеть так:
<Kolobok><Character>
<Condition subject="лиса">убегать</Condition>
<Condition subject="заяц">поговорить</Condition>
</Character>
</Kolobok>
Затем парсер будет преобразовывать этот XML в JavaScript код, который будет создавать объект "Колобок" с уникальной логикой для каждого характера.
Это лишь один из возможных способов реализации вашей задачи, и в зависимости от сложности и требований проекта может потребоваться более сложная логика обработки данных. Надеюсь, это поможет вам приступить к решению вашей проблемы!