Explorando la Reflexión y Metaprogramación en Desarrollo Software
Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 4,32 KB
Reflexión
La reflexión es una propiedad que permite representar el estado de los objetos de un sistema como entidades de primera clase, y por tanto poder observarlos, manipularlos y razonar sobre ellos como elementos básicos. Fundamentalmente hay dos tipos de reflexión: la lógica y la computacional.
Tipos de Reflexión
Reflexión Lógica
La reflexión lógica se aplica sobre los marcos formales lógicos de razonamiento, y permite a sus módulos ser accesibles como entidades de primera clase, de forma que operaciones como la composición o la transformación de módulos pueden ser definidas rigurosamente en la lógica y por tanto ser también ejecutadas.
Reflexión Computacional
Por reflexión computacional se entiende la habilidad de una entidad software de conocer o modificar su estado. A la primera forma se le denomina reflexión estructural, y a la segunda reflexión de comportamiento.
Reflexión Estructural
La reflexión estructural es la capacidad de un objeto de inspeccionar sus miembros (métodos y atributos), más la capacidad de incluso cambiarlos, en tiempo de ejecución.
Metaprogramación
La metaprogramación consiste en escribir programas que escriben o manipulan otros programas (o a sí mismos) como datos, o que hacen en tiempo de compilación parte del trabajo que, de otra forma, se haría en tiempo de ejecución. Esto permite al programador ahorrar tiempo en la producción de código.
La herramienta de metaprogramación más común es el compilador, el cual permite al programador escribir un programa relativamente corto en un lenguaje de alto nivel.
A la programación que utiliza técnicas de reflexión se le denomina metaprogramación y es la fuente de numerosos modelos de objetos que persiguen un tratamiento separado de los distintos requisitos de una aplicación. De entre todos ellos mencionaremos:
- El modelo de Filtros Composicionales de M. Aksit
- El modelo de capas LayOM de Jan Bosch
- La Programación Orientada a Aspectos de George Kiczales y el grupo de Xerox.
La Programación Orientada a Aspectos se basa en descomponer los programas en diferentes aspectos, encargándose cada uno de estos aspectos de un requisito independiente del programa (prestaciones, seguridad, concurrencia, fiabilidad), y pudiendo estar desarrollado de forma separada de los demás, incluso en lenguajes diferentes.
La metaprogramación lógica de aspectos se basa en la utilización de lenguajes metalógicos para razonar sobre aspectos, unificando el lenguaje para declarar aspectos con el lenguaje para implementar el tejedor.
La principal ventaja de utilizar hechos lógicos para declarar aspectos en vez de un lenguaje de aspectos diseñado especialmente es que las declaraciones de aspectos se pueden acceder y declarar por reglas lógicas. Esta técnica permite al usuario adaptar o extender el lenguaje de aspectos.
Metaprogramación con Marcos en C
Una forma de metaprogramación es la creación de macros para cambiar el código fuente y crear nuevas funcionalidades. Esta característica puede ser catalogada como programación generativa o metaprogramación textual. Ha sido utilizada desde los principios de C, definida como el lenguaje de macros que este utiliza.
Metaprogramación en C++ con Macros
La metaprogramación se define como codificar programas que a su vez codifican otros programas (de ahí el meta), y aunque suena un poco extraño, y se podría entender como si en Matrix las máquinas estuvieran programando programas, en realidad el uso práctico de la metaprogramación es ahorrar tiempo, mucho tiempo.
Los Quines
Los Quines son programas cuyo objetivo es imprimirse a sí mismos, es decir, una aplicación que imprime en pantalla su propio código fuente. Para muchos programadores, es un juego bastante entretenido intentar programar un quine lo más corto posible en un lenguaje determinado.
Decorador (Patrón de Diseño)
El patrón Decorator responde a la necesidad de añadir dinámicamente funcionalidad a un objeto. Esto nos permite no tener que crear sucesivas clases que hereden de la primera incorporando la nueva funcionalidad, sino otras que la implementan y se asocian a la primera.