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

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

12 голосов
/ 13 октября 2008

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

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

Ответы [ 3 ]

12 голосов
/ 21 апреля 2010

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

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

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

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

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

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

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

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

http://www.gray -area.org / Research / GenAWeave / содержит ссылки на оригинальный документ и презентацию, а также некоторые видеоролики процесса преобразования.

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

4 голосов
/ 10 июля 2013

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

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

4 голосов
/ 13 октября 2008

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

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

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

...