Чем заменить 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
290 +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 Апр в 13:20
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 648 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир