Que signifie «introspection» et comment est-elle liée à l'introspection GObject?

8

Que signifie exactement l'introspection? En quoi est-il utile pour un programmeur? Quelqu'un peut-il expliquer en termes simples?

Nishant George Agrwal
la source

Réponses:

11

L'introspection est un moyen de découvrir ce qu'est un objet et ce qu'il contient au moment de l'exécution. Dans certaines langues, cela est plus nécessaire que d'autres. Python qui est typé dynamiquement (c'est-à-dire qu'un objet peut gagner des attributs et des méthodes au moment de l'exécution) utilise l'introspection pour découvrir l'état actuel d'un objet.

Voici un exemple Python très simpliste où vous commencez avec une classe et ajoutez un nouvel attribut et, à l'aide de l'introspection, surveillez les attributs disponibles sur l'instance d'objet.

>>> class MyObject:
...   variable = False

>>> instance = MyObject()

>>> dir(instance)
['__doc__', '__module__', 'variable']

>>> instance.newvariable = "Kittens"

>>> dir(instance)
['__doc__', '__module__', 'newvariable', 'variable']

Donc, dans les systèmes dynamiques, vous pouvez utiliser des choses comme Python hasattrpour savoir si un objet sera capable de faire ce que vous essayez de faire avec. Même si vous ne l'utilisez pas au moment de l'exécution, l'introspection est également extrêmement utile pour le débogage.


Passons maintenant aux GObjects et aux bibliothèques basées sur GObject. Ils sont en C et en C, vous n'obtenez pas toutes ces belles bêtises de code managé moelleux, vous obtenez des performances. Cela signifie que l'introspection intégrée n'est pas là et cela signifie qu'il est plus difficile de maintenir une liaison externe.

Les liaisons sont une API entre des objets dans différentes langues qui leur permettent de travailler ensemble. Pour que cela fonctionne, vous avez besoin d'une API commune et dans ce cas, cette API est GObject. Mais pour que cela fonctionne, la liaison de l'appelant doit savoir ce qui est disponible. Jusqu'à GObject Introspection, cela devait être codé en dur dans les liaisons et cela signifie maintenir une liste manuscrite sur chaque ensemble de liaisons.

GObject Introspection fournit essentiellement un scanner qui peut rechercher la source actuelle du GObject avec lequel vous travaillez et vous fournit des informations de liaison XML. Ceci est ensuite traité par les liaisons et vous vous retrouvez avec une API qui fonctionne tout le temps.

Je n'ai certainement pas tout couvert ici, mais j'essaie de vous donner une idée des deux sujets (introspection et pourquoi GObjects en a besoin). Si vous voulez en savoir plus, il y en a plein sur le site Gnome.

Oli
la source