Article de reference

Métaobjet

En informatique , un méta-objet est un objet qui manipule, crée, décrit ou implémente des objets (y compris lui-même). L'objet auquel le méta-objet se rapporte est appelé l'obje...

En informatique , un méta-objet est un objet qui manipule, crée, décrit ou implémente des objets (y compris lui-même). L'objet auquel le méta-objet se rapporte est appelé l'objet de base. Parmi les informations qu'un méta-objet peut définir figurent le type , l'interface , la classe , les méthodes , les attributs , l'arbre d'analyse syntaxique , etc., de l'objet de base. Les méta-objets illustrent le concept de réflexion en informatique , qui permet à un système d'accéder (généralement à l'exécution) à sa propre structure interne. La réflexion permet à un système de se réécrire à la volée, de modifier son implémentation pendant son exécution.

protocole ) permettant d'accéder à la structure et au comportement des systèmes d'objets et de les manipuler. Les fonctions typiques d'un protocole de méta-objet incluent :

  • Créer ou supprimer une nouvelle classe
  • Créer une nouvelle propriété ou méthode
  • Faire en sorte qu'une classe hérite d'une autre classe (« modifier la structure de la classe »)
  • Générer ou modifier le code définissant les méthodes d'une classe

Le protocole Metaobject contrevient au principe ouvert/fermé de Bertrand Meyer , selon lequel les systèmes d'objets logiciels doivent être ouverts à l'extension mais fermés à la modification . Ce principe établit une distinction entre l'extension d'un objet par ajout et sa modification par redéfinition, considérant la première comme une qualité souhaitable (« les objets doivent être extensibles pour répondre aux besoins des cas d'utilisation futurs »), tandis que la seconde est indésirable (« les objets doivent fournir une interface stable, non sujette à des révisions intempestives »). Le protocole Metaobject, au contraire, expose de manière transparente la composition interne des objets et l'ensemble du système d'objets, directement dans le système lui-même. Concrètement, cela signifie que les programmeurs peuvent utiliser les objets pour se redéfinir, parfois de manière complexe.

De plus, le protocole de métaobjet n'est pas simplement une interface vers une implémentation « sous-jacente » ; en effet, grâce à ce protocole, le système d'objets est implémenté de manière récursive en termes d'un méta -système d'objets, qui est lui-même théoriquement implémenté en termes d'un méta -méta-système d'objets, et ainsi de suite jusqu'à ce qu'un cas de base arbitraire (un état cohérent du système d'objets) soit déterminé, le protocole étant la relation fonctionnelle récursive entre ces niveaux d'implémentation.

L'implémentation de systèmes d'objets de cette manière ouvre la voie à une refonte discrétionnaire radicale, offrant une grande flexibilité mais introduisant des problèmes de métastabilité potentiellement complexes ou difficiles à appréhender (par exemple, le système d'objets ne doit pas modifier de manière destructive son propre protocole de métaobjets – sa représentation interne – mais la destructivité potentielle de certaines mises à jour est difficile à prévoir et à raisonner), en fonction de la profondeur de récursivité de la propagation des modifications souhaitées. C'est pourquoi, lorsqu'il est présent dans un langage, le protocole de métaobjets est généralement utilisé avec parcimonie et à des fins spécialisées, comme pour les logiciels qui transforment d'autres logiciels ou eux-mêmes de manière sophistiquée, par exemple en rétro-ingénierie.

Temps d'exécution et de compilation

Lorsque la compilation n'est pas disponible à l'exécution, l'implémentation du protocole de métaobjets se complexifie. Par exemple, bien qu'il soit possible de modifier la hiérarchie des types avec un tel protocole, cela peut engendrer des problèmes pour le code compilé avec une définition de modèle de classes alternative. Certains environnements ont trouvé des solutions innovantes à ce problème, notamment en gérant les questions relatives aux métaobjets à la compilation. du Web sémantique est plus dynamique que la plupart des systèmes d'objets standard et est compatible avec les protocoles de métaobjets à l'exécution. Par exemple, dans le modèle du Web sémantique, les classes sont censées modifier leurs relations mutuelles et un moteur d'inférence spécifique , appelé classificateur, permet de valider et d'analyser l'évolution des modèles de classes.

Usage

Le premier protocole de métaobjets a été implémenté dans le langage de programmation orienté objet Smalltalk , développé au Xerox PARC . Le Common Lisp Object System (CLOS) est apparu plus tard et a été influencé par le protocole Smalltalk ainsi que par les travaux originaux de Brian C. Smith sur 3-Lisp, conçu comme une tour infinie d'évaluateurs. Contrairement au modèle Smalltalk, le modèle CLOS autorise une classe à posséder plusieurs superclasses ; ceci complexifie la résolution de la lignée de la hiérarchie des classes pour certaines instances d'objets. CLOS permet également la répartition dynamique de plusieurs méthodes , gérée par des fonctions génériques plutôt que par passage de messages comme dans la répartition unique de Smalltalk . L'ouvrage de référence décrivant la sémantique et l'implémentation du protocole de métaobjets en Common Lisp est *The Art of the Metaobject Protocol* de Gregor Kiczales et al.

Les protocoles de métaobjets sont également largement utilisés dans les applications de génie logiciel. Dans la quasi-totalité des environnements de développement intégrés, de réingénierie et de CASE commerciaux, on trouve une forme ou une autre de protocole de métaobjets permettant de représenter et de manipuler les artefacts de conception.

Un protocole de méta-objets est une façon d'implémenter la programmation orientée aspect . Plusieurs des pionniers de la programmation orientée aspect, dont Gregor Kiczales , sont devenus depuis les principaux défenseurs de cette approche. Kiczales et ses collègues de PARC ont été recrutés pour concevoir AspectJ pour Java , un langage qui ne possède pas de protocole de méta-objets natif.