Что конкретно означает самоанализ? Чем это полезно для программиста? Может кто-нибудь объяснить, пожалуйста, с точки зрения непрофессионала?
источник
Что конкретно означает самоанализ? Чем это полезно для программиста? Может кто-нибудь объяснить, пожалуйста, с точки зрения непрофессионала?
Самоанализ - это способ выяснить, что такое объект и что он содержит во время выполнения. В некоторых языках это более необходимо, чем в других. Python, который динамически типизирован (то есть объект может получать атрибуты и методы во время выполнения), использует интроспекцию, чтобы узнать текущее состояние объекта.
Вот очень упрощенный пример Python, где вы начинаете с класса и добавляете новый атрибут и, используя самоанализ, отслеживаете, какие атрибуты доступны в экземпляре объекта.
>>> class MyObject:
... variable = False
>>> instance = MyObject()
>>> dir(instance)
['__doc__', '__module__', 'variable']
>>> instance.newvariable = "Kittens"
>>> dir(instance)
['__doc__', '__module__', 'newvariable', 'variable']
Таким образом, в динамических системах вы можете использовать такие вещи, как Python, hasattr
чтобы определить, сможет ли объект делать то, что вы пытаетесь с ним сделать. Даже если вы не используете его во время выполнения, самоанализ также чрезвычайно полезен для отладки.
Теперь о библиотеках GObjects и GObject. Они в Си, а в Си ты не получаешь всю эту прелестную чушь за глупый управляемый код, ты получаешь производительность. Это означает, что встроенного самоанализа нет, а значит, сложнее поддерживать внешнюю привязку.
Привязки - это API между вещами на разных языках, которые позволяют им работать вместе. Для того чтобы это работало, вам нужен общий API, и в этом случае этот API - GObject. Но чтобы это работало, привязка вызывающей стороны должна знать, что доступно для нее. До GObject Introspection это должно было быть жестко закодировано в привязках, что означало ведение рукописного списка для каждого набора привязок.
GObject Introspection по сути предоставляет сканер, который может искать текущий источник объекта GObject, с которым вы работаете, и предоставляет вам информацию о привязке XML. Затем они обрабатываются привязками, и в результате вы получаете API, который работает постоянно.
Я, конечно, не все здесь рассмотрел, но я пытаюсь дать вам представление о двух темах (самоанализ и зачем GObjects это нужно). Если вы хотите узнать больше, на сайте Gnome есть много всего.