2008-10-13 3 views
12

Czy jest możliwe wykonywanie programowania zorientowanego na aspekt w Delphi? Byłbym zainteresowany rodzimym wsparciem, a także rozwiązaniami stron trzecich.Obsługa AOP w Delphi

Nie mam konkretnego problemu, który chcę rozwiązać z AOP, ale jestem po prostu zainteresowany studiowaniem AOP.

Odpowiedz

4

ClassHelpers w późniejszych wersjach Delphi pozwalają na bardzo ograniczony poziom zachowania typu AOP. Możesz użyć ClassHelpers do wstrzykiwania zachowań do innych klas bez zejścia z nich. Umożliwia nadpisanie istniejących metod, a następnie opcjonalne wywoływanie istniejącej metody.

Ograniczeniem jest zadeklarowanie ClassHelper dla określonej klasy i jej potomków. Dodatkowo klasa może mieć tylko jednego ClassHelper.

Są one podobne do metod rozszerzeń w języku C#.

12

AOP zależy od dwóch rzeczy:

  • umiejętność wstrzyknąć dodatkowy kod do istniejącej jednostki kodu
  • mechanizm umieścić warunków na którym kod należy wstrzykiwać.

Jest to powszechnie nazywane tkanie kodu. Jest to specjalizacja w szerszym badaniu transformacji programu.

Skompilowane języki JIT mają więcej opcji implementacji tkania kodu niż programy skompilowane statycznie, ponieważ więcej informacji jest przechowywanych w kodzie bajtowym/IL. Wspierają także odbicie, które oferuje możliwość manipulowania kodem w czasie wykonywania.

Delphi.NET i Prism mają taki sam dostęp do tych możliwości, jak każdy inny język .NET.

Są dwie struktury AOP dla Delphi Win32, o których jestem świadomy. Pierwsza to MeAOP, o której już wspomniano. Drugi to Infra. Oba projekty mają podobne podejście do AOP. Używają kombinacji RTTI i inteligentnej manipulacji wskaźnikami do przechwytywania wywołań metod, dzięki czemu można uruchomić dodatkowy kod przed lub po wywołaniu metody. Możesz zdefiniować swoją funkcję przekrojową jako podklasę klasy AOP ramki. Rejestrujesz metody, które chcesz przechwycić, przekazując nazwę metody jako argument łańcuchowy do struktury AOP.

Obie platformy są nadal aktywnie rozwijane i mają większy zasięg niż tylko AOP. Niestety, dokumentacja jest nieco skąpa (aw przypadku Infry głównie w języku portugalskim)

Kolejny projekt próbował AOP za pomocą kodu źródłowego, powracającego w 2004 roku z pewnym sukcesem. Zasadniczo zbudowali tkacz aspektu na uniwersalnym narzędziu do transformacji programów o nazwie DMS i użyli go do wstrzyknięcia kodu do plików źródłowych delphi przed kompilacją. Na ich język zorientowany na aspekt wpłynął przede wszystkim AspectJ.

http://www.gray-area.org/Research/GenAWeave/ zawiera linki do oryginalnego dokumentu i prezentacji, a także niektóre filmy z procesu transformacji.

Możliwe jest również użycie oprzyrządowania kodu wykonawczego, aby to osiągnąć. Jest to technika używana przez niektóre narzędzia profilujące do wstrzykiwania liczników i śledzenia stosów w uruchomionym kodzie bez modyfikowania oryginalnego źródła. Podobną technikę można zastosować do wstrzykiwania problemów przekrojowych do statycznie skompilowanego pliku wykonywalnego. Projekt PinTool jest tego dobrym przykładem.

+0

Dla pryzmatu Delphi dostępna jest natychmiastowa obsługa AOP: http://prismwiki.codegear.com/en/Cirrus – Miel

+0

AOP można również wykonać za pomocą wirtualnej tabeli metod cienia (VMT), tkactwo nie jest jedyna opcja. – Johan

+0

Chcesz opracować? –

4

DSharp funkcje biblioteczne AOP:
https://bitbucket.org/sglienke/dsharp
Więcej informacji można znaleźć na stronie: https://bitbucket.org/sglienke/dsharp

Również spojrzeć na TVirtualMethodInterceptor.
Jest w RTL od Delphi 2010 i pozwala na wykonywanie OnBefore, OnAfter, itp. Wywoła wszystkie wirtualne metody na klasie.
To połączenie powinno obejmować tylko to, czego potrzebujesz, używając: Rtti, nie tkania, które jest znacznie szybsze niż tkanie w czasie wykonywania.