2008-10-13 12 views
7

Muchos lenguajes y lenguajes de programación hacen/permiten/requieren algo para lo que no puedo encontrar el nombre, aunque probablemente haya uno en informática. Lo que básicamente hacen es vincularse a una variable/objeto/clase/función por nombre.¿Cómo se llama esto en informática?

Flex ejemplo ("selectAll()"):

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

Mate ejemplo ("precio"):

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

ejemplo de Java ("foo"):

Class.forName("Foo") 

Hay muchos otros ejemplos. Entiendes la idea. Lo que me preocupa es que prácticamente no hay forma de verificar esto en tiempo de compilación, y no mucho de lo que el IDE puede hacer para ayudar en términos de finalización del código, navegación y refactorización. Pero eso es además del punto.

Mi pregunta es, ¿cómo se llama esto? no creo que es uno de estos: dynamic binding, name binding, reflection

actualización: No, esto no es un concurso, lo siento si suena como uno. Es simplemente una cuestión de "nombrar esa canción" para programar.

actualización: Respuestas que ayudaron:

  • De Tim Lesher: Se llama "el enlace en tiempo", "enlace dinámico", o "vinculante tiempo de ejecución". El hecho de que se une mediante una cadena es solo un detalle de implementación ...
  • De Konrad Rudolph: ... es simplemente entrada para un intérprete.

actualización: Como ya se ha señalado con razón, algunos de los ejemplos son el enlace en tiempo, algunos son reflejo, algunos son tiempo de ejecución-evaluación (interpretación), etc. Sin embargo, mi conclusión es que probablemente hay un nombre que los describe a todos. Es solo un montón de ejemplos que tienen algo en común, pero no lo suficiente como para darle un nombre. Me gustó la respuesta de "todo es una cadena", pero a pesar de que es gracioso, tampoco le hace justicia por completo.

+0

Quizás pueda explicar por qué no le gustan los términos enlace dinámico o tardío. Así es como lo habría llamado. –

+0

El enlace dinámico/tardío parece estar relacionado con el polimorfismo, específicamente al decidir qué método llamar. Tienes razón, es parte de esto, pero no parece dar en el clavo, ya que lo que estoy buscando también se usa para establecer propiedades, no solo para llamar a métodos/funciones. – thvo

+0

Los términos "encuadernación dinámica" y "encuadernación tardía" eran de uso común desde antes de principios de los 80, cuando era un joven universitario. Pueden ser utilizados por la multitud de OOP para describir el polimorfismo, pero ciertamente son anteriores al uso del que estás hablando. –

Respuesta

15

Se denomina "enlace tardío", "enlace dinámico" o "enlace de tiempo de ejecución". El hecho de que se enlace mediante una cadena es solo un detalle de la implementación, aunque implica que la asignación de cadena a símbolo existe en el tiempo de ejecución (que algunos lenguajes, como C++, no proporcionan).

"Introspección" o "reflexión", por otro lado, se refieren a la capacidad de averiguar qué interfaces, métodos o atributos implementa un objeto en el tiempo de ejecución.

Es cierto que los símbolos vinculados dinámicamente no se pueden verificar antes de la ejecución; eso es lo que los hace diferentes de los símbolos vinculados estáticamente.

3

¿Qué hace que piense que Class.forName no es reflejo?

+0

Sí, el ejemplo de Java es IS reflection, y los otros ejemplos pueden implementarse UTILIZANDO la reflexión debajo del capó, pero la palabra I ' m buscando NO es reflejo. – thvo

+0

No, realmente no sé la respuesta. Discúlpate si parece una prueba. – thvo

2

¿Unión tardía?

7

el enlace en tiempo

3

Reflexión

0

En el mundo .NET llamamos a este enlace de datos, y se ha manejado mediante la reflexión.

También me recuerda mucho a la inyección de dependencia.

+0

El enlace de datos está estableciendo propiedades en un componente para que el componente serialice sus valores directamente en una base de datos en lugar de tener sus valores establecidos y leer propiedades mediante código externo. Aunque la pregunta incluye la cadena "Seleccionar", no parece estar accediendo a una base de datos. –

+0

