En informática , un metaobjeto es un objeto que manipula, crea, describe o implementa objetos (incluido él mismo). El objeto al que se refiere el metaobjeto se denomina objeto base. Parte de la información que puede definir un metaobjeto incluye el tipo , la interfaz , la clase , los métodos , los atributos , el árbol de análisis sintáctico , etc., del objeto base. Los metaobjetos son ejemplos del concepto informático de reflexión , donde un sistema tiene acceso (generalmente en tiempo de ejecución) a su propia estructura interna. La reflexión permite que un sistema se reescriba a sí mismo sobre la marcha, modificando su propia implementación durante su ejecución. [ 1 ]
Protocolo de metaobjeto
Un protocolo de metaobjeto ( MOP ) proporciona el vocabulario ( protocolo ) para acceder y manipular la estructura y el comportamiento de los sistemas de objetos. Las funciones típicas de un protocolo de metaobjeto incluyen: [ 2 ]
- Crear o eliminar una nueva clase
- Crear una nueva propiedad o método
- Hacer que una clase herede de otra clase diferente ("cambiar la estructura de la clase").
- Generar o modificar el código que define los métodos de una clase.
El protocolo Metaobject contradice el principio abierto/cerrado de Bertrand Meyer , que sostiene que los sistemas de objetos de software deben ser abiertos a la extensión pero cerrados a la modificación . Este principio establece una distinción entre extender un objeto añadiéndole funcionalidades y modificarlo redefiniéndolo, proponiendo que lo primero es deseable («los objetos deben ser extensibles para satisfacer los requisitos de futuros casos de uso»), mientras que lo segundo es indeseable («los objetos deben proporcionar una interfaz estable que no esté sujeta a revisiones sumarias»). El protocolo Metaobject, en cambio, expone de forma transparente la composición interna de los objetos y de todo el sistema de objetos en términos del propio sistema. En la práctica, esto significa que los programadores pueden usar los objetos para redefinirse a sí mismos, posiblemente de maneras bastante complejas.
Además, el protocolo de metaobjetos no es simplemente una interfaz para una implementación "subyacente"; más bien, a través del protocolo de metaobjetos, el sistema de objetos se implementa recursivamente en términos de un sistema de metaobjetos , que a su vez se implementa teóricamente en términos de un sistema de meta -metaobjetos, y así sucesivamente hasta que se determina un caso base arbitrario (un estado consistente del sistema de objetos), siendo el protocolo como tal la relación funcional recursiva entre estos niveles de implementación.
Implementar sistemas de objetos de esta manera abre la posibilidad de un rediseño discrecional radical, proporcionando una gran flexibilidad pero introduciendo problemas de metaestabilidad posiblemente complejos o difíciles de entender (por ejemplo, el sistema de objetos no debe actualizar destructivamente su propio protocolo de metaobjetos —su autorrepresentación interna—, pero la destructividad potencial de algunas actualizaciones no es trivial de predecir y puede ser difícil de razonar), dependiendo de la profundidad recursiva a la que se propagan las modificaciones deseadas. [ 3 ] Por esta razón, el protocolo de metaobjetos, cuando está presente en un lenguaje, generalmente se usa con moderación y para propósitos especializados, como software que transforma otro software o a sí mismo de maneras sofisticadas, por ejemplo, en ingeniería inversa. [ 4 ]
Tiempo de ejecución y tiempo de compilación
Cuando la compilación no está disponible en tiempo de ejecución, surgen complicaciones adicionales para la implementación del protocolo de metaobjetos. Por ejemplo, es posible cambiar la jerarquía de tipos con dicho protocolo, pero hacerlo puede causar problemas para el código compilado con una definición de modelo de clase alternativa. Algunos entornos han encontrado soluciones innovadoras para esto, por ejemplo, manejando los problemas de metaobjetos en tiempo de compilación. Un buen ejemplo de esto es OpenC++ . [ 5 ] El modelo orientado a objetos de la Web Semántica es más dinámico que la mayoría de los sistemas de objetos estándar y es consistente con los protocolos de metaobjetos en tiempo de ejecución. Por ejemplo, en el modelo de la Web Semántica se espera que las clases cambien sus relaciones entre sí y existe un motor de inferencia especial conocido como clasificador que puede validar y analizar modelos de clases en evolución. [ 6 ]
Uso
El primer protocolo de metaobjetos se implementó en el lenguaje de programación orientado a objetos Smalltalk , desarrollado en Xerox PARC . El Common Lisp Object System (CLOS) surgió posteriormente y fue influenciado por el protocolo Smalltalk, así como por los estudios originales de Brian C. Smith sobre 3-Lisp como una torre infinita de evaluadores. [ 7 ] El modelo CLOS, a diferencia del modelo Smalltalk, permite que una clase tenga más de una superclase ; esto aumenta la complejidad en cuestiones como la resolución del linaje de la jerarquía de clases en alguna instancia de objeto. CLOS también permite el despacho multimétodo dinámico , que se maneja mediante funciones genéricas en lugar de paso de mensajes como en el despacho único de Smalltalk . [ 8 ] El libro más influyente que describe la semántica y la implementación del protocolo de metaobjetos en Common Lisp es The Art of the Metaobject Protocol de Gregor Kiczales et al. [ 9 ]
Los protocolos de metaobjetos también se utilizan ampliamente en aplicaciones de ingeniería de software. En prácticamente todos los entornos CASE, de reingeniería y de desarrollo integrado comerciales, existe algún tipo de protocolo de metaobjetos para representar y manipular los artefactos de diseño. [ 10 ] [ 11 ] [ 12 ]
Un protocolo de metaobjetos es una forma de implementar la programación orientada a aspectos . Muchos de los fundadores iniciales de los MOP, incluido Gregor Kiczales , se han convertido desde entonces en los principales defensores de la programación orientada a aspectos. Kiczales y otros miembros de PARC fueron contratados para diseñar AspectJ para Java , un lenguaje que no posee un protocolo de metaobjetos nativo.
Véase también
Referencias
- ↑ Smith, Brian C (1982-01-01). "Reflexión procedimental en lenguajes de programación" . Informe técnico del MIT (MIT-LCS-TR-272). Archivado del original el 13 de diciembre de 2015. Recuperado el 16 de diciembre de 2013 .
- ↑ Foote, Brian; Ralph Johnson (1–6 de octubre de 1989). «Funciones reflexivas en Smalltalk-80» . Actas de la conferencia sobre sistemas, lenguajes y aplicaciones de programación orientada a objetos . págs. 327–335 . doi : 10.1145/74877.74911 . ISBN 0897913337Consultado el 16 de diciembre de 2013 .
- ↑ El arte del protocolo metaobjeto , Apéndice C — Vivir con circularidad
- ↑ Favre, Lilliana; Liliana Martinez; Claudia Pereira (2009). "Ingeniería inversa de código orientado a objetos basada en MDA". Modelado de sistemas empresariales, de procesos de negocio e información . Notas de clase sobre procesamiento de información empresarial. Vol. 29. Springer. pp. 251–263 . doi : 10.1007/978-3-642-01862-6_21 . ISBN 978-3-642-01861-9.
- ↑ Chiba, Shigeru (1995). "Un protocolo de metaobjetos para C++" . Actas de la décima conferencia anual sobre sistemas, lenguajes y aplicaciones de programación orientada a objetos . págs. 285–299 . doi : 10.1145/217838.217868 . ISBN 978-0897917032. S2CID 3090058 . Consultado el 27 de diciembre de 2013 .
- ↑ Knublauch, Holger; Oberle, Daniel; Tetlow, Phil; Wallace, Evan (2006-03-09). "Una introducción a la web semántica para desarrolladores de software orientados a objetos" . W3C . Recuperado el 30 de julio de 2008 .
- ↑ Daniel P. Friedman; Mitchell Wand (1988). «El misterio de la torre revelado: Una descripción no reflexiva de la torre reflectante». Actas de la conferencia ACM de 1986 sobre LISP y programación funcional - LFP '86 . págs. 298–307 . doi : 10.1145/319838.319871 . ISBN 978-0897912006. S2CID 7974739 .
- ↑ "Integración de la programación orientada a objetos y la programación funcional" (PDF) . Consultado el 7 de julio de 2016 .
- ↑ Kiczales, Gregor; Jim des Rivieres; Daniel G. Bobrow (30 de julio de 1991). El arte del protocolo metaobjeto . The MIT Press. ISBN 978-0262610742.
- ↑ Johnson, Lewis; David R. Harris; Kevin M. Benner; Martin S. Feather (octubre de 1992). "Aries: El aspecto de requisitos/especificaciones para KBSA". Informe técnico final del Laboratorio de Roma . RL-TR-92-248.
- ↑ "El origen de Refine" (PDF) . www.metaware.fr . Libro blanco de Metaware. Archivado del original (PDF) el 7 de enero de 2014. Consultado el 6 de enero de 2014 .
- ↑ "OMG's MetaObject Facility" . omg.org . Object Management Group . Consultado el 7 de enero de 2014 .
Enlaces externos
- La especificación MOP de Guile (GOOPS, basada en Tiny CLOS)
- Metaobjetos y el Protocolo de Metaobjetos
- Protocolo de metaobjetos del sistema de objetos Common Lisp (contiene dos capítulos de El arte del protocolo de metaobjetos )
- Metaprogramación en Python 2.6
- Objeto (informática)