stringtranslate.com

Метаобъект

В информатике метаобъект — это объект , который манипулирует, создает, описывает или реализует объекты (включая себя). Объект, к которому относится метаобъект, называется базовым объектом. Некоторая информация, которую может определять метаобъект, включает тип базового объекта , интерфейс , класс , методы , атрибуты , дерево разбора и т. д. Метаобъекты являются примерами концепции отражения в информатике , где система имеет доступ (обычно во время выполнения) к своей собственной внутренней структуре. Отражение позволяет системе по сути переписывать себя на лету, изменять свою собственную реализацию по мере выполнения. [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 , языка, не имеющего собственного метаобъектного протокола.

Смотрите также

Ссылки

  1. ^ Смит, Брайан С. (1982-01-01). «Процедурная рефлексия в языках программирования». Технический отчет MIT (MIT-LCS-TR-272). Архивировано из оригинала 13 декабря 2015 г. Получено 16 декабря 2013 г.
  2. ^ Фут, Брайан; Ральф Джонсон (1–6 октября 1989 г.). «Рефлексивные возможности в Smalltalk-80». Труды конференции по объектно-ориентированным системам программирования, языкам и приложениям . стр. 327–335. doi : 10.1145/74877.74911 . ISBN 0897913337. Получено 16 декабря 2013 г.
  3. ^ Искусство протокола метаобъектов , Приложение C — Жизнь в круговороте
  4. ^ Фавр, Лилиана; Лилиана Мартинес; Клаудия Перейра (2009). "Обратная разработка объектно-ориентированного кода на основе MDA". Моделирование корпоративных, бизнес-процессов и информационных систем . Конспект лекций по обработке деловой информации. Том 29. Springer. С. 251–263. doi :10.1007/978-3-642-01862-6_21. ISBN 978-3-642-01861-9.
  5. ^ Чиба, Сигеру (1995). "Метаобъектный протокол для C++". Труды десятой ежегодной конференции по объектно-ориентированным системам программирования, языкам и приложениям . стр. 285–299. doi :10.1145/217838.217868. ISBN 978-0897917032. S2CID  3090058 . Получено 27 декабря 2013 г. .
  6. ^ Кнублаух, Хольгер; Оберле, Дэниел; Тетлоу, Фил; Уоллес, Эван (2006-03-09). «Учебник семантической паутины для разработчиков объектно-ориентированного программного обеспечения». W3C . Получено 2008-07-30 .
  7. ^ Дэниел П. Фридман; Митчелл Ванд (1988). «Тайна башни раскрыта: нерефлексивное описание рефлективной башни». Труды конференции ACM 1986 года по LISP и функциональному программированию — LFP '86 . стр. 298–307. doi :10.1145/319838.319871. ISBN 978-0897912006. S2CID  7974739.
  8. ^ "Интеграция объектно-ориентированного и функционального программирования" (PDF) . Получено 7 июля 2016 г.
  9. ^ Кизалес, Грегор; Джим де Ривьер; Дэниел Г. Бобров (30 июля 1991 г.). Искусство протокола метаобъектов . Издательство MIT. ISBN 978-0262610742.
  10. ^ Джонсон, Льюис; Дэвид Р. Харрис; Кевин М. Беннер; Мартин С. Фезер (октябрь 1992 г.). «Овен: Требования/Спецификация для KBSA». Римская лаборатория, окончательный технический отчет . RL-TR-92-248.
  11. ^ "The Origin of Refine" (PDF) . www.metaware.fr . Metaware White Paper. Архивировано из оригинала (PDF) 7 января 2014 г. . Получено 6 января 2014 г. .
  12. ^ "OMG's MetaObject Facility". omg.org . Object Management Group . Получено 7 января 2014 г. .

Внешние ссылки