В информатике метаобъект — это объект , который манипулирует, создает, описывает или реализует объекты (включая себя). Объект, к которому относится метаобъект, называется базовым объектом. Некоторая информация, которую может определять метаобъект, включает тип базового объекта , интерфейс , класс , методы , атрибуты , дерево разбора и т. д. Метаобъекты являются примерами концепции отражения в информатике , где система имеет доступ (обычно во время выполнения) к своей собственной внутренней структуре. Отражение позволяет системе по сути переписывать себя на лету, изменять свою собственную реализацию по мере выполнения. [1]
Метаобъектный протокол (MOP) предоставляет словарь ( протокол ) для доступа и манипулирования структурой и поведением систем объектов. Типичные функции метаобъектного протокола включают: [2]
Протокол метаобъектов противоречит принципу открытости/закрытости Бертрана Мейера , который гласит, что системы программных объектов должны быть открыты для расширения, но закрыты для модификации . Этот принцип фактически проводит различие между расширением объекта путем добавления к нему и изменением объекта путем его переопределения, предполагая, что первое является желательным качеством (« объекты должны быть расширяемыми для удовлетворения требований будущих вариантов использования »), в то время как последнее нежелательно (« объекты должны предоставлять стабильный интерфейс, не подлежащий краткому пересмотру »). Протокол метаобъектов, напротив, прозрачно раскрывает внутреннюю структуру объектов и всей объектной системы с точки зрения самой системы. На практике это означает, что программисты могут использовать объекты для переопределения себя, возможно, довольно сложными способами.
Более того, метаобъектный протокол — это не просто интерфейс к «базовой» реализации; скорее, посредством метаобъектного протокола объектная система рекурсивно реализуется в терминах метаобъектной системы, которая сама теоретически реализуется в терминах метаметаобъектной системы, и так далее, пока не будет определен произвольный базовый случай (согласованное состояние объектной системы), при этом протокол как таковой представляет собой рекурсивную функциональную связь между этими уровнями реализации.
Реализация объектных систем таким образом открывает возможность для радикальной дискреционной переделки, обеспечивая глубокую гибкость, но привнося, возможно, сложные или труднопонимаемые проблемы метастабильности (например, объектная система не должна деструктивно обновлять свой собственный протокол метаобъекта — свое внутреннее самопредставление — но потенциальная деструктивность некоторых обновлений нетривиальна для прогнозирования и может быть трудно осмысленной), в зависимости от рекурсивной глубины, на которую распространяются желаемые изменения. [3] По этой причине протокол метаобъекта, когда он присутствует в языке, обычно используется экономно и для специализированных целей, таких как программное обеспечение, которое преобразует другое программное обеспечение или себя сложными способами, например, при обратном проектировании. [4]
Когда компиляция недоступна во время выполнения, возникают дополнительные сложности для реализации протокола метаобъектов. Например, можно изменить иерархию типов с помощью такого протокола, но это может вызвать проблемы для кода, скомпилированного с альтернативным определением модели класса. Некоторые среды нашли инновационные решения для этого, например, путем обработки проблем с метаобъектами во время компиляции. Хорошим примером этого является OpenC++. [5] Объектно-ориентированная модель Semantic Web более динамична, чем большинство стандартных объектных систем, и согласуется с протоколами метаобъектов времени выполнения. Например, в модели Semantic Web классы должны менять свои отношения друг с другом, и существует специальный механизм вывода, известный как классификатор, который может проверять и анализировать развивающиеся модели классов. [6]
Первый протокол метаобъектов был в объектно-ориентированном языке программирования Smalltalk , разработанном в Xerox PARC . Система объектов Common Lisp (CLOS) появилась позже и находилась под влиянием протокола Smalltalk, а также оригинальных исследований Брайана С. Смита по 3-Lisp как бесконечной башне оценщиков. [7] Модель CLOS, в отличие от модели Smalltalk, позволяет классу иметь более одного суперкласса ; это создает дополнительную сложность в таких вопросах, как разрешение происхождения иерархии классов для некоторого экземпляра объекта. CLOS также допускает динамическую многометодную диспетчеризацию , которая обрабатывается с помощью универсальных функций, а не передачи сообщений, как в одиночной диспетчеризации Smalltalk . [8] Наиболее влиятельная книга, описывающая семантику и реализацию протокола метаобъектов в Common Lisp, — «Искусство протокола метаобъектов» Грегора Кичалеса и др. [9]
Метаобъектные протоколы также широко используются в приложениях по программной инженерии. Практически во всех коммерческих средах CASE, реинжиниринга и интегрированной разработки есть некоторая форма метаобъектного протокола для представления и манипулирования артефактами дизайна. [10] [11] [12]
Метаобъектный протокол — один из способов реализации аспектно-ориентированного программирования . Многие из ранних основателей MOP, включая Грегора Кичалеса , с тех пор стали основными сторонниками аспектно-ориентированного программирования. Кичалес и др. из PARC были наняты для разработки AspectJ для Java , языка, не имеющего собственного метаобъектного протокола.