¿Qué significa exactamente la introspección? ¿Cómo es útil para un programador? ¿Alguien puede explicar en términos simples?
fuente
¿Qué significa exactamente la introspección? ¿Cómo es útil para un programador? ¿Alguien puede explicar en términos simples?
La introspección es una forma de descubrir qué es un objeto y qué contiene en tiempo de ejecución. En algunos idiomas esto es más necesario que otros. Python, que se escribe dinámicamente (es decir, un objeto puede obtener atributos y métodos en tiempo de ejecución) usa la introspección para averiguar el estado actual de un objeto.
Aquí hay un ejemplo muy simple de Python en el que comienza con una clase y agrega un nuevo atributo y, mediante la introspección, supervisa qué atributos están disponibles en la instancia del objeto.
>>> class MyObject:
... variable = False
>>> instance = MyObject()
>>> dir(instance)
['__doc__', '__module__', 'variable']
>>> instance.newvariable = "Kittens"
>>> dir(instance)
['__doc__', '__module__', 'newvariable', 'variable']
Por lo tanto, en los sistemas dinámicos puede usar cosas como Python hasattr
para saber si un objeto podrá hacer lo que está tratando de hacer con él. Incluso si no lo usa en tiempo de ejecución, la introspección también es extremadamente útil para la depuración.
Ahora en GObjects y bibliotecas basadas en GObject. Están en C y en C no obtienes todas estas tonterías de código administrado esponjosas y encantadoras, obtienes rendimiento. Esto significa que la introspección incorporada no está allí y eso significa que es más difícil mantener un enlace externo.
Los enlaces son una API entre cosas en diferentes idiomas que les permite trabajar juntos. Para que eso funcione, necesita una API común y, en este caso, esa API es GObject. Pero para que esto funcione, el enlace de la persona que llama tiene que saber qué hay disponible. Hasta la introspección de GObject, esto tenía que estar codificado en los enlaces y eso significa mantener una lista escrita a mano en cada conjunto de enlaces.
La introspección de GObject esencialmente proporciona un escáner que puede buscar a través de la fuente actual del GObject con el que está trabajando y le proporciona información de enlace XML. Esto es procesado por los enlaces y terminas con una API que simplemente funciona, todo el tiempo.
Ciertamente no he cubierto todo aquí, pero estoy tratando de darle una idea de los dos temas (introspección y por qué GObjects lo necesitan). Si quieres saber más, hay mucho en el sitio web de Gnome.