flex - etiqueta - ¿Cómo se llama esto en informática?
tags en html (17)
¿Qué te hace pensar que Class.forName
no es reflejo?
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.
Ejemplo de Flex ("selectAll ()"):
<mx:Button click="selectAll()" label="Select All"/>
Ejemplo mate ("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 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 de enlace tardío, algunos son de reflexión, algunos son de evaluación en tiempo de ejecución (interpretación), etc. Sin embargo, llegué a la conclusión de que probablemente no haya un nombre que los describa 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.
Creo que el ejemplo de Flex no es exactamente el mismo que el de Java (no conozco 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 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 () se resuelven en tiempo de compilación . Al menos mxmlc genera errores si utiliza un símbolo indefinido allí.
"introspección"?
¿Enlace tardío?
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.
El primer ejemplo es un ejemplo de cómo un xml con nombre de espacio puede asumir significados en el tiempo de compilación. El segundo es a la vez una inyección de datos / dependencia. El tercer ejemplo es Reflection, si tuviera que etiquetar todos estos 3 ejemplos con un nombre, creo que iré para "sintaxis"
En el mundo de .NET lo llamamos enlace de datos, y lo ha manejado utilizando la reflexión.
También me recuerda fuertemente a la inyección de dependencia.
Enlace tardío
Hay un escenario donde el compilador puede ayudar a esto ... Generación de código.
Huele como un puntero a mi función.
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 indicadores de función (por medio de interfaces) y reflexión. El java uno es definitivamente reflejo.
Creo que puede ser que no hayas podido expresar tu pregunta correctamente o que hayas elegido malos ejemplos para ilustrar tu pensamiento.
Por cierto, supongo que el código Flex que nos mostró utiliza simplemente la invocación de ActionScript, en cuyo caso el intérprete del documento Flex simplemente eval
el atributo de click
. Por lo tanto, no hay magia especial detrás de este tipo de código, simplemente es una entrada para un intérprete.
Reflexión
Se llama "enlace tardío", "enlace dinámico" o "enlace de tiempo de ejecución". El hecho de que se vincule 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 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.
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 el momento de la compilación, entonces es un enlace anticipado.
Intellisense, la finalización del código y todas las demás funciones IDE de las que habla están disponibles solo en las primeras variables enlazadas.
Lo llamaría "Todo es una cadena", "Cadena como tipo de datos universal" o "Abuso de cadenas".
Apoyo:
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
El segundo y el tercer ejemplo son ejemplos de reflejo 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()
metida dentro de una función de controlador de eventos. Algo así (cómo se hace exactamente se puede verificar añadiendo -keep-generated-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 como 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 podría argumentarse que el segundo y el tercer ejemplo son reflexión, pero también que son ejemplos de unió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.