Вопрос

Многие языки программирования и фреймворки делают / допускают / требуют чего-то, чему я, кажется, не могу найти названия, хотя, вероятно, оно есть в информатике.Что они в основном делают, так это привязываются к переменной / объекту / классу / функции по имени.

Гибкий пример ("selectAll()"):

<mx:Button click="selectAll()" label="Select All"/>

Приятель пример ("цена"):

<Injectors target="{QuotePanel}">
  <PropertyInjector targetKey="price" source="{QuoteManager}" sourceKey="currentPrice" />
</Injectors>

Пример Java ("Foo"):

Class.forName("Foo")

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

Мой вопрос в том, как это называется? Я не думаю, что это один из этих: динамическая привязка, привязка имени, отражение

Обновить:Нет, это не викторина, извините, если это звучит как таковая.Это просто вопрос "назовите эту песню" для программирования.

Обновить:Ответы, которые помогли:

  • От Тима Лешера:Это называется "поздняя привязка", "динамическая привязка" или "привязка во время выполнения". Тот факт, что он привязывается строкой, является всего лишь деталью реализации...
  • От Конрада Рудольфа:...это просто входные данные для интерпретатора.

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

Это было полезно?

Решение

Это называется "поздняя привязка", "динамическая привязка" или "привязка во время выполнения".Тот факт, что он связывается строкой, является всего лишь деталью реализации, хотя это подразумевает, что сопоставление строки с символом существует во время выполнения (чего не предоставляют некоторые языки, такие как c ++).

"Самоанализ" или "размышление", с другой стороны, относятся к способности выяснить, какие интерфейсы, методы или атрибуты объект реализует во время выполнения.

Это правда, что динамически привязанные символы не могут быть проверены перед выполнением;это то, что отличает их от статически привязанных символов.

Другие советы

Поздняя привязка

Что заставляет тебя думать, что Class.forName разве это не отражение?

Отражение

Вещь flex можно назвать поздней привязкой, если она работает как обычный html.Пока пользователь не нажмет на кнопку, среда выполнения не потрудится определить, существует функция или нет.Вторая вещь - это внедрение зависимостей, которое включает указатели на функции (посредством интерфейсов) и отражение.Java-это определенно отражение.

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

Поздняя привязка?

Второй и третий примеры являются примерами отражения или поздней привязки, но первый пример таковым не является.

<mx:Button click="selectAll()" label="Select All"/>

Переписывается как ActionScript перед компиляцией, с selectAll() часть, помещаемая внутрь функции обработчика событий.Что-то вроде этого (как именно это делается, можно проверить, добавив -keep-generated-actionscript к флагам компилятора):

_button1 = new Button();
_button1.label = "Select All";
_button1.addEventListener("click", function( event : Event ) : void {
    selectAll();
});

Компилятор определяет, являются ли атрибуты событиями, стилями или свойствами, но поскольку это делается во время компиляции, это не является отражением.Отражение, по определению, выполняется во время выполнения.

Я думаю, можно было бы утверждать, что второй и третий примеры являются отражением, но также и то, что они являются примерами позднего связывания.Ни один из них на самом деле не определяет возможности объектов, с которыми они работают, поэтому таким образом они не являются отражением.Однако я бы сказал, что термин "отражение" очень часто используется в широком смысле для обозначения всего, что вызывает методы, имена которых определяются во время выполнения, или создает объекты из классов, названных только во время выполнения.Если вы хотите быть точным, "поздняя привязка", вероятно, самый правильный ответ, но я думаю, что "отражение" достаточно хорошо.

"самоанализ" ?

Кстати, я предполагаю, что гибкий код, который вы нам показали, использует просто вызов ActionScript, и в этом случае click атрибут был бы просто eval'd переводчиком документа Flex.Таким образом, за такого рода кодом нет никакой особой магии, это просто входные данные для интерпретатора.

Я думаю, что пример Flex не совсем такой, как в Java (не знаю других вещей).Пример Java - это явно то, что я бы назвал поздняя привязка, поскольку загрузчик классов разрешает classname во время выполнения, самое позднее возможное время для этого.

Flex MXML - это в основном другой синтаксис, который в конечном итоге компилируется во что-то, что вы могли бы также написать в ActionScript.Насколько я могу судить, кнопка mx: и функция selectAll() являются разрешен во время компиляции.По крайней мере, mxmlc выдает ошибки, если вы используете там неопределенный символ.

Существует сценарий, в котором компилятор может помочь в этом...Генерация кода.

Если тип переменной неизвестен до времени выполнения, то это поздняя привязка.Если тип переменной известен во время компиляции, то это раннее связывание.

Intellisense, завершение кода и все другие функции IDE, о которых вы говорите, доступны только для переменных с ранней привязкой.

По-моему, пахнет как указатель на функцию.

Приведенный вами пример Java называется динамической загрузкой класса.Я не уверен, что в других примерах то же самое.Но это полезно при размышлении.Возможно, вы ищете шаблон проектирования, называемый Инверсией элемента управления.

В .СЕТЕВОМ мире мы называем это привязкой к данным, и она обрабатывается с использованием отражения.

Это также сильно напоминает мне внедрение зависимостей.

Первый пример - это пример того, как xml с пространством имен может приобретать значения во время компиляции, Второй - это внедрение привязки к данным и зависимости Третий пример - Отражение, если бы мне пришлось пометить все эти 3 примера именем, я думаю, я выбрал бы "Синтаксис".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top