Чем заменить 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 с исполняемым кодом.

21 Авг 2019 в 06:19
330 +1
0
Ответы
1

Вместо использования 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 код, который будет создавать объект "Колобок" с уникальной логикой для каждого характера.

Это лишь один из возможных способов реализации вашей задачи, и в зависимости от сложности и требований проекта может потребоваться более сложная логика обработки данных. Надеюсь, это поможет вам приступить к решению вашей проблемы!

20 Апр 2024 в 13:20
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир