среда, сентября 10, 2008

Рефлексия и взрыв мозгов

Пост 360Flex SJ 2008 - Reflective Programming by Eric Ko натолкнул меня на мысль поближе познакомиться с рефлексией (или интроспекцией) в программировании. Привлекло меня, честно говоря, "красивое" незнакомое слово. Или любопытство.

Поискав в Гугле, стало ясно, что в рунете более распространен термин "интроспекция".

Что же это за зверь? Пишут всякое:

Например: В повседневной жизни, интроспекция - это проявление самоанализа. Интроспекция основывается на изучении собственных мыслей, ощущений, мотивов и поступков. Великий философ Сократ провел большую часть своей жизни, занимаясь самоанализом и призывая своих сограждан-афинян следовать своему примеру. Он даже утверждал, что для него самого "непроанализированная жизнь не стоит существования".
В случае программирования интроспекция означает возможность изучать что-либо, чтобы определить, что это такое, что оно умеет и что может делать. Интроспекция предоставляет программистам огромные гибкость и контроль. Если вы хоть раз работали с языками программирования, которые поддерживают интроспекцию, вы, возможно, испытываете схожие чувства: "непроанализированный объект не стоит воплощения".


Взрыв мозгов: Сложность разработки программного обеспечения обусловлена когнитивными и социальными аспектами профессии. ...

Прикладное применение рефлексии в .NET: NET Reflection представляет собой классический пример некоторой низкоуровневой библиотеки, которая может быть использована при решении прикладных задач. Что же это такое?Рефлексия (ударение на последнем "и", синоним слова интроспекция), или, по-английски, reflection - система, предоставляющая выполняемому коду информацию о нем самом (взрыв мозгов №2).

Тут тоже говорят: Интроспекция (англ. Introspection) - возможность определения типов и получения описаний (метаданных) типов и интерфейсов во время выполнения программы.

Вот тут мы натыкаемся на следы интроспекции в AS3: for…in теперь не выводит свойства и методы, объявленные в классе. Он выводит лишь динамические свойства объекта. В AS3 введен более продвинутый механизм интраспекции объектов, называемый describeType. Используйте describeType для интроспекции объектов в AS3.

Превосходно! Посмотрим ка Доки:
public function describeType(value:*):XML
Ах ну конечно! Это же та самая функция, которая выдает полное описание класса в виде XML.

Кроме того, хорошая статейка Performing object introspection открывает еще один полезный для интроспекции класс mx.utils.ObjectUtil.

Поняв, в принципе, о чем речь, вернемся к исходной статье. Здесь презентация. Кроме того, можно посмотреть статью ее автора - ActionScript - Reflective Programming.

В итоге, как же применить рефлексию на практике? Для себя я отложил два применения:

1-е очевидное: Мы имеем дело с закрытой библиотекой недокументированных классов и имеем возможность исследовать их свойства и методы.

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

В общем, почва для размышлений есть.

* * *

Еще одно интересное решение недавно появилось в обсуждениях - как раз на тему "Код изучает сам себя": Определение родителя класса. Хотя тема не совсем соответствует содержанию (скорее "Определение имени класса, который вызвал метод рассматриваемого класса"), решение очень любопытное:

Если в дебаговом плеере, то можно распарсить (new Error()).getStackTrace() и получить имя класса.

Денис Коляко

К сожалению, оговорка про "дебаговый плеер" накладывает существенное ограничение на использование этого подхода...

2 комментария:

Анонимный комментирует...

getQualifiedClassName(value:*):String
getQualifiedSuperclassName(value:*):String
getDefinitionByName(name:String):Object
это всё относится к рефлексии

Racer комментирует...

Точно! Спасибо.