Как это называется в информатике?

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

Пример 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 мало что может сделать, чтобы помочь с точки зрения автозавершения кода, навигации и рефакторинга. Но не в этом дело.

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

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

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

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

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


person Community    schedule 13.10.2008    source источник
comment
Может быть, вы объясните, почему вам не нравятся термины динамическое или позднее связывание. Я бы так это назвал.   -  person Michael Burr    schedule 13.10.2008
comment
Динамическое / позднее связывание, похоже, связано с полиморфизмом, в частности с решением, какой метод вызывать. Вы правы, это часть его, но, похоже, это не касается цели, поскольку то, что я ищу, также используется для установки свойств, а не только для вызова методов / функций.   -  person thvo    schedule 13.10.2008
comment
Термины «динамическое связывание» и «позднее связывание» были широко употреблены еще до начала 80-х, когда я был молодым парнем из колледжа. Они могут использоваться группой ООП для описания полиморфизма, но они определенно предшествуют тому, о чем вы говорите.   -  person Michael Burr    schedule 13.10.2008
comment
Интересно, получит ли он голоса, если я опубликую еще один ответ с поздним связыванием? ...   -  person Tomalak    schedule 13.10.2008


Ответы (15)


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

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

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

person Tim Lesher    schedule 13.10.2008

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

person Konrad Rudolph    schedule 13.10.2008
comment
Да, пример Java ЯВЛЯЕТСЯ отражением, а другие примеры могут быть реализованы ИСПОЛЬЗУЯ отражение под капотом, но слово, которое я ищу, НЕ является отражением. - person thvo; 13.10.2008
comment
Нет, я действительно не знаю ответа. Извинитесь, если это похоже на викторину. - person thvo; 13.10.2008

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

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

person Community    schedule 13.10.2008
comment
Вы правы, формулируя вопрос и находя примеры. Может, для этого нет слова. - person thvo; 13.10.2008
comment
среда выполнения {flex / html} даже не пытается найти функцию selectAll. параметр расширяется до onclick = eval (function () {selectAll ();}) IOW, его поздняя компиляция - person Javier; 13.10.2008

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

person jm.    schedule 13.10.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();
});

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

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

person Theo    schedule 19.10.2008

«самоанализ»?

person Draemon    schedule 13.10.2008

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

person Konrad Rudolph    schedule 13.10.2008
comment
На самом деле он не интерпретируется / оценивается, но переписывается во время компиляции. - person Theo; 19.10.2008

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

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

person Simon Lehmann    schedule 13.10.2008

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

person Amy B    schedule 13.10.2008

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

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

person Ricardo Villamil    schedule 13.10.2008

Я бы назвал это «Все является строкой», «Строка как универсальный тип данных» или «Злоупотребление строкой».

Служба поддержки:

http://research.microsoft.com/~emeijer/papers/xml2003/xml2003.html

http://blog.moertel.com/articles/2006/10/18/a-type-based-solution-to-the-strings-problem

http://pveentjer.wordpress.com/2006/10/11/string-is-not-a-good-universal-datatype/

http://computer-programming-languages.suite101.com/article.cfm/abused_strings_considered_harmful

person ja.    schedule 13.10.2008

Для меня пахнет указателем на функцию.

person Alan    schedule 13.10.2008

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

person Vincent Ramdhanie    schedule 13.10.2008

В мире .NET мы называем это привязкой данных, и она обрабатывается с помощью отражения.

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

person FlySwat    schedule 13.10.2008
comment
Привязка данных устанавливает свойства компонента, чтобы компонент сериализовал свои значения непосредственно в базу данных, а не задавал значения и считывал свойства внешним кодом. Хотя вопрос включает строку Select, похоже, что она не обращается к базе данных. - person Jeffrey L Whitledge; 14.10.2008
comment
Привязка данных не имеет ничего общего с базой данных. Да, вы можете ПРИВЯЗАТЬСЯ к базе данных, но вы также можете привязаться к объекту в памяти, и при привязке к базе данных, как вы думаете, что это действительно связывает? - person FlySwat; 14.10.2008

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

person kentaromiura    schedule 13.10.2008