2014-09-10 2 views
0

Я хочу разрешить пользователям указывать функцию для вычисления некоторого свойства и хранить эту функцию в универсальном классе. То есть каждый экземпляр класса имеет один и тот же интерфейс, но результат вызова метода «вычислять» изменяется в зависимости от функции, предоставленной пользователем.Проанализируйте метод из строки и сохраните его в базе данных

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

class LogicalCharge < Charge 
    attr_reader :name, :type, :formula, :threshold 

    def initialize(name: nil, type: nil, formula: nil, threshold: nil) 
     super(name: name, type: type) 
     @formula = formula 
     @threshold = threshold 
    end 

    def parse(formula: nil) 

    end 

    def calculate(dimensions: nil) 
     parse(formula: formula).call(dimensions) < threshold 
    end 

Любые советы о том, как лучше всего исходить из этого?

+4

Выполнение введенного пользователем кода? Плохая, плохая идея (от безопасности POV) –

+0

Любые советы по другому подходу? – Tarlen

ответ

0

Я бы предложил другой подход, в котором у вас есть иерархия связанных классов, по одному для каждого из ваших текущих вариантов функции расчета, а также таблица с полями для имени класса и каждого из параметров его запуска.

Поскольку классы будут соответствовать одному и тому же интерфейсу, это должно работать хорошо. Затем вы можете очистить пользовательский ввод и избежать ужасных последствий для безопасности, позволяющих пользователям вводить исполняемый код непосредственно на ваш сервер.

+0

Вещь есть, у меня может быть 10+ разных вычислений, мне придется подклассы каждого и каждого? – Tarlen

+0

@Tarlen Насколько они отличаются? Если функция комплексная, то алгоритм, зависящий от переменных, имеет смысл разделиться на разные классы. Если это тот же алгоритм с разными параметрами, просто один класс и сохраните параметры в БД без имени класса. –

Смежные вопросы