Подтвердить что ты не робот

В чем разница между зеркальным отражением и традиционным отражением?

Некоторые языки, такие как Dart, используют зеркальное отражение, поэтому, в простых терминах, в чем разница между такой реализацией и традиционным отражением, как вы видите на С# или Java.

Обновление: Я нашел это превосходное (и несколько причудливое) видео Гилада Брахи на зеркальном отражении в Newspeak. http://www.hpi.uni-potsdam.de/hirschfeld/events/past/media/100105_Bracha_2010_LinguisticReflectionViaMirrors_HPI.mp4 (материал зеркала начинается в 7:42)

4b9b3361

Ответ 1

Для многих применений я не думаю, что зеркала будут отличаться от отражения Java. Самое главное, что касается зеркал, заключается в том, что они отделяют API отражения от стандартного API объекта, поэтому вместо obj.getClass() вы используете отражение (obj). Это, казалось бы, небольшая разница, но это дает вам несколько приятных вещей:

  • API-интерфейс объекта не загрязнен, и нет опасности нарушения отражения путем переопределения отражающего метода.
  • У вас могут быть разные зеркальные системы. Скажем, тот, который не разрешает доступ к закрытым методам. Это может оказаться очень полезным для инструментов.
  • Зеркальная система не обязательно должна быть включена. Для компиляции в JS это может быть важно. Если зеркала не используются, тогда нет доступа к коду вне зоны доступа, и обрезка становится жизнеспособной.
  • Зеркала могут быть созданы для работы с удаленным кодом, а не только с локальным кодом, так как вам не нужно, чтобы отраженный объект находился в том же изоляте или VM, что и зеркало.

Здесь, как зеркала отличаются от отражения в Java и Javascript при использовании методов объекта:

Java:

myObject.getClass().getMethods(); // returns an array

Dart:

reflect(myObject).type.methods; // returns a map

JavaScript:

var methods = [];
for (var m in myObject) {
  if (typeof m === 'function') {
    methods.push(m);
  }
}

Ответ 2

Лучше всего в этой статье Гилада Брача, соавтора и автора спецификации Дарта. Чтобы получить представление, этого, вероятно, будет достаточно, чтобы прочитать первую главу.

Абстрактные утверждения, что зеркала придерживаются трех необходимых принципов, за которыми не следует традиционное отражение:

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