Databinding no tiene nada que ver con una base de datos. Sí, puede vincularse a una base de datos, pero también puede vincularse a un objeto en memoria, y cuando se vincula a una base de datos, ¿qué cree que es realmente vinculante también? – FlySwat

0

Me huele como un puntero a la función.

0

El ejemplo de Java que ha dado se llama Dynamic Class Loading. No estoy seguro si los otros ejemplos son lo mismo. Pero esto es útil en la reflexión. Tal vez esté buscando el patrón de diseño llamado Inversión de control.

3

La flexión se puede denominar como enlace tardío, si funciona como html normal. Hasta que el usuario no haga clic en el botón, el tiempo de ejecución no se molestará en encontrar si la función existe o no. Lo segundo es la inyección de dependencia, que implica punteros de función (a través de Interfaces) y reflexión. El java uno definitivamente es reflejo.

Creo que es posible que no haya podido redactar correctamente su pregunta o haya elegido malos ejemplos para ilustrar su pensamiento.

+0

Tiene razón al formular la pregunta y encontrar ejemplos. Tal vez no hay una palabra para esto. – thvo

+0

el tiempo de ejecución de {flex/html} ni siquiera le importa tratar de encontrar la función selectAll. el parámetro se expande a onclick = eval ("function() {selectAll();}") IOW, su compilación tardía – Javier

1

Por cierto, supongo que el código Flex que nos mostró utiliza simplemente la invocación de ActionScript, en cuyo caso el atributo click sería simplemente eval 'd por el intérprete del documento Flex. Por lo tanto, no hay magia especial detrás de este tipo de código, simplemente es una entrada para un intérprete.

+0

Un buen punto acerca de que esto sea ingresado por un intérprete. – thvo

+0

En realidad no se interpreta/evalúa, pero se reescribe en tiempo de compilación. – Theo

0

El primer ejemplo es un ejemplo de cómo un xml espacio de nombres puede asumir significados a tiempo compilar, La segunda es a la vez una inyección de enlace de datos/dependencia El tercer ejemplo es la reflexión, si tuviera que etiquetar todas esto 3 ejemplos con una nombre Creo que iré por "Sintaxis"

1

Creo que el ejemplo de Flex no es exactamente el mismo que el de Java (no sé las otras cosas). El ejemplo de Java es claramente algo que llamaría última vinculación, porque el cargador de clases resuelve el nombre de clase en tiempo de ejecución, el último momento posible para hacer eso.

El MXML de Flex es principalmente otra sintaxis, que finalmente se compila en algo que también podría haber escrito en ActionScript. Por lo que puedo decir, el botón mx: y la función selectAll() son resueltos en el momento de la compilación. Al menos mxmlc genera errores si utiliza un símbolo indefinido allí.

1

Hay un escenario en el que el compilador puede ayudarlo ... Generación de código.

1

Si el tipo de variable no se conoce hasta el tiempo de ejecución, entonces es de enlace tardío. Si el tipo de variable se conoce en el momento de la compilación, entonces es un enlace anticipado.

Intellisense, la finalización del código y todas las otras características IDE de las que habla están disponibles solo en las variables con límite inicial.

2

Los ejemplos segundo y tercero son ejemplos de reflexión o el enlace, pero el primer ejemplo que no es .

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

se reescribe como ActionScript antes de la compilación, con la parte selectAll() está metido dentro de una función de controlador de eventos. Algo como esto (cómo se hace exactamente se puede comprobar mediante la adición de -keep-generated-actionscript a las opciones del compilador):

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

El compilador determina si los atributos son eventos, estilos o propiedades, pero ya que esta se realiza en tiempo de compilación se no es reflejo. La reflexión, por definición, se realiza en tiempo de ejecución.

Creo que podría argumentarse que el segundo y el tercer ejemplo son reflejo, pero también que son ejemplos de encuadernación tardía. Ninguno de ellos determina realmente las capacidades de los objetos con los que trabajan, por lo que no son reflejo. Sin embargo, diría que el término "reflexión" se usa muy a menudo en un sentido amplio para significar cualquier cosa que llame a métodos cuyos nombres se determinan en tiempo de ejecución, o crea objetos a partir de clases nombradas solo en tiempo de ejecución. Si quiere ser preciso, el "enlace tardío" es probablemente la respuesta más correcta, pero creo que la "reflexión" es lo suficientemente buena.