Сегодня нашел еще один способ как можно использовать «фишку» интерпретируемых языков — создавать и выполнять программный код в процессе работы программы.
Можно положить часть кода в базу данных.
Для чего это нужно?
Мне встретилась такая задача — писать онлайн тесты.
У каждого теста есть функция — по которой ответам пользователя ставится в соответствие — номер описания результата
и для каждого теста эта функция может быть разной. И не очень хочется при добавлении каждого нового теста изменять программный код сайта. Выход я нашел в том, чтобы хранить эту часть кода в базе данных в поле типа текст.
и теперь в месте, где нужно рассчитать результат теста пишем:
eval(@test.function)
function — это и есть ячейка в таблице БД, описывающей тесты.
при этом код просто вставляется в это место программы и выполняется, ему даже не надо передавать в качестве параметров результаты ответов пользователя, он их и так уже видит
Правда если внутри строки, передаваемой eval объявить локальную переменную, то внешняя программа ее не будет видеть (по крайней мере у меня не увидела, хотя в консоли все было ок), поэтому лучше пользоваться переменными экземпляра (instance variables) вида — @varname
Подозреваю справедливую критику со стороны любителей строгого ООП. Но приводить этот пример в согласие с ООП я не буду, если есть желание — поэкспериментируйте.
Можно положить часть кода в базу данных.
Для чего это нужно?
Мне встретилась такая задача — писать онлайн тесты.
У каждого теста есть функция — по которой ответам пользователя ставится в соответствие — номер описания результата
и для каждого теста эта функция может быть разной. И не очень хочется при добавлении каждого нового теста изменять программный код сайта. Выход я нашел в том, чтобы хранить эту часть кода в базе данных в поле типа текст.
и теперь в месте, где нужно рассчитать результат теста пишем:
eval(@test.function)
function — это и есть ячейка в таблице БД, описывающей тесты.
при этом код просто вставляется в это место программы и выполняется, ему даже не надо передавать в качестве параметров результаты ответов пользователя, он их и так уже видит
Правда если внутри строки, передаваемой eval объявить локальную переменную, то внешняя программа ее не будет видеть (по крайней мере у меня не увидела, хотя в консоли все было ок), поэтому лучше пользоваться переменными экземпляра (instance variables) вида — @varname
Подозреваю справедливую критику со стороны любителей строгого ООП. Но приводить этот пример в согласие с ООП я не буду, если есть желание — поэкспериментируйте.