Рефлексия в Cache


Intersystems Cache

Тема рефлексии нечасто поднималась на форумах или блогах Caché. Быть может потому, что понятие рефлексии как таковое в Caché явно не обозначено. Тем не менее рефлексия в Caché присутствует и может стать очень полезным инструментом в разработке. 

Что такое рефлексия


Понятие рефлексии или отражения означает процесс, во время которого программа может отслеживать и модифицировать собственную структуру и поведение во время выполнения.

Некоторые программы способны обрабатывать собственные конструкции как данные, выполняя рефлексивные модификации.

Рефлексивно-ориентированное программирование включает в себя самопроверку, самомодификацию и самоклонирование. Тем не менее, главное достоинство рефлексивно-ориентированной парадигмы заключается в динамической модификации программы, которая может быть определена и выполнена во время работы программы.

Данное понятие впервые ввел Brian Cantwell Smith в своей кандидатской диссертации.

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

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

Рефлексия в Caché


Как такового раздела или выделенного понятия мне так и не встретилось.
Тем не менее, некоторые функции относятся к этой замечательной теме. 
Итак, встречаем: 

$CLASSMETHOD — выполняет заданный метод класса в желаемом классе (из любой точки программы);
$CLASSNAME — возвращает имя класса;
$ISOBJECT — проверяет является ли указанное выражение объектом или нет;
$METHOD — позволяет вызвать метод у заданного экземпляра класса;
$NAME — возвращает наименование переменной;
$PROPERTY — ссылается на конкретное свойство объекта и возвращает его значение;
$PARAMETER — возвращает значение указанного параметра класса.

И отдельно хочу выделить
$XECUTE — выполняет код, переданный в виде строки, с указанными параметрами.

Вы можете почитать подробнее об этих функциях и найти примеры их использования в документации.

Пример использования: $XECUTE ("set name = ##class(Data.SampleDict1).%OpenId("_param_").Name")


т.е. мы можем любую строку выполнить как код. Все бы ничего, но не стоит забывать о безопасности. Если у нас веб приложение и в какой-либо момент подсунуть этой команде смогут строку типа “убить систему”(тут мог быть смайлик, но правила запрещают).
И не забываем, что это компиляция во время выполнения, поэтому использовать только в крайних случаях.

Остальные рефлексивные функции работают примерно так же, как и в других языках. 

Список источников:

1. Reflection (computer programming), Wikipedia 
2. Procedural reflection in programming languages, Brian Cantwell Smith 
3. The Reflection API, Oracle 
4. Caché ObjectScript Functions, Intersystems 
5. CacheJSON is a JSON encoder/decoder for Intersystems Cache

Оригинал статьи с примерами кода(для тех кому интересен Cache) здесь.
Разработано по заказу Intersystems International Corporation.

 


Связаться с нами