Метаобъект
В информатике метаобъект , — это объект который манипулирует, создает, описывает или реализует объекты (включая самого себя). Объект, к которому относится метаобъект, называется базовым объектом. базового объекта Некоторая информация, которую может определить метаобъект, включает тип , интерфейс , класс , методы , атрибуты , дерево синтаксического анализа и т. д. Метаобъекты являются примерами концепции отражения в информатике , когда система имеет доступ (обычно во время выполнения) к своим своя внутренняя структура. Отражение позволяет системе по существу переписывать себя на лету, изменяя собственную реализацию по мере ее выполнения. [ 1 ]
Протокол метаобъекта
[ редактировать ]Протокол метаобъектов (MOP) предоставляет словарь ( протокол ) для доступа и управления структурой и поведением систем объектов. Типичные функции протокола метаобъекта включают в себя: [ 2 ]
- Создать или удалить новый класс
- Создайте новое свойство или метод
- Заставить класс наследовать от другого класса («изменить структуру класса»)
- Создайте или измените код, определяющий методы класса.
Протокол метаобъектов противоречит Бертрана Мейера , принципу открытости/закрытости который утверждает, что системы программных объектов должны быть открыты для расширения , но закрыты для модификации . Этот принцип фактически проводит различие между расширением объекта путем добавления к нему и модификацией объекта путем его переопределения, предполагая, что первое является желательным качеством (« объекты должны быть расширяемыми, чтобы соответствовать требованиям будущих вариантов использования »), в то время как последнее нежелательно (« объекты должны обеспечивать стабильный интерфейс, не подлежащий суммарной доработке »). Протокол метаобъектов, напротив, прозрачно раскрывает внутренний состав объектов и всей объектной системы с точки зрения самой системы. На практике это означает, что программисты могут использовать объекты для переопределения самих себя, возможно, весьма сложными способами.
Более того, протокол метаобъекта — это не просто интерфейс к «базовой» реализации; скорее, через метаобъектный протокол объектная система рекурсивно реализуется в терминах мета -метаобъектной системы, которая сама теоретически реализуется в терминах мета -метаобъектной системы, и так далее до тех пор, пока не будет получен произвольный базовый случай (непротиворечивое состояние объектной системы). ) определяется, причем протокол как таковой представляет собой рекурсивную функциональную связь между этими уровнями реализации.
Подобная реализация объектных систем открывает возможность радикального произвольного изменения конструкции, обеспечивая глубокую гибкость, но привнося, возможно, сложные или трудные для понимания проблемы метастабильности (например, объектная система не должна деструктивно обновлять свой собственный метаобъектный протокол - свое внутреннее самоопределение). представление - но потенциальную разрушительность некоторых обновлений предсказать непросто, и об этом может быть трудно рассуждать), в зависимости от рекурсивной глубины, на которую распространяются желаемые модификации. [ 3 ] По этой причине протокол метаобъектов, если он присутствует в языке, обычно используется экономно и для специализированных целей, таких как программное обеспечение, которое преобразует другое программное обеспечение или себя сложными способами, например, при обратном проектировании. [ 4 ]
Время выполнения и время компиляции
[ редактировать ]Когда компиляция недоступна во время выполнения, возникают дополнительные сложности при реализации протокола метаобъекта. Например, с помощью такого протокола можно изменить иерархию типов, но это может вызвать проблемы для кода, скомпилированного с альтернативным определением модели класса. В некоторых средах для этой цели найдены инновационные решения, например, путем обработки проблем с метаобъектами во время компиляции. Хорошим примером этого является OpenC++ . [ 5 ] Объектно -ориентированная модель семантической сети более динамична, чем большинство стандартных объектных систем, и совместима с протоколами метаобъектов среды выполнения. Например, в модели семантической сети ожидается, что классы изменят свои отношения друг с другом, и существует специальный механизм вывода, известный как классификатор, который может проверять и анализировать развивающиеся модели классов. [ 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 , языка, который не имеет собственного протокола метаобъектов.
См. также
[ редактировать ]- Вид (теория типов)
- Метакласс
- Явасист
- Система метаобъектов Joose JavaScript
- Система метаобъектов Moose Perl
- OpenJava
- Унифицированный язык моделирования : UML.
- классный
Ссылки
[ редактировать ]- ^ Смит, Брайан С. (1 января 1982 г.). «Процедурная рефлексия в языках программирования» . Технический отчет MIT (MIT-LCS-TR-272). Архивировано из оригинала 13 декабря 2015 года . Проверено 16 декабря 2013 г.
- ^ Фут, Брайан; Ральф Джонсон (1–6 октября 1989 г.). «Отражательные средства в Smalltalk-80» . Материалы конференции «Объектно-ориентированные системы, языки и приложения программирования» . стр. 327–335. дои : 10.1145/74877.74911 . ISBN 0897913337 . Проверено 16 декабря 2013 г.
- ^ Искусство протокола метаобъектов , Приложение C — Жизнь с цикличностью
- ^ Фавр, Лилиана; Лилиана Мартинес; Клаудия Перейра (2009). «Обратный инжиниринг объектно-ориентированного кода на основе MDA». Моделирование предприятия, бизнес-процессов и информационных систем . Конспекты лекций по обработке деловой информации. Том. 29. Спрингер. стр. 251–263. дои : 10.1007/978-3-642-01862-6_21 . ISBN 978-3-642-01861-9 .
- ^ Тиба, Сигэру (1995). «Протокол метаобъектов для C++» . Материалы десятой ежегодной конференции по системам, языкам и приложениям объектно-ориентированного программирования . стр. 285–299. дои : 10.1145/217838.217868 . ISBN 978-0897917032 . S2CID 3090058 . Проверено 27 декабря 2013 г.
- ^ Кнублаух, Хольгер; Оберле, Дэниел; Тетлоу, Фил; Уоллес, Эван (9 марта 2006 г.). «Учебник по семантической сети для разработчиков объектно-ориентированного программного обеспечения» . W3C . Проверено 30 июля 2008 г.
- ^ Дэниел П. Фридман; Митчелл Ванд (1988). «Тайна башни раскрыта: неотражающее описание отражающей башни». Материалы конференции ACM 1986 года по LISP и функциональному программированию - LFP '86 . стр. 298–307. дои : 10.1145/319838.319871 . ISBN 978-0897912006 . S2CID 7974739 .
- ^ «Интеграция объектно-ориентированного и функционального программирования» (PDF) . Проверено 7 июля 2016 г.
- ^ Кичалес, Грегор; Джим де Ривьер; Дэниел Дж. Боброу (30 июля 1991 г.). Искусство метаобъектного протокола . Массачусетский технологический институт Пресс. ISBN 978-0262610742 .
- ^ Джонсон, Льюис; Дэвид Р. Харрис; Кевин М. Беннер; Мартин С. Физер (октябрь 1992 г.). «Овен: аспекты требований/спецификаций для KBSA». Заключительный технический отчет Римской лаборатории . РЛ-ТР-92-248.
- ^ «Происхождение Refine» (PDF) . www.metaware.fr . Технический документ по метапрограммам. Архивировано из оригинала (PDF) 7 января 2014 года . Проверено 6 января 2014 г.
- ^ «Метаобъектная служба OMG» . омг.орг . Группа управления объектами . Проверено 7 января 2014 г.
Внешние ссылки
[ редактировать ]- Спецификация Guile MOP (GOOPS, на основе Tiny CLOS)
- Метаобъекты и протокол метаобъектов
- Протокол метаобъекта Common Lisp Object System (содержит две главы из книги «Искусство протокола метаобъекта »)
- Python 2.6 Metaprogramming