Aspekt-orientiertes Programmieren
Im Computer, Aspekt-orientiertes Programmieren (AOP) ist ein Programmierparadigma Das zielt zu erhöhen Modularität durch Erlauben der Trennung von Übergreifende Bedenken. Dies geschieht, indem es dem vorhandenen Code ein Verhalten hinzufügt (ein Rat) ohne Ändern des Codes selbst, stattdessen separat angeben, welcher Code über a geändert wird "Pointcut"Spezifikation wie" protokollieren Sie alle Funktionsaufrufe, wenn der Name der Funktion mit 'Set beginnt'". Dies ermöglicht Verhaltensweisen, die für die nicht von zentraler Bedeutung sind Geschäftslogik (wie z. B. Protokollierung) zu einem Programm hinzugefügt werden, ohne den Codekern für die Funktionalität zu überfüllen.
AOP umfasst Programmiermethoden und -Tools, die die Modularisierung von Bedenken auf der Ebene des Quellcode unterstützen Aspektorientierte Softwareentwicklung bezieht sich auf eine ganze technische Disziplin.
Aspektorientierte Programmierung beinhaltet die Aufschlüsselung der Programmlogik in unterschiedliche Teile (sogenannte Bedenken, zusammenhängende Bereiche der Funktionalität). Fast alle Programmierparadigmen unterstützen ein gewisses Maß an Gruppierung und Verkapselung von Bedenken in separate, unabhängige Unternehmen durch Bereitstellung von Abstraktionen (z. B. Funktionen, Verfahren, Modulen, Klassen, Methoden), die zur Implementierung, Abstrahnung und Komponierung dieser Bedenken verwendet werden können. Einige Bedenken, die mehrere Abstraktionen in einem Programm "übergeschnitten" haben, und diesen Formen der Implementierung trotzen. Diese Bedenken werden genannt Übergreifende Bedenken oder horizontale Bedenken.
Protokollierung Beispielsweise ist ein Querschnittsanliegen, da eine Protokollierungsstrategie notwendigerweise jeden protokollierten Teil des Systems beeinflusst. Danach anmelden Crosscuts Alle protokollierten Klassen und Methoden.
Alle AOP -Implementierungen haben einige Kreuzungsausdrücke, die jedes Anliegen an einem Ort zusammenfassen. Der Unterschied zwischen Implementierungen liegt in der Macht, Sicherheit und der Benutzerfreundlichkeit der bereitgestellten Konstrukte. Zum Beispiel Interceptors, die die Methoden zur Ausdrücken einer begrenzten Form des Querschnitts spezifizieren, ohne viel Unterstützung für Typ-Safety oder Debugging. Aspektj hat eine Reihe solcher Ausdrücke und fördert sie in einer speziellen Klasse, eine Aspekt. Ein Aspekt kann beispielsweise das Verhalten des Basiscode (der nicht imspekte Teil eines Programms) verändern, indem sie sich bewerben Rat (zusätzliches Verhalten) bei verschiedenen Melden Sie sich an (Punkte in einem Programm) angegeben in einer Quantifizierung oder Abfrage als a Pointcut (Das erkennt, ob ein bestimmter Join Point übereinstimmt). Ein Aspekt kann auch binäre strukturelle Änderungen an anderen Klassen vornehmen, z. B. das Hinzufügen von Mitgliedern oder Eltern.
Geschichte
AOP hat mehrere direkte Antezedenzen A1 und A2:[1] Betrachtung und MetaObject -Protokolle, Subjektorientierte Programmierung, Kompositionsfilter und adaptive Programmierung.[2]
Gregor Kiczales und Kollegen bei Xerox Parc entwickelte das explizite Konzept von AOP und folgte mit dem Aspektj AOP -Erweiterung auf Java. Das Forschungsteam von IBM verfolgte einen Tool -Ansatz gegenüber einem Sprachdesign -Ansatz und 2001 vorgeschlagen Hyper/j und die Betreff der Manipulationsumgebung, die keine breite Verwendung gesehen haben.
Die Beispiele in diesem Artikel verwenden Aspektj.
Das Microsoft Transaction Server wird als erste große Anwendung von AOP angesehen, gefolgt von Enterprise Javabeans.[3][4]
Motivation und grundlegende Konzepte
Normalerweise ist ein Aspekt verstreut oder verheddert Als Code erschweren Sie es schwieriger zu verstehen und zu warten. Es wird aufgrund der Funktion (z. B. Protokollierung) verteilt, die über eine Reihe von nicht verwandten Funktionen verbreitet wird, die möglicherweise verwendet werden es ist Funktion, möglicherweise in völlig unabhängigen Systemen, unterschiedlichen Quellsprachen usw. Dies bedeutet, dass die Protokollierung alle betroffenen Module geändert werden müssen. Aspekte verheddern sich nicht nur mit der Hauptfunktion der Systeme, in denen sie ausgedrückt werden, sondern auch miteinander. Das bedeutet, dass das Ändern eines Anliegens das Verständnis aller verwickelten Bedenken oder mit einigen Mitteln hat, mit denen die Auswirkungen von Änderungen abgeleitet werden können.
Betrachten Sie beispielsweise eine Bankanwendung mit einer konzeptionell sehr einfachen Methode, um einen Betrag von einem Konto auf ein anderes zu überweisen:[5]
Leere Transfer(Konto Fromak, Konto Toacc, int Menge) Würfe Ausnahme { wenn (Fromak.Getbalance() < Menge) Wurf Neu Unzureichende Fundsexzeption(); Fromak.abheben(Menge); Toacc.Hinterlegung(Menge); }
Diese Übertragungsmethode übersieht jedoch bestimmte Überlegungen, die eine bereitgestellte Anwendung erfordern würde: Sie fehlt Sicherheitskontrollen, um zu überprüfen, ob der aktuelle Benutzer die Genehmigung zur Durchführung dieses Vorgangs hat. a Datenbanktransaktion sollte den Betrieb einkapseln, um einen versehentlichen Datenverlust zu verhindern; Für die Diagnostik sollte der Betrieb am Systemprotokoll usw. protokolliert werden.
Eine Version mit all diesen neuen Anliegen, um Beispiele für ein Beispiel zu sehen, könnte so etwas aussehen:
Leere Transfer(Konto Fromak, Konto Toacc, int Menge, Benutzer Benutzer, Logger Logger, Datenbank Datenbank) Würfe Ausnahme { Logger.die Info("Geld übertragen ..."); wenn (!isuserauthorisiert(Benutzer, Fromak)) { Logger.die Info("Der Benutzer hat keine Erlaubnis."); Wurf Neu Unbefugt(); } wenn (Fromak.Getbalance() < Menge) { Logger.die Info("Unzureichende Mittel."); Wurf Neu Unzureichende Fundsexzeption(); } Fromak.abheben(Menge); Toacc.Hinterlegung(Menge); Datenbank.Kommandosen(); // Atombetrieb. Logger.die Info("Transaktion Erfolgreich."); }
In diesem Beispiel sind andere Interessen geworden verheddert mit der grundlegenden Funktionalität (manchmal als die genannt Geschäftslogikprobleme). Transaktionen, Sicherheit und Protokollierung aller veranschaulichen Übergreifende Bedenken.
Überlegen Sie nun, was passiert, wenn wir plötzlich die Sicherheitsüberlegungen für die Anwendung ändern müssen. In der aktuellen Version des Programms werden sicherheitsrelevante Vorgänge angezeigt verstreut Bei zahlreichen Methoden und einer solchen Veränderung wären eine große Anstrengung erforderlich.
AOP-Versuche, dieses Problem zu lösen, indem der Programmierer kontrollierende Bedenken in eigenständigen Modulen zum Ausdruck bringen kann Aspekte. Aspekte können enthalten Rat (Code, der mit bestimmten Punkten im Programm verbunden ist) und Inter-Typ-Erklärungen (strukturelle Mitglieder, die zu anderen Klassen hinzugefügt wurden). Beispielsweise kann ein Sicherheitsmodul Beratung enthalten, die vor dem Zugriff auf ein Bankkonto einen Sicherheitscheck durchführen. Das Pointcut definiert die Zeiten (Melden Sie sich an) Wenn man auf ein Bankkonto zugreifen kann und der Code in der Beratungsgremium definiert, wie die Sicherheitsprüfung implementiert wird. Auf diese Weise können sowohl der Scheck als auch die Orte an einem Ort gepflegt werden. Darüber hinaus kann ein guter Pointcut spätere Programmänderungen vorhersehen. Wenn ein anderer Entwickler also eine neue Methode zum Zugriff auf das Bankkonto erstellt, gilt der Rat für die neue Methode, wenn sie ausgeführt wird.
Für das obige Beispiel für die Implementierung der Protokollierung in einem Aspekt:
Aspekt Logger { Leere Bank.Transfer(Konto Fromak, Konto Toacc, int Menge, Benutzer Benutzer, Logger Logger) { Logger.die Info("Geld übertragen ..."); } Leere Bank.GetMoneyback(Benutzer Benutzer, int Transaktions-ID, Logger Logger) { Logger.die Info("Der Benutzer hat Geld zurückgefordert."); } // Andere Querschnittscode. }
Man kann sich AOP als Debugging-Tool oder als Tool auf Benutzerebene vorstellen. Die Beratung sollte für die Fälle reserviert werden, in denen Sie die Funktion nicht ändern können (Benutzerebene)[6] oder möchten die Funktion im Produktionscode (Debugging) nicht ändern.
Beiträge von Point -Modellen
Die Ratschläge im Zusammenhang mit der Beratung einer Aspekt-orientierten Sprache definiert ein Join Point-Modell (JPM). Ein JPM definiert drei Dinge:
- Wenn der Rat laufen kann. Diese nennt man Melden Sie sich an Weil sie Punkte in einem laufenden Programm sind, bei dem zusätzliches Verhalten sinnvoll angeschlossen werden kann. Ein Join Point muss von einem gewöhnlichen Programmierer adressierbar und verständlich sein, um nützlich zu sein. Es sollte auch über in belangsequellenzielle Programmänderungen hinweg stabil sein, damit ein Aspekt über solche Änderungen hinweg stabil ist. Viele AOP -Implementierungen unterstützen Methodenausführungen und Feldreferenzen als Join -Punkte.
- Eine Möglichkeit, festzulegen (oder quantifizieren) Beiträge, genannt Pointcuts. Pointcuts bestimmen, ob ein bestimmter Join Point übereinstimmt. Die nützlichsten Pointcut -Sprachen verwenden eine Syntax wie die Basissprache (zum Beispiel, Aspektj Verwendet Java -Signaturen) und ermöglichen Sie die Wiederverwendung durch Benennung und Kombination.
- Ein Mittel, um Code an einem Join -Punkt auszuführen. Aspektj nennt das Ratund kann es vor, nach und um Juelpunkte laufen lassen. Einige Implementierungen unterstützen auch Dinge wie das Definieren einer Methode in einem Aspekt in einer anderen Klasse.
Join-Punkt-Modelle können basierend auf den exponierten Join-Punkten verglichen werden, wie die Join-Punkte angegeben werden, die an den Join Points zulässigen Operationen und die Ausdrucksstrukturverbesserungen zulässig sind.
Aspektjs Join-Punkt-Modell
- Die Join -Punkte in AspektJ umfassen Methode oder Konstruktoraufruf oder Ausführung, die Initialisierung einer Klasse oder eines Objekts, des Feldes und Schreibzugriffs, Ausnahmebehandler usw. Sie enthalten keine Schleifen, Superaufrufe, wirft Klauseln, mehrere Anweisungen usw. aus.
- Pointcuts werden durch Kombinationen von angegeben Primitive Pointcut -Designatoren (PCDs).
"Freundliche" PCDs stimmen zu einer bestimmten Art von Join-Punkt (z. B. Methodenausführung) und neigen dazu, eine Java-ähnliche Signatur als Eingabe zu betrachten. Ein solcher Pointcut sieht so aus:
Ausführung (*set*(*))
Dieser Pointcut entspricht einem Verknüpfungspunkt für Methoden und Ausmaß, wenn der Methodenname mit beginnt. "
einstellen
"Und es gibt genau ein Argument jeglicher Art."Dynamische" PCDs überprüfen Laufzeittypen und binden Variablen. Zum Beispiel,
dieser Punkt)
Dieser Pointcut stimmt überein, wenn das aktuell ausführende Objekt eine Instanz der Klasse ist
Punkt
. Beachten Sie, dass der nicht qualifizierte Name einer Klasse über Javas normaler Typ -Such -Typ verwendet werden kann."Scope" -PCDs begrenzen den lexikalischen Umfang des Join Point. Zum Beispiel:
in (com.company.*)
Dieser Pointcut entspricht jedem Join -Punkt in jedem Typ in der
com.company
Paket. Das*
ist eine Form der Wildcards, mit der viele Dinge mit einer Signatur übereinstimmen können.Pointcuts können nach Wiederverwendung komponiert und benannt werden. Zum Beispiel:
Dieser Pointcut entspricht einem Verknüpfungspunkt für Methoden und Ausmaß, wenn der Methodenname mit beginnt. "Pointcut einstellen() : Hinrichtung(* einstellen*(*) ) && Dies(Punkt) && innerhalb(com.Gesellschaft.*);
einstellen
" undDies
ist eine Instanz des TypsPunkt
in demcom.company
Paket. Es kann auf die Verwendung des Namens verwiesen werden "einstellen()
". - Ratschläge geben an, bei einem Join Point (vor, nach oder um) einen bestimmten Code (angegeben mit einem Pointcut) zu betreiben (in einer Methode angegeben wie Code angegeben). Die AOP -Laufzeit berücksichtigt automatisch Ratschläge, wenn der Pointcut mit dem Join Point übereinstimmt. Zum Beispiel:Dies gibt effektiv an: "wenn die
nach() : einstellen() { Anzeige.aktualisieren(); }
einstellen()
Pointcut entspricht dem Join Point, führen Sie den Code ausDisplay.update ()
Nach Abschluss des Join Point. "
Andere potenzielle Join Point -Modelle
Es gibt andere Arten von JPMs. Alle Beratungssprachen können in Bezug auf ihre JPM definiert werden. Zum Beispiel eine hypothetische Aspektsprache für Uml Kann das folgende JPM haben:
- Join -Punkte sind alle Modellelemente.
- Pointcuts sind eine booleale Expression, die die Modellelemente kombiniert.
- Die Mittel des Affekts an diesen Punkten sind eine Visualisierung aller übereinstimmenden Join -Punkte.
Inter-Typ-Erklärungen
Inter-Typ-Erklärungen Bieten Sie eine Möglichkeit, Kreuzungsbedenken auszudrücken, die die Struktur von Modulen beeinflussen. Auch bekannt als Offene Klassen und VerlängerungsmethodenDies ermöglicht den Programmierern, Mitglieder oder Eltern einer anderen Klasse an einem Ort zu deklarieren, in der Regel, um den gesamten Code in einem Aspekt zu kombinieren. Wenn ein Programmierer beispielsweise das Cross-Cutting-Display-Update-Problem mit den Besuchern implementiert hat, verwenden Sie eine Inter-Typ-Deklaration mit der Art des Typs Besuchermuster könnte so in Aspektj aussehen:
Aspekt DisplayUpdate { Leere Punkt.Akzeptieren(Besucher v) { v.Besuch(Dies); } // Andere Crosscutting -Code ... }
Dieser Code -Snippet fügt das hinzu Akzeptieren
Methode zur Punkt
Klasse.
Es ist eine Anforderung, dass strukturelle Ergänzungen mit der ursprünglichen Klasse kompatibel sind, so dass die Kunden der vorhandenen Klasse weiter funktionieren, sofern die AOP -Implementierung nicht alle Kunden erwarten kann, jederzeit zu steuern.
Implementierung
AOP -Programme können andere Programme auf zwei verschiedene Arten beeinflussen, abhängig von den zugrunde liegenden Sprachen und Umgebungen:
- Ein kombiniertes Programm wird produziert, in der Originalsprache gültig und von einem gewöhnlichen Programm zum ultimativen Dolmetscher nicht zu unterscheiden
- Der ultimative Dolmetscher oder die ultimative Umgebung wird aktualisiert, um AOP -Funktionen zu verstehen und zu implementieren.
Die Schwierigkeit des sich ändernden Umgebungen bedeutet, dass die meisten Implementierungen kompatible Kombinationsprogramme durch eine Art von Art von erzeugen Programmumwandlung bekannt als Weberei. Ein Aspektweber liest den Aspekt-orientierten Code und generiert einen geeigneten objektorientierten Code mit den integrierten Aspekten. Die gleiche AOP -Sprache kann durch eine Vielzahl von Webmethoden implementiert werden, sodass die Semantik einer Sprache niemals im Hinblick auf die Webenimplementierung verstanden werden sollte. Nur die Geschwindigkeit einer Implementierung und ihre einfache Bereitstellung sind beeinflusst, welche Kombinationsmethode verwendet wird.
Systeme können mit Präfrozessoren auf Quellenebene im Quellenebene implementiert werden (wie C ++ ursprünglich in der Implementierung in der Implementierung CFRONT), die Zugriff auf Programmquelldateien erfordern. Javas gut definierter binäres Formular ermöglicht es jedoch Bytecode-Webern, mit jedem Java-Programm in .Class-Dateiform zu arbeiten. Bytecode-Weber können während des Erstellungsprozesses oder, wenn das Webmodell pro Klasse ist, während des Klassenbelades bereitgestellt werden. Aspektj Begonnen mit dem Weben der Quellenebene im Jahr 2001, lieferte 2002 einen Bytecode-Weaver pro Klasse und bot nach der Integration von fortgeschrittener Ladezeitunterstützung Aspektwerk im Jahr 2005.
Jede Lösung, die Programme zur Laufzeit kombiniert, muss Ansichten bereitstellen, die sie ordnungsgemäß trennen, um das getrennte Modell des Programmierers aufrechtzuerhalten. Die Unterstützung von Java von Bytecode für mehrere Quelldateien ermöglicht es jedem Debugger, eine ordnungsgemäß gewebte .class -Datei in einem Quelleditor durchzusetzen. Einige Dekompiler von Drittanbietern können jedoch keinen gewebten Code verarbeiten, da sie eher von Javac als alle unterstützten Bytecode-Formulare erstellt werden (siehe auch § Kritik, unter).
Das Weben des Bereitstellungszeit bietet einen weiteren Ansatz.[7] Dies impliziert im Grunde die Nachbearbeitung, aber anstatt den generierten Code zu patchen, dieser Webenansatz Unterklassen Bestehende Klassen, so dass die Modifikationen durch methodenübergreifende Einführung eingeführt werden. Die vorhandenen Klassen bleiben unberührt, selbst zur Laufzeit, und alle vorhandenen Tools (Debugger, Profiler usw.) können während der Entwicklung verwendet werden. Ein ähnlicher Ansatz hat sich bereits bei der Umsetzung vieler erwiesen Java ee Anwendungsserver, wie z. IBM's WebSphere.
Terminologie
Die Standardterminologie, die in der Aspekt-orientierten Programmierung verwendet wird, kann Folgendes umfassen:
- Übergreifende Bedenken
- Zugangskontrolle[8] oder Informationsflussregelung.[9] Obwohl jede Klasse eine ganz andere primäre Funktionalität hat, ist der Code, der für die Durchführung der sekundären Funktionalität benötigt wird, häufig identisch. Obwohl die meisten Klassen in einem OO -Modell eine einzelne, spezifische Funktion ausführen, teilen sie häufig gemeinsame sekundäre Anforderungen mit anderen Klassen. Zum Beispiel möchten wir den Klassen in der Datenzugriffsschicht und auch zu Klassen in der UI-Schicht abhauen, wenn ein Thread eingeht oder eine Methode verlässt. Weitere Bedenken können mit Sicherheit wie z.
- Rat
- Dies ist der zusätzliche Code, den Sie auf Ihr vorhandenes Modell anwenden möchten. In unserem Beispiel ist dies der Protokollierungscode, den wir anwenden möchten, wenn der Thread eingeht oder eine Methode verlässt.
- Pointcut
- Dies ist der Begriff, der dem Ausführungspunkt in der Anwendung verabreicht wird, bei der das Übergangsbetrag angewendet werden muss. In unserem Beispiel wird ein Pointcut erreicht, wenn der Faden in eine Methode eingeht, und ein weiterer Pointcut wird erreicht, wenn der Faden die Methode verlässt.
- Aspekt
- Die Kombination aus dem Pointcut und dem Rat wird als Aspekt bezeichnet. Im obigen Beispiel fügen wir unserer Anwendung einen Protokollierungsaspekt hinzu, indem wir einen Pointcut definieren und den richtigen Rat geben.
Vergleich mit anderen Programmierparadigmen
Aspekte entstanden aus Objekt orientierte Programmierung und Rechenreflexion. AOP -Sprachen haben ähnliche Funktionen wie, aber eingeschränkter als MetaObject -Protokolle. Aspekte beziehen sich eng mit Programmierkonzepten wie Themen, Mischungen, und Delegation. Andere Möglichkeiten zur Verwendung von Aspekt-orientierten Programmierparadigmen umfassen Zusammensetzungsfilter und die Hyperlices sich nähern. Seit den 1970er Jahren verwenden Entwickler Formen des Abfangens und Versands, die einigen der Implementierungsmethoden für AOP ähneln, aber diese hatten nie die Semantik, dass die Querschnittsspezifikationen an einem Ort geschrieben werden.
Designer haben alternative Wege berücksichtigt, um die Trennung von Code zu erreichen, wie z. C#Teiltypen, aber solchen Ansätzen fehlt ein Quantifizierungsmechanismus, der es ermöglicht, mehrere Join -Punkte des Codes mit einer deklarativen Aussage zu erreichen.
Obwohl es nicht miteinander zu tun erscheinen mag, erfordert die Verwendung von Mocks oder Stubs beim Testen AOP -Techniken, wie um Rat und so weiter. Hier dienen die kooperierenden Objekte zum Zweck des Tests, ein Cross -Creet -Problem. Somit liefern die verschiedenen Mock -Objekt -Frameworks diese Funktionen. Beispielsweise ruft ein Prozess einen Dienst auf, um einen Gleichgewichtsbetrag zu erhalten. Bei der Prüfung des Prozesses, bei dem der Betrag von unabhängig von Bedeutung ist, ist nur der Prozess, der den Saldo gemäß den Anforderungen verwendet.
Adoptionsprobleme
Programmierer müssen in der Lage sein, Code zu lesen und zu verstehen, was passiert, um Fehler zu verhindern.[10] Selbst bei ordnungsgemäßer Ausbildung kann das Verständnis von Crosscutting -Bedenken schwierig sein, ohne dass sie sowohl die statische Struktur als auch den dynamischen Fluss eines Programms visualisiert haben.[11] Ab 2002 begann Aspektj, IDE-Plug-Ins bereitzustellen, um die Visualisierung von Crosscutting-Bedenken zu unterstützen. Diese Funktionen sowie Aspektcode helfen und Refactoring sind jetzt häufig.
Wenn ein Programmierer angesichts der Leistung von AOP einen logischen Fehler beim Ausdrücken von Querschnitt macht, kann dies zu einem weit verbreiteten Programmfehler führen. Umgekehrt kann ein anderer Programmierer die Join -Punkte in einem Programm - z. B. durch Umbenennen oder Umzugsmethoden - in einer Weise ändern, die der Aspektautor nicht erwartet hat, mit unvorhergesehene Konsequenzen. Ein Vorteil der modularisierenden Cross -Cutting -Bedenken besteht darin, einem Programmierer das gesamte System leicht zu beeinflussen. Infolgedessen sind solche Probleme als Konflikt um die Verantwortung zwischen zwei oder mehr Entwicklern für ein bestimmtes Misserfolg. Die Lösung für diese Probleme kann jedoch in Gegenwart von AOP viel einfacher sein, da nur der Aspekt geändert werden muss, während die entsprechenden Probleme ohne AOP viel verbreitet werden können.
Kritik
Die grundlegendste Kritik an der Wirkung von AOP ist, dass der Kontrollfluss verdeckt ist und dass er nicht nur schlechter ist als die vielmalig ausgerichteten GEHE ZU, ist aber tatsächlich eng analog zum Witz KOMME AUS Aussage.[11] Das Unbekanntheit der Anwendung, was für viele Definitionen von AOP von grundlegender Bedeutung ist (der fragliche Code hat keinen Hinweis darauf, dass ein Rat angewendet wird, der stattdessen im Pointcut angegeben ist), bedeutet, dass der Rat nicht sichtbar ist, im Gegensatz zu einem expliziten Methodenaufruf.[11][12] Vergleichen Sie beispielsweise das Kommen vom Programm:[11]
5 EINGANG X 10 DRUCKEN 'Ergebnis ist:' 15 DRUCKEN X 20 KOMMEN SIE AUS 10 25 X = X * X 30 RÜCKKEHR
mit einem AOP -Fragment mit analogen Semantik:
hauptsächlich() { Eingang x drucken(Ergebnis(x)) } Eingang Ergebnis(int x) { Rückkehr x } um(int x): Anruf(Ergebnis(int)) && Args(x) { int Temperatur = verlaufen(x) Rückkehr Temperatur * Temperatur }
In der Tat kann der Pointcut von der Laufzeitbedingung abhängen und daher nicht statisch deterministisch sein. Dies kann gemindert werden, aber nicht durch statische Analyse und IDE -Unterstützung gelöst werden möglicherweise passen.
Allgemeine Kritikpunkte sind, dass AOP vorgibt, "sowohl die Modularität als auch die Struktur des Code" zu verbessern, aber einige Gegensätze, die sie stattdessen diese Ziele untergraben und "unabhängige Entwicklung und Verständlichkeit von Programmen" behindert.[13] Insbesondere die Quantifizierung nach Pointcuts bricht die Modularität aus: "Man muss im Allgemeinen Kenntnisse des gesamten Programms haben, um die dynamische Ausführung eines Aspekt-orientierten Programms zu begründen."[14] Während seine Ziele (modularisierende Kreuzungsbedenken) gut verstanden sind, ist seine tatsächliche Definition unklar und unterscheidet sich nicht klar von anderen gut etablierten Techniken.[13] Übergreifende Bedenken werden möglicherweise gegenseitig geschnitten, was einen Auflösungsmechanismus erfordern, wie z. B. Ordnung.[13] In der Tat können Aspekte für sich selbst gelten, was zu Problemen wie der führen kann Lügnerparadox.[15]
Zu den technischen Kritikpunkten gehört, dass die Quantifizierung von Pointcuts (definieren, wo Ratschläge ausgeführt werden) "äußerst empfindlich gegenüber Änderungen im Programm" ist, was als die bekannt ist fragiles Pointcut -Problem.[13] Die Probleme mit Pointcuts gelten als unlösbar: Wenn man die Quantifizierung von Pointcuts durch explizite Anmerkungen ersetzt, erhält man eine Attributorientierte Programmierung Stattdessen ist dies einfach ein expliziter Unterroutine -Aufruf und leidet unter dem identischen Problem der Streuung, dass AOP für die Lösung von AOP entwickelt wurde.[13]
Implementierungen
Folgende Programmiersprachen haben AOP, innerhalb der Sprache oder als externe Bibliothek implementiert:
- .NET Framework Sprachen (C# / Vb.net)[16]
- Aktionen[17]
- Ada[18]
- Autohotkey[19]
- C / C ++[20]
- Cobol[21]
- Das Kakao Ziel c Frameworks[22]
- Coldfusion[23]
- Common Lisp[24]
- Delphi[25][26][27]
- Delphi Prism[28]
- e (IEEE 1647)
- EMACS Lisp[29]
- Groovig
- Haskell[30]
- Java[31]
- JavaScript[32]
- Logtalk[33]
- Lua[34]
- machen[35]
- Matlab[36]
- Ml[37]
- Nemerle[38]
- Perl[39]
- Php[40]
- Prolog[41]
- Python[42]
- Schläger[43]
- Rubin[44][45][46]
- Quietschen Smalltalk[47][48]
- UML 2.0[49]
- Xml[50]
Siehe auch
- Verteilt AOP
- Grammatik zuschreiben, ein Formalismus, der für eine Aspekt-orientierte Programmierung auf dem neuesten Stand verwendet werden kann Funktionale Programmiersprachen
- Programmierparadigmen
- Subjektorientierte Programmierung, eine Alternative zu Aspekt-orientiertem Programmieren
- Rollenorientierte Programmierung, eine Alternative zu Aspekt-orientiertem Programmieren
- Prädikatversand, eine ältere Alternative zu Aspekt-orientiertem Programmieren
- Ausführbar uml
- Dekorateurmuster
- Domänengetriebenes Design
Notizen und Referenzen
- ^ Kiczales, G.; Lamping, J.; Mendhekar, a.; Maeda, C.; Lopes, C.; Loingtier, J. M.; Irwin, J. (1997). Aspekt-orientiertes Programmieren (PDF). Ecoop'97. Verfahren der 11. Europäischen Konferenz über objektorientierte Programmierung. Lncs. Vol. 1241. S. 220–242. Citeseerx 10.1.1.115.8660. doi:10.1007/bfb0053381. ISBN 3-540-63089-9. Archiviert (PDF) Aus dem Original am 12. Januar 2016.
- ^ "Adaptive objektorientierte Programmierung: Der Demeter -Ansatz mit Ausbreitungsmustern" Karl Liebherr 1996 ISBN0-534-94602-X präsentiert eine gut gearbeitete Version von im Wesentlichen dasselbe (Lieberherr hat dies anschließend erkannt und seinen Ansatz umgebaut).
- ^ Don Box; Chris verkauft (4. November 2002). Essential.net: Die gemeinsame Sprachlaufzeit. Addison-Wesley Professional. p.206. ISBN 978-0-201-73411-9. Abgerufen 4. Oktober 2011.
- ^ Roman, ed; Sriganesh, Rima Patel; Brose, Gerald (1. Januar 2005). Mastering Enterprise Javabeans. John Wiley und Söhne. p. 285. ISBN 978-0-7645-8492-3. Abgerufen 4. Oktober 2011.
- ^ HINWEIS: Die Beispiele in diesem Artikel erscheinen in einer Syntax, die dem der der der der Java Sprache.
- ^ "gnu.org". www.gnu.org. Archiviert Aus dem Original am 24. Dezember 2017. Abgerufen 5. Mai 2018.
- ^ "Archivierte Kopie" (PDF). Archiviert von das Original (PDF) am 8. Oktober 2005. Abgerufen 19. Juni 2005.
{{}}
: CS1 Wartung: Archiviertes Kopie als Titel (Link) - ^ B. de Win, B. VanHaute und B. de Decker. "Sicherheit durch Aspekt-orientierte Programmierung". Im Fortschritte im Netzwerk und verteilte Systeme Sicherheit (2002).
- ^ T. Pasquier, J. Bacon und B. Shand. "FLOWR: Aspektorientierte Programmierung zur Informationsflussregelung in Ruby". Im ACM -Verfahren der 13. Internationalen Konferenz über Modularität (Aspektorientierte Softwareentwicklung) (2014).
- ^ Edsger Dijkstra, Anmerkungen zur strukturierten Programmierung Archiviert 2006-10-12 im Wayback -Maschine, pg. 1-2
- ^ a b c d Konstantiniden, Konstantinos; Skotiniotis, Therapon; Störzer, Maximilian (September 2004). AOP als schädlich angesehen (PDF). Europäischer interaktiver Workshop zu Aspekten in der Software (EIWAS). Berlin, Deutschland. Archiviert (PDF) Aus dem Original am 23. März 2016. Abgerufen 5. Mai 2018.
- ^ C2: Komm
- ^ a b c d e Steimann, F. (2006). "Der paradoxe Erfolg der Aspekt-orientierten Programmierung". ACM Sigplan nennt. 41 (10): 481–497. Citeseerx 10.1.1.457.2210. doi:10.1145/1167515.1167514., (Folien Archiviert 2016-03-04 bei der Wayback -Maschine,Folien 2 Archiviert 2015-09-23 bei der Wayback -Maschine, abstrakt Archiviert 2015-09-24 bei der Wayback -Maschine), Friedrich Steimann, Gary T. Leavens, Oopsla 2006
- ^ "Modularere Argumentation für Aspekt-orientierte Programme". Archiviert Aus dem Original am 12. August 2015. Abgerufen 11. August 2015.
- ^ "AOP und die Antinomie des Lügner" (PDF). Fernuni-Hagen.de. Archiviert (PDF) Aus dem Original am 9. August 2017. Abgerufen 5. Mai 2018.
- ^ Zahlreich:Nachträglich Archiviert 2016-03-15 in der Wayback -Maschine, Loom.net Archiviert 2008-08-27 bei der Wayback -Maschine, Enterprise Library 3.0 Policy Injection Application Block Archiviert 2007-01-19 im Wayback -Maschine, Aspektdng Archiviert 2004-09-29 bei der Wayback -Maschine, Dynamicproxy Archiviert 2015-12-05 in der Wayback -Maschine, Komponieren* Archiviert 2005-08-21 bei Wikiwix, Postsharp Archiviert 2016-05-03 bei der Wayback -Maschine, Seasar.net Archiviert 2006-07-25 in der Wayback -Maschine, Dotspiew (. Archiviert 2006-03-31 am Wayback -Maschine, Spring.net Archiviert 2006-04-02 im Wayback -Maschine (als Teil seiner Funktionalität), Wicca und Phx.morph Archiviert 2006-12-07 am Wayback -Maschine, Sollwert Archiviert 2008-10-07 bei der Wayback -Maschine
- ^ "Willkommen bei AS3-Commons-Bytecode". As3commons.org. Archiviert Aus dem Original am 3. Oktober 2014. Abgerufen 5. Mai 2018.
- ^ "ADA2012 Begründung" (PDF). Adacore.com. Archiviert (PDF) Aus dem Original am 18. April 2016. Abgerufen 5. Mai 2018.
- ^ "Funktionshaken". Autohotkey.com. Archiviert von das Original am 17. Januar 2013. Abgerufen 5. Mai 2018.
- ^ Mehrere: Aspektc ++, Featurec ++, Aspekt Archiviert 2006-08-21 im Wayback -Maschine, Aspektorientiert c Archiviert 2008-11-20 bei der Wayback -Maschine, Aspicee
- ^ "Kopfsteinpflaster". Vub.ac.be. Abgerufen 5. Mai 2018.[Permanent Dead Link]
- ^ "Aspektcocoa". neu.edu. Archiviert von das Original am 26. Oktober 2007. Abgerufen 5. Mai 2018.
- ^ "Coldspring Framework: Willkommen". 5. November 2005. Archiviert vom Original am 5. November 2005. Abgerufen 5. Mai 2018.
{{}}
: CS1 Wartung: Bot: Original -URL -Status unbekannt (Link) - ^ "Näheres Projekt: Aspekt". Archiviert Aus dem Original am 23. Februar 2011. Abgerufen 11. August 2015.
- ^ "Infra - Frameworks Integrados Para Delphi - Google Project Hosting". Archiviert Aus dem Original am 9. September 2015. Abgerufen 11. August 2015.
- ^ "Meaop - MESDK: MeObjects, Mertti, Meaop - Delphi AOP (Aspektorientierte Programmierung), Meremote, Meservice ... - Google Project Hosting". Archiviert Aus dem Original am 10. September 2015. Abgerufen 11. August 2015.
- ^ "Google Project Hosting". Archiviert vom Original am 25. Dezember 2014. Abgerufen 11. August 2015.
- ^ "Remobjects Cirrus". codegear.com. Archiviert von das Original am 23. Januar 2012. Abgerufen 5. Mai 2018.
- ^ "EMACS -Beratungsfunktionen". gnu.org. Archiviert Aus dem Original am 24. Oktober 2011. Abgerufen 5. Mai 2018.
- ^ Monaden Ermöglichen Sie, dass die Programmsemantik geändert wird, indem der Typ des Programms geändert wird, ohne seinen Code zu ändern: De Meuter, Wolfgang (1997). "Monaden als theoretische Grundlage für AOP". Internationaler Workshop zu Aspekt-orientiertem Programmieren bei ECOOP: 25. Citeseerx 10.1.1.25.8262. Tabareau, Nicolas; Figueroa, Ismael; Tanter, Éric (März 2013). "Eine typisierte monadische Einbettung von Aspekten". Proceedings der 12. jährlichen internationalen Konferenz zur Aspekt-orientierten Softwareentwicklung. AOSD '13: 171–184. doi:10.1145/2451436.2451457. ISBN 9781450317665. S2CID 27256161. Geben Sie Klassen ein Ermöglichen Sie, dass zusätzliche Funktionen zu einem Typ hinzugefügt werden: Sulzmann, Martin; Wang, Meng (März 2007). "Aspekt-orientiertes Programmieren mit Typklassen". Verfahren des 6. Workshops zu Grundlagen von Aspekt-orientierten Sprachen: 65–74. doi:10.1145/1233833.1233842. ISBN 978-1595936615. S2CID 3253858..
- ^ Zahlreiche andere: Caesarj Archiviert 2008-12-19 bei der Wayback -Maschine, Komponieren* Archiviert 2005-08-21 bei Wikiwix, Dynaop Archiviert 2007-07-24 bei der Wayback -Maschine, JAC Archiviert 2004-06-19 im Wayback -Maschine, Google Guice (als Teil seiner Funktionalität), Javassist Archiviert 2004-09-01 am Wayback -Maschine, Jasco (und beeindruckt) Archiviert 2005-04-11 im Wayback -Maschine, Jaml Archiviert 2005-04-15 im Wayback -Maschine, Jboss AOP Archiviert 2006-10-17 im Wayback -Maschine, Logicaj Archiviert 2006-05-04 im Wayback -Maschine, Objektteams Archiviert 2005-08-31 am Wayback -Maschine, PROSA Archiviert 2007-01-24 bei der Wayback -Maschine, Der Aspektbench -Compiler für Aspektj (ABC) Archiviert 2014-12-16 bei der Wayback -Maschine, Federgerüst (als Teil seiner Funktionalität), Seasar, Das JMangler -Projekt Archiviert 2005-10-28 bei der Wayback -Maschine, Injectj Archiviert 2005-04-05 am Wayback -Maschine, Gluonj Archiviert 2007-02-06 am Wayback -Maschine, Dampfraum Archiviert 2007-08-18 im Wayback -Maschine
- ^ Viele: Ratsam Archiviert 2008-07-04 im Wayback -Maschine, AjaxPect Archiviert 2016-07-09 bei der Wayback -Maschine, JQuery AOP -Plugin Archiviert 2008-01-13 bei der Wayback -Maschine, Aspekte Archiviert 2006-05-08 bei Wikiwix, Aspekte Archiviert 2008-12-16 bei der Wayback -Maschine, Cerny.js Archiviert 2007-06-27 bei der Wayback -Maschine, Dojo -Toolkit Archiviert 2006-02-21 am Wayback -Maschine, Humax Web Framework Archiviert 2008-12-09 bei der Wayback -Maschine, Joose Archiviert 2015-03-18 bei der Wayback -Maschine, Prototyp - Prototyp -Funktion#Wrap Archiviert 2009-05-05 am Wayback -Maschine, Yui 3 (y.do) Archiviert 2011-01-25 bei der Wayback -Maschine
- ^ Verwenden der integrierten Unterstützung für Kategorien (die die Einkapselung von Aspektcode ermöglichen) und ereignisgesteuerte Programmierung (die die Definition von ermöglicht Vor und danach Veranstaltung Handler).
- ^ "Aspekt". Archiviert Aus dem Original am 17. Juli 2015. Abgerufen 11. August 2015.
- ^ "Makao, Re (Vers) -Egineering Build-Systeme". Archiviert von das Original am 24. Juli 2012. Abgerufen 11. August 2015.
- ^ "McLab". Archiviert Aus dem Original am 24. September 2015. Abgerufen 11. August 2015.
- ^ "Aspektml - Aspekt -orientierte funktionale Programmiersprache Forschung". Archiviert Aus dem Original am 5. Dezember 2010. Abgerufen 11. August 2015.
- ^ "nemerle/readme.md bei Master · rsdn/nemerle". GitHub. Abgerufen 22. März 2018.
- ^ Adam Kennedy. "Aspekt - Aspekt -orientiertes Programmieren (AOP) für Perl - metacpan.org". Archiviert vom Original am 31. August 2013. Abgerufen 11. August 2015.
- ^ Mehrere: PHP-AOP (AOP.IO) Archiviert 2014-08-18 bei Wikiwix, Gehen! AOP -Framework Archiviert 2013-03-01 bei der Wayback -Maschine, Phpaspect Archiviert 2016-08-22 bei der Wayback -Maschine, Seasar.php Archiviert 2005-12-26 bei der Wayback -Maschine, PHP-AOP, Fließen Archiviert 2018-01-04 bei der Wayback -Maschine, AOP PECL -Erweiterung Archiviert 2017-04-11 bei der Wayback -Maschine
- ^ "Bigzaphod.org kommt bald". www.bigzaphod.org. Archiviert Aus dem Original am 20. April 2016. Abgerufen 5. Mai 2018.
- ^ Mehrere: GIPFEL Archiviert 2005-04-09 im Wayback -Maschine, Aspyct AOP, Leichtes Python AOP Archiviert 2004-10-09 im Wayback -Maschine, Logilabs Aspektmodul Archiviert 2005-03-09 im Wayback -Maschine, Pythius Archiviert 2005-04-08 am Wayback -Maschine, Frühlings -Python -AOP -Modul Archiviert 2016-03-04 bei der Wayback -Maschine, AOP -Modul von Pytilities Archiviert 2011-08-25 bei der Wayback -Maschine, Aspekt Archiviert 2014-11-05 in der Wayback -Maschine
- ^ "Planet -Paket -Repository: Planet> Dutchyn> Aspektscheme.plt". Archiviert Aus dem Original am 5. September 2015. Abgerufen 11. August 2015.
- ^ "ASPECTR - Einfache Aspekt -orientierte Programmierung in Ruby". Archiviert Aus dem Original am 12. August 2015. Abgerufen 11. August 2015.
- ^ Dean Wampler. "Heim". Archiviert von das Original am 26. Oktober 2007. Abgerufen 11. August 2015.
- ^ "GCAO/Aspektor". GitHub. Archiviert Aus dem Original am 4. Januar 2015. Abgerufen 11. August 2015.
- ^ "Aspekte". Tu-Ilmenau.de. Archiviert von das Original am 6. Januar 2006. Abgerufen 5. Mai 2018.
- ^ "Metaklasstalk: Reflexion und Metaprogrammierung in SmallTalk". Archiviert von das Original am 29. Juli 2015. Abgerufen 11. August 2015.
- ^ "Weavr". iit.edu. Archiviert Aus dem Original am 12. Dezember 2008. Abgerufen 5. Mai 2018.
- ^ "AspektXML - Eine Aspekt -orientierte XML -Webing -Engine (Achse) - Google Project Hosting". Archiviert Aus dem Original am 12. September 2015. Abgerufen 11. August 2015.
Weitere Lektüre
- Kiczales, G.; Lamping, J.; Mendhekar, a.; Maeda, C.; Lopes, C.; Loingtier, J. M.; Irwin, J. (1997). Aspekt-orientiertes Programmieren (PDF). Ecoop'97. Verfahren der 11. Europäischen Konferenz über objektorientierte Programmierung. Lncs. Vol. 1241. S. 220–242. Citeseerx 10.1.1.115.8660. doi:10.1007/bfb0053381. ISBN 3-540-63089-9. Das Papier wird allgemein als maßgebliche Referenz für AOP angesehen.
- Robert E. Filman; Tzilla Elrad; Siobhán Clarke; Mehmet Aksit (2004). Aspektorientierte Softwareentwicklung. ISBN 978-0-321-21976-3.
- Renaud Pawlak, Lionel Seinturier & Jean-Philippe Retaillé (2005). Grundlagen von AOP für J2EE -Entwicklung. ISBN 978-1-59059-507-7.
- Laddad, Ramnivas (2003). Aspektj in Aktion: Praktische, aspektorientierte Programmierung. ISBN 978-1-930110-93-9.
- Jacobson, Ivar; Pan-Wei Ng (2005). Aspektorientierte Softwareentwicklung mit Anwendungsfällen. ISBN 978-0-321-26888-4.
- Aspektorientierte Softwareentwicklung und PHP, Dmitry Sheiko, 2006
- Siobhán Clarke & Elisa Baniasad (2005). Aspektorientierte Analyse und Design: Der Themenansatz. ISBN 978-0-321-24674-5.
- Raghu Yedduladoddi (2009). Aspektorientierte Softwareentwicklung: Ein Ansatz zum Komponieren von UML -Designmodellen. ISBN 978-3-639-12084-4.
- "Adaptive objektorientierte Programmierung mit graphbasierter Anpassung"-Lieberherr, Silva-Lepe, et al. - 1994
- Zambrano Polo y la Borda, Arturo Federico (5. Juni 2013). "Aspekt -Interaktionen in einem industriellen Umfeld angehen: Erfahrungen, Probleme und Lösungen": 159. doi:10.35537/10915/35861. Abgerufen 30. Mai 2014.
{{}}
: Journal zitieren erfordert|journal=
(Hilfe) - Wijesuriya, Viraj Brian (2016-08-30) Aspektorientierte Entwicklung, Vorlesungsnotizen, Universität Colombo School of Computing, Sri Lanka
- Groves, Matthew D. (2013). AOP in .net. ISBN 9781617291142.
Externe Links
- Eric Bodden's Liste der AOP -Tools In .NET Framework
- Aspektorientierte Softwareentwicklung, Jahreskonferenz über AOP
- Aspektj -Programmierhandbuch
- Der Aspektbench -Compiler für Aspektj, eine weitere Java -Implementierung
- Reihe von IBM Developerworks -Artikeln über AOP
- Laddad, Ramnivas (18. Januar 2002). "Ich will mein AOP!, Teil 1". JavaRld. Abgerufen 2020-07-20. Eine detaillierte Reihe von Artikeln zu den Grundlagen der Aspekt-orientierten Programmierung und Aspektej
- Was ist Aspekt-orientiertes Programmieren?, Einführung mit Remobjects Taco
- Einschränkungsspezifikationsaspekt Weber
- Aspekt- gegen objektorientierte Programmierung: Welche Technik, wann?
- Gregor Kiczales, Professor für Informatik, erklärt AOP, Video 57 min.
- Aspektorientierte Programmierung in COBOL Archiviert 2008-12-17 bei der Wayback -Maschine
- Aspekt-orientiertes Programmieren in Java mit Spring-Framework
- Wiki widmet sich AOP -Methoden auf.net
- Frühe Aspekte für die Modellierung des Geschäftsprozesses (eine Aspekt -orientierte Sprache für BPMN)
- Frühlings -AOP- und Aspekte Einführung
- AOSD Graduiertenkurs an der Bilkent University
- Einführung in AOP - Software Engineering Radio Podcast Episode 106
- Eine objektive C-Implementierung von AOP von Szilveszter Molnar
- Aspektorientiertes Programmieren für iOS und OS X von Manuel Gebele
- Devexpress MVVM -Framework.Einführung in Poco ViewModels