Метаобъект - Metaobject
В Информатика, а метаобъект является объект который манипулирует, создает, описывает или реализует объекты (включая себя). Объект, к которому относится метаобъект, называется базовым объектом. Некоторая информация, которую может определять метаобъект, включает в себя базовый объект тип, интерфейс, учебный класс, методы, атрибуты, дерево синтаксического анализа и т. д. Метаобъекты являются примерами концепции информатики отражение, где система имеет доступ (обычно во время выполнения) к своей внутренней структуре. Отражение позволяет системе существенно переписывать себя на лету, изменять свою собственную реализацию по мере выполнения.[1]
Протокол метаобъектов
А протокол метаобъектов (MOP) предоставляет словарь (протокол ) для доступа и управления структурой и поведением систем объектов. Типичные функции протокола метаобъектов включают:[2]
- Создать или удалить новый курс
- Создать новое свойство или метод
- Заставить класс наследовать от другого класса («изменить структуру класса»)
- Сгенерировать или изменить код, определяющий методы класса
Протокол метаобъекта противоречит Бертрану Мейеру. открытый / закрытый принцип, который утверждает, что программные объектные системы должны быть открыт для расширения но закрыт для модификации. Этот принцип эффективно проводит различие между расширение объект, добавив к нему, и изменение объект, переопределив его, предположив, что первое является желаемым качеством ("объекты должны быть расширяемыми, чтобы соответствовать требованиям будущих вариантов использования"), а последнее нежелательно ("объекты должны обеспечивать стабильный интерфейс, не подлежащий сводной ревизииПротокол метаобъектов, напротив, прозрачно раскрывает внутренний состав объектов и всю объектную систему в терминах самой системы. На практике это означает, что программисты могут использовать объекты для переопределения себя, возможно, довольно сложными способами.
Более того, протокол метаобъектов - это не просто интерфейс к «базовой» реализации; скорее, через протокол метаобъектов объектная система рекурсивно реализовано с точки зрения мета-объектная система, которая теоретически реализуется в виде мета-метаобъектная система и так далее до произвольного базовый вариант (последовательный государственный объектной системы), причем протокол как таковой является рекурсивной функциональной связью между этими уровнями реализации.
Реализация объектных систем таким образом открывает возможность радикального дискреционного изменения дизайна, обеспечивая большую гибкость, но вводя, возможно, сложные или трудные для понимания проблемы метастабильности (например, объектная система не должна деструктивно обновить собственный протокол метаобъектов - его внутреннее самопредставление - но потенциальную деструктивность некоторых обновлений нетривиально предсказать, и о ней может быть трудно рассуждать), в зависимости от рекурсивной глубины, на которую распространяются желаемые модификации.[3] По этой причине протокол метаобъектов, когда он присутствует в языке, обычно используется экономно и для специализированных целей, таких как программное обеспечение, которое преобразует другое программное обеспечение или самого себя сложными способами, например, при обратном проектировании.[4]
Время выполнения и время компиляции
Когда компиляция недоступна во время выполнения, возникают дополнительные сложности для реализации протокола метаобъектов. Например, с помощью такого протокола можно изменить иерархию типов, но это может вызвать проблемы для кода, скомпилированного с альтернативным определением модели класса. В некоторых средах были найдены инновационные решения для этого, например, путем обработки проблем с метаобъектами во время компиляции. Хорошим примером этого является OpenC ++.[5]В Семантическая сеть объектно-ориентированная модель более динамична, чем большинство стандартных объектных систем, и совместима с протоколами метаобъектов среды выполнения. Например, в модели семантической паутины ожидается, что классы изменят свои отношения друг к другу, и существует специальный Механизм логического вывода известен как классификатор, который может проверять и анализировать развивающиеся модели классов.[6]
использование
Первый протокол метаобъектов был в Болтовня объектно-ориентированный язык программирования, разработанный в Xerox PARC. В Общая объектная система Lisp (CLOS) появился позже и на него повлиял протокол Smalltalk, а также Брайан С. Смит оригинальные исследования по 3-Лисп как бесконечная башня оценщиков.[7] Модель CLOS, в отличие от модели Smalltalk, позволяет классу иметь более одного суперкласса; это вызывает дополнительную сложность в таких вопросах, как определение происхождения иерархии классов для некоторого экземпляра объекта. CLOS также позволяет динамическая многометодная отправка, который обрабатывается через общие функции скорее, чем передача сообщений как в Smalltalk разовая отправка.[8] Самой влиятельной книгой, описывающей семантику и реализацию протокола метаобъектов в Common Lisp, является Искусство протокола метаобъектов к Грегор Кичалес и другие.[9]
Протоколы метаобъектов также широко используются в приложениях для разработки программного обеспечения. Практически во всех коммерческих CASE, реинжиниринговых и интегрированных средах разработки существует какая-то форма протокола метаобъектов для представления и управления артефактами дизайна.[10][11][12]
Протокол метаобъектов - это один из способов реализации аспектно-ориентированное программирование. Многие из первых основателей СС, включая Грегор Кичалес, с тех пор стали основными сторонниками аспектно-ориентированного программирования. Kiczales et al. из PARC были наняты для разработки AspectJ за Ява, язык, не имеющий собственного протокола метаобъектов.
Смотрите также
- Добрый (теория типов)
- Метакласс
- Javassist
- Система метаобъектов Joose JavaScript
- Мета-объектная система Moose Perl
- OpenC ++
- OpenJava
- Единый язык моделирования: UML
- Groovy
Рекомендации
- ^ Смит, Брайан С. (1 января 1982 г.). «Процедурное отражение в языках программирования». Технический отчет MIT (MIT-LCS-TR-272). Архивировано из оригинал 13 декабря 2015 г.. Получено 16 декабря 2013.
- ^ Фут, Брайан; Ральф Джонсон (1–6 октября 1989 г.). «Светоотражающие средства в Smalltalk-80». Упсла '89: 327–335. Дои:10.1145/74877.74911. ISBN 0897913337. Получено 16 декабря 2013.
- ^ Искусство протокола метаобъектов, Приложение C - Жизнь с круговоротом
- ^ Фавр, Лилиана; Лилиана Мартинес; Клаудиа Перейра (2009). Обратный инжиниринг объектно-ориентированного кода на основе MDA. Springer. Дои:10.1007/978-3-642-01862-6_21. ISBN 978-3-642-01861-9.
- ^ Чиба, Сигеру (1995). «Протокол метаобъектов для C ++». Упсла '95: 285–299. Дои:10.1145/217838.217868. ISBN 978-0897917032. Получено 27 декабря 2013.
- ^ Knublauch, Holger; Оберле, Даниэль; Тетлоу, Фил; Уоллес, Эван (2006-03-09). «Учебник по семантической паутине для разработчиков объектно-ориентированного программного обеспечения». W3C. Получено 2008-07-30.
- ^ Дэниел П. Фридман; Митчелл Уэнд (1988). «Тайна башни раскрыта». Тайна башни раскрыта: неотражающее описание отражающей башни. С. 298–307. Дои:10.1145/319838.319871. ISBN 978-0897912006.
- ^ «Интеграция объектно-ориентированного и функционального программирования» (PDF). Получено 7 июля 2016.
- ^ Кичалес, Грегор; Джим де Ривьер; Дэниел Г. Боброу (30 июля 1991 г.). Искусство протокола метаобъектов. MIT Press. ISBN 978-0262610742.
- ^ Джонсон, Льюис; Дэвид Р. Харрис; Кевин М. Беннер; Мартин С. Фезер (октябрь 1992 г.). «Овен: аспекты требований / спецификаций для KBSA». Заключительный технический отчет Римской лаборатории. RL-TR-92-248.
- ^ «Происхождение утонченности» (PDF). www.metaware.fr. Белая книга Metaware. Архивировано из оригинал (PDF) 7 января 2014 г.. Получено 6 января 2014.
- ^ «Объект OMG MetaObject». omg.org. Группа управления объектами. Получено 7 января 2014.
внешняя ссылка
- Спецификация Guile MOP (GOOPS, основанная на Tiny CLOS)
- Метаобъекты и протокол метаобъектов
- Протокол метаобъектов Common Lisp Object System (содержит две главы из Искусство протокола метаобъектов)
- Метапрограммирование Python 3