2008-10-13 2 views
12

Возможно ли реализовать ориентированное на АСП в Delphi? Меня бы интересовала поддержка на родном языке, а также сторонние решения.Поддержка AOP в Delphi

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

ответ

4

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

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

Они аналогичны методам расширения в C#.

12

АОП зависит от двух факторов:

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

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

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

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

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

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

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

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

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

+0

Для призмы Delphi есть теперь готовая поддержка AOP: http://prismwiki.codegear.com/en/Cirrus – Miel 2010-09-07 15:16:33

4

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

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