Как это называется в информатике? - PullRequest
7 голосов
/ 13 октября 2008

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

Flex пример ("selectAll ()"):

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

Mate пример ("цена"):

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

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

Class.forName("Foo")

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

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

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

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

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

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

Ответы [ 17 ]

15 голосов
/ 13 октября 2008

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

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

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

7 голосов
/ 13 октября 2008

Позднее связывание

3 голосов
/ 13 октября 2008

Отражение

3 голосов
/ 13 октября 2008

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

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

3 голосов
/ 13 октября 2008

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

2 голосов
/ 19 октября 2008

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

<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();
});

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

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

2 голосов
/ 13 октября 2008

Позднее связывание?

1 голос
/ 14 октября 2008
1 голос
/ 13 октября 2008

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

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

1 голос
/ 13 октября 2008

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

...