2008-10-13 5 views
12

Ist es möglich, die aspektorientierte Programmierung in Delphi zu machen? Ich würde mich sowohl für native Unterstützung als auch für Lösungen von Drittanbietern interessieren.AOP-Unterstützung in Delphi

Ich habe kein bestimmtes Problem, das ich mit AOP lösen möchte, aber bin einfach interessiert, AOP zu studieren.

Antwort

4

ClassHelpers in den späteren Versionen von Delphi erlauben einige sehr begrenzte AOP-Verhalten. Sie können ClassHelpers verwenden, um Verhalten in andere Klassen zu injizieren, ohne von ihnen abzusteigen. Es ermöglicht das Überschreiben vorhandener Methoden und den anschließenden Aufruf dieser vorhandenen Methode.

Die Einschränkung besteht darin, dass Sie einen ClassHelper für eine bestimmte Klasse und seine Nachkommen deklarieren müssen. Zusätzlich kann eine Klasse nur einen ClassHelper haben.

Diese ähneln den Erweiterungsmethoden in C#.

12

AOP hängt von zwei Dingen:

  • Die Fähigkeit
  • Ein Mechanismus zusätzlichen Code in eine bestehende Codeeinheit einzuspritzen Bedingungen zu setzen, wenn der Code eingespritzt werden soll.

Dies wird gemeinhin als Code Weben bezeichnet. Es ist eine Spezialisierung innerhalb der größeren Studie der Programmtransformation.

JIT-kompilierte Sprachen haben mehr Optionen zum Implementieren des Codewebens als statisch kompilierte Programme, weil mehr Informationen im Bytecode/IL erhalten bleiben. Sie unterstützen auch die Reflektion, die die Möglichkeit bietet, Code zur Laufzeit zu manipulieren.

Delphi.NET und Prism haben denselben Zugriff auf diese Funktionen wie jede andere .NET-Sprache.

Es gibt zwei AOP-Frameworks für Delphi Win32, die mir bekannt sind. Die erste ist MeAOP, die bereits erwähnt wurde. Die zweite ist Infra. Beide Projekte verfolgen einen ähnlichen Ansatz wie AOP. Sie verwenden eine Kombination aus RTTI und cleverer Zeigermanipulation, um Methodenaufrufe abzufangen, sodass Sie vor oder nach dem Methodenaufruf zusätzlichen Code ausführen können. Sie definieren Ihr übergreifendes Feature als eine Unterklasse der AOP-Klasse des Frameworks. Sie registrieren die Methoden, die abgefangen werden sollen, indem Sie den Methodennamen als Zeichenfolgenargument an das AOP-Framework übergeben.

Beide Frameworks sind noch aktiv entwickelt und sind tatsächlich größer als nur AOP. Leider ist die Dokumentation etwas spärlich (und in Infra's Fall meistens in Portugiesisch)

Ein anderes Projekt versuchte AOP durch den Quellcode, der 2004 mit etwas Erfolg zurückwebte. Im Grunde bauten sie einen Aspekt-Weber auf einem universellen Programm-Transformationstool namens DMS auf und benutzten es, um Code vor der Kompilierung in Delphi-Quelldateien einzufügen. Ihre Aspekt orientierte Sprache wurde in erster Linie von AspectJ beeinflusst.

http://www.gray-area.org/Research/GenAWeave/ enthält Links zur Originalarbeit und Präsentation sowie einige Videos zum Transformationsprozess.

Es kann auch möglich sein, Laufzeitcode-Instrumentierung zu verwenden, um dies auch zu erreichen. Es ist eine Technik, die von einigen Profilern verwendet wird, um Counter zu injizieren und Traces in den laufenden Code zu stapeln, ohne die ursprüngliche Quelle zu modifizieren. Eine ähnliche Technik könnte verwendet werden, um überschneidende Probleme in eine statisch kompilierte ausführbare Datei einzufügen. Das PinTool Projekt ist ein gutes Beispiel dafür.

+0

Für das Delphi-Prisma gibt es jetzt eine Out-of-the-Box-AOP-Unterstützung: http://prismwiki.codegear.com/en/Cirrus – Miel

+0

AOP kann auch mit einer virtuellen Schattenmethodentabelle (VMT) durchgeführt werden, Weben ist nicht möglich die einzige Option. – Johan

+0

Pflege um zu erarbeiten? –

4

Die DSharp Bibliothek Funktionen AOP: https://bitbucket.org/sglienke/dsharp

haben auch einen Blick auf TVirtualMethodInterceptor:
https://bitbucket.org/sglienke/dsharp
Weitere Informationen finden Sie unter.
Es ist in der RTL seit Delphi 2010 und ermöglicht es Ihnen, OnBefore, OnAfter, etc. Aufrufe für alle virtuellen Methoden in einer Klasse auszuführen.
Dieser Anruf allein sollte abdecken, was Sie benötigen , nicht Weben, die viel schneller als Laufzeit Weben ist.