Является ли исправление обезьян / открытие классов действительно примером отражения? - PullRequest
2 голосов
/ 13 февраля 2009

Извинения за рекурсивный характер этого вопроса, но выбранный ответ на вопрос о SO заставил меня усомниться в моем понимании рефлексии.

Я думал, что рефлексия в основном касалась запросов о внутренних событиях программы во время ее работы. Пример, приведенный в этом ответе, исправляет встроенный в Ruby класс Integer.

  • Разве это больше не похоже на перегрузку / наследование функций, а не на изменение во время выполнения?
  • Действительно ли повторное открытие класса является примером отражения?

Ответы [ 2 ]

2 голосов
/ 13 февраля 2009

Отражение может использоваться для реализации позднего связывания.

Позднее связывание может быть использовано для внесения исправлений в обезьяну.

Исправление обезьяны можно использовать для достижения стиля кодирования, показанного в этом ответе.

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

Итак, технически правильно, но не (ИМХО) лучший пример.

1 голос
/ 13 февраля 2009

С риском повышения уровня рекурсии я хотел бы ответить, хотя вы ссылаетесь на мой ответ по этой ссылке.

Это недоразумение легко сделать из-за нашего интуитивного понимания рефлексии как обращения к взгляду внутрь. И это, безусловно, важный аспект рефлексии в программировании - например, в Ruby у нас есть такие методы, как instance_of, позволяющие объектам задавать вопросы о себе во время выполнения.

Но взгляните на определение отражения в Википедии :

отражение - это процесс, с помощью которого компьютерная программа может наблюдать и изменить свою собственную структуру и поведение.

Как видите, рефлексия - это больше, чем просто самопроверка во время выполнения. Это также возможность изменить поведение во время выполнения. Повторное открытие класса также называется «исправление обезьян». Вы можете прочитать больше об этом здесь .

Патч обезьяны - это способ расширить или изменить код времени выполнения из динамические языки без изменения оригинальный исходный код.

Этот процесс также упоминается как: - Партизанский ямочный ремонт - Расширение ранее объявленных классов - Открытие классов - Динамический фанк - угон - утка штамповка - метод Swizzling

...