Поддержка АОП в Delphi

Возможно ли аспектно-ориентированное программирование в Delphi? Мне была бы интересна встроенная поддержка, а также сторонние решения.

У меня нет конкретной проблемы, которую я хотел бы решить с помощью АОП, я просто заинтересован в изучении АОП.


person Miel    schedule 13.10.2008    source источник


Ответы (3)


АОП зависит от двух вещей:

  • Возможность вставлять дополнительный код в существующую единицу кода
  • Механизм для определения условий, в которые должен быть введен код.

Это обычно называют переплетением кода. Это специализация в рамках более широкого исследования трансформации программ.

У JIT-скомпилированных языков больше возможностей для реализации переплетения кода, чем у статически скомпилированных программ, потому что больше информации сохраняется в байт-коде / IL. Они также поддерживают отражение, которое дает возможность манипулировать кодом во время выполнения.

Delphi.NET и Prism имеют такой же доступ к этим возможностям, как и любой другой язык .NET.

Мне известно о двух фреймворках АОП для Delphi Win32. Первый - это MeAOP, о котором уже упоминалось. Второй - Infra. Оба проекта используют аналогичный подход к АОП. Они используют комбинацию RTTI и умных манипуляций с указателями для перехвата вызовов методов, чтобы вы могли запускать дополнительный код до или после вызова метода. Вы определяете сквозную функцию как подкласс класса АОП фреймворка. Вы регистрируете методы, которые хотите перехватить, передавая имя метода в качестве строкового аргумента в структуру AOP.

Обе структуры все еще активно развиваются и на самом деле больше по охвату, чем просто АОП. К сожалению, документация немного скудна (и в случае Infra в основном на португальском)

Еще в 2004 году в другом проекте была предпринята попытка АОП через переплетение исходного кода, но с некоторым успехом. По сути, они создали средство преобразования аспектов поверх универсального инструмента преобразования программ, называемого DMS, и использовали его для вставки кода в исходные файлы delphi перед компиляцией. На их аспектно-ориентированный язык в первую очередь повлиял AspectJ.

http://www.gray-area.org/Research/GenAWeave/ содержит ссылки к исходному документу и презентации, а также к некоторым видеороликам о процессе трансформации.

Также для этого можно использовать инструментарий кода времени выполнения. Это метод, используемый некоторыми профилировщиками для внедрения счетчиков и трассировок стека в работающий код без изменения исходного кода. Аналогичный метод можно использовать для внедрения перекрестных проблем в статически скомпилированный исполняемый файл. Хорошим примером этого является проект PinTool.

person Kenneth Cochran    schedule 21.04.2010
comment
Для призмы Delphi теперь есть готовая поддержка AOP: prismwiki.codegear.com/en/Cirrus - person Miel; 07.09.2010
comment
АОП также может быть выполнено с использованием теневой таблицы виртуальных методов (VMT), переплетение - не единственный вариант. - person Johan; 03.10.2013

ClassHelpers в более поздних версиях Delphi допускают очень ограниченный уровень поведения типа АОП. Вы можете использовать ClassHelpers для внедрения поведения в другие классы, не переходя от них. Это позволяет переопределить существующие методы, а затем, при необходимости, вызвать этот существующий метод.

Ограничение заключается в том, что вы должны объявить ClassHelper для определенного класса и его потомков. Кроме того, у класса может быть только один ClassHelper.

Они похожи на методы расширения в C #.

person Jim McKeeth    schedule 13.10.2008

Библиотека DSharp поддерживает АОП:
https://bitbucket.org/sglienke/dsharp
Дополнительную информацию можно найти по адресу: https://bitbucket.org/sglienke/dsharp

Также ознакомьтесь с TVirtualMethodInterceptor.
Он находится в RTL с Delphi 2010 и позволяет выполнять вызовы OnBefore, OnAfter и т. д. для всех виртуальных методов класса.
Один только этот вызов должен охватывать все необходимое, используя Rtti, а не ткачество, которое намного быстрее ткачества во время выполнения.

person Johan    schedule 10.07.2013