Pregunta

Muchos lenguajes y marcos de programación hacen / permiten / requieren algo para lo que parece que no puedo encontrar el nombre, aunque probablemente haya uno en ciencias de la computación. Lo que hacen básicamente es unirse a una variable / objeto / clase / función por nombre.

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. Tienes la idea. Lo que me preocupa es que prácticamente no hay forma de verificar esto en tiempo de compilación, y el IDE no puede hacer mucho para ayudar en términos de finalización de código, navegación y refactorización. Pero eso está fuera del punto.

Mi pregunta es, ¿cómo se llama esto? No creo que sea uno de estos: enlace dinámico , enlace de nombre , reflexión

Actualización : No, esto no es un cuestionario, 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 `` enlace tardío '', `` enlace dinámico '' o `` enlace de tiempo de ejecución ''. El hecho de que se una por una cadena es solo un detalle de implementación ...
  • De Konrad Rudolph: ... es simplemente entrada para un intérprete .

Actualización : Como la gente ha señalado correctamente, algunos de los ejemplos son vinculantes tardíos, algunos son reflexión, algunos son evaluación de tiempo de ejecución (interpretación), etc. Sin embargo, concluyo que probablemente no haya 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ó el " todo es una cadena " respuesta, pero a pesar de que es divertido, tampoco le hace justicia completamente.

¿Fue útil?

Solución

Se llama "vinculación tardía", "vinculación dinámica" o "vinculación en tiempo de ejecución". El hecho de que se una por una cadena es solo un detalle de implementación, aunque implica que la asignación de cadena a símbolo existe en 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 tiempo de ejecución.

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

Otros consejos

Enlace tardío

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

Reflexión

La cosa flexible se puede denominar enlace tardío, si funciona como html normal. Hasta que el usuario 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 de Java es definitivamente un reflejo.

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

¿Enlace tardío?

El segundo y tercer ejemplos son ejemplos de reflexión o enlace tardío, pero el primer ejemplo no lo es.

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

Se reescribe como ActionScript antes de la compilación, con la parte selectAll () dentro de una función de controlador de eventos. Algo como esto (cómo se hace exactamente puede verificarse agregando -keep-generate-actionscript a los indicadores 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 dado que esto se hace en tiempo de compilación, no es reflejo. La reflexión, por definición, se realiza en tiempo de ejecución.

Creo que se podría argumentar que el segundo y el tercer ejemplo son una reflexión, pero también que son ejemplos de enlace tardío. Ninguno de ellos determina realmente las capacidades de los objetos en los que trabajan, de modo 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 determinen en tiempo de ejecución, o cree objetos de clases nombradas solo en tiempo de ejecución. Si quiere ser preciso " enlace tardío " es probablemente la respuesta más correcta, pero creo que "reflexión" es lo suficientemente bueno.

"introspección" ?

Por cierto, supongo que el código Flex que nos mostró usa simplemente 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, es simplemente entrada para un intérprete.

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

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

Hay un escenario en el que el compilador puede ayudar a esto ... Generación de código.

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

Intellisense, finalización de código y todas las demás características IDE de las que habla solo están disponibles en las primeras variables vinculadas.

Huele como un puntero de función para mí.

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

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

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

El primer ejemplo es un ejemplo de cómo un xml con espacio de nombres puede asumir significados en el tiempo de compilación, El segundo es una inyección de enlace de datos / dependencia El tercer ejemplo es Reflection, si tuviera que etiquetar todos estos 3 ejemplos con un nombre, creo que iré a "Syntax"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top