www.wikidata.de-de.nina.az
Aspektorientierte Programmierung AOP ist ein Programmierparadigma fur die objektorientierte Programmierung um generische Funktionalitaten uber mehrere Klassen hinweg zu verwenden Cross Cutting Concern Logische Aspekte eines Anwendungsprogramms werden dabei von der eigentlichen Geschaftslogik getrennt Typische Anwendungsbeispiele sind Transaktionsverwaltung Auditfahigkeit und Loggingverhalten Das Konzept von AOP wurde von Gregor Kiczales und seinem Team am Xerox PARC entwickelt Im Jahr 2001 wurde dort auch die erste AOP Sprache AspectJ vorgestellt Inhaltsverzeichnis 1 Motivation 2 Hintergrund 3 Ableitung aus fruheren Paradigmen 3 1 Vergleiche 3 2 Analogie 3 3 Technische Betrachtung 4 Einsatzgebiete 5 Joinpoint vs Joinpoint shadow 6 Beispiel 6 1 Einfuhrendes Beispiel 6 2 Weiterfuhrendes Beispiel 6 3 Begriffe 7 Typische Aufgaben 8 Ahnliche Losungsansatze 9 Anmerkungen 10 Siehe auch 11 Literatur 12 Weblinks 13 EinzelnachweiseMotivation BearbeitenSoftware hat grundsatzlich bestimmte Aufgaben Anforderungen zu erfullen Diese Anforderungen kann man grob in zwei Bereiche gliedern Die sogenannten Core Level Concerns betreffen den logischen Kern der Anwendung oder funktionale Anforderungen Dies sind Anforderungen an die Software die man meist gut in einzelnen Funktionen kapseln kann Ein Beispiel ware die Berechnung eines Wertes Die System Level Concerns betreffen das gesamte System oder technische Randbedingungen Diese Anforderungen konnen nicht einfach gekapselt werden da sie an vielen Stellen implementiert werden mussen Ein Paradebeispiel dafur ist das Logging die Protokollierung des Programmablaufs in Logdateien Der Aufruf des Loggers ist fur die eigentliche Funktionalitat nicht notwendig muss aber trotzdem in den Quelltext integriert werden Ein weiteres Beispiel ware die Transaktionierung von Zugriffen auf eine Ressource wie z B eine Datenbank Diese beiden Teile sind miteinander verwoben Die Core Level Concerns kann man als Komponenten bezeichnen und die System Level Concerns sind die Aspekte Core Level Concerns werden ublicherweise als Module oder Objekte implementiert Fur die Aspekte gab es vor der aspektorientierten Programmierung keine elegante Losung Das Problem der miteinander verwobenen Anforderungen wird auch als Cross Cutting Concerns bezeichnet denn sie schneiden quer durch alle logischen Schichten des Systems AOP ist das Werkzeug um die logisch unabhangigen Belange auch physisch voneinander zu trennen Dabei wird angestrebt Code zu erzeugen der besser wartbar und wiederverwendbar ist In diesem Zusammenhang sind System Level Concerns aber nicht gleichzusetzen mit rein technischen Belangen Auch fachliche Belange wie z B die Umsetzung eines eigenen fachlichen Berechtigungssystems fur Benutzer konnen durchaus Aspektcharakter haben Hintergrund BearbeitenIn der Geschichte der Entwicklung der Programmiersprachen wurden immer wieder neue Konzepte der Programmierung und diese implementierende Hochsprachen entwickelt angefangen bei der Programmierung in Assembler welche das direkte Programmieren in Binarcode abloste uber prozedurales und funktionales Programmieren bis hin zu den heute aktuellen objektorientierten Sprachen Der Zweck ist den Entwicklern die Arbeit zu erleichtern und somit eine bessere Effizienz in der Entwicklung der Software zu erzielen Eines der zugrundeliegenden Prinzipien das bei allen neuen Programmierkonzepten angewendet wurde war das der Kapselung von Funktionalitat Assemblersprachen kapseln hardwareabhangige Binarbefehle fur Arbeitsspeicher und Registerzugriffe in kurzen generalisierten Zeichenketten und befreien den Softwareentwickler damit von der Notwendigkeit sich mit dem detaillierten Aufbau der gesamten Rechnerhardware zu beschaftigen Prozedurale Sprachen erlauben die Kapselung einfacher Funktionen wie das Sortieren einer Namensliste innerhalb einer Prozedur Damit entfallt die Notwendigkeit von Zeilennummern und daran gebundenen Sprungbefehlen sowie das mehrfache Entwickeln derselben Funktion an verschiedenen Stellen des Programmcodes Objektorientierte Programmiersprachen erlauben die Kapselung konzeptionell zusammengehoriger Funktionen und Variablen in unabhangigen Modulen Klassen mit klar definierten Schnittstellen wodurch die Wiederverwendbarkeit der einzelnen Module erhoht wird und der Softwareentwickler davon befreit ist sich mit der internen Implementierung der von ihm verwendeten Klassen auseinanderzusetzen Eine erweiterte Funktionalitat zu ermoglichen ist nicht Ziel dieser Entwicklung weil jede Hochsprache nach der Kompilierung auf Maschinencode abgebildet wird Insbesondere erleichtert die Kapselung von Funktionalitat die Entwicklung von Software indem Wartbarkeit und Wiederverwendbarkeit existierenden Programmcodes erhoht werden Da Software im Laufe der Zeit immer komplexer und umfangreicher wird und damit die Entwicklung zeitaufwendiger und teurer gewannen diese beiden Ziele immer mehr an Bedeutung und sind heute zentrale Elemente bei der Entwicklung neuer Programmierkonzepte und sprachen Bei AOP aspect oriented programming bzw aspektorientierte Programmierung handelt es sich um ein Programmierkonzept welches das Problem der sogenannten Cross Cutting Concerns behandelt Die kostengunstige und termingerechte Entwicklung und Wartung qualitativ hochwertiger Software ist das Primarziel des Software Engineering Um dieses Ziel zu erreichen ist eine moglichst modularisierte Software mit einer moglichst geringen Komplexitat der Module notwendig In einem konventionellen System wobei hier auch die objektorientierten Ansatze hinzugehoren konnen Kernfunktionalitaten englisch core concerns fur sich allein betrachtet nach den Regeln der Kunst sauber in Module getrennt werden Es gibt jedoch concerns Anliegen Belange Anforderungen wie Fehlerbehandlung Performance und Sicherheit in jedem System die die Kernfunktionalitaten quer schneiden eng cross cut und sich deshalb nicht eindeutig einem Software Modul zuordnen lassen Dies fuhrt dazu dass Fragmente solcher cross cutting concerns quer schneidende Kernfunktionalitaten ubergreifende Anforderungen fehlende Kohasion nicht zugeordnet und ungekapselt im ganzen Code verstreut sind Diese quer schneidenden Kernfunktionalitaten verhindern in konventionellen Softwaresystemen eine saubere Modularisierung und beeintrachtigen Pflege Verstandlichkeit Wiederverwendbarkeit und Ruck Verfolgbarkeit Verantwortlich hierfur ist bei konventionellen Programmiersprachen die Systemdekomposition die nur eine Dimension zulasst die Liste von Funktionen Dieses Phanomen nennt man auch dominante Dekomposition Mit anderen Worten ein naturlicherweise mehrdimensionales Problem muss eindimensional gelost werden Ableitung aus fruheren Paradigmen BearbeitenIn der prozeduralen Programmierung ist die Ausfuhrung von Code vergleichsweise linear Durch Verfolgung der Symbole ist jeder einzelne Programmschritt auch bei der Betrachtung eines Teilsystems direkt nachvollziehbar Beispiel in C void function void c Component repaint c Die Funktion Component repaint ist eindeutig Unabhangig davon ob der Zeiger c den dynamischen Typ Component oder einen abgeleiteten Typ hat wird immer dieselbe Funktion Component repaint Component aufgerufen statische Typisierung In der objektorientierten Programmierung wird die Nachvollziehbarkeit durch die Polymorphie reduziert Beispiel in Java void function Component c c repaint Es ist nicht eindeutig nachvollziehbar welche repaint Methode ausgefuhrt wird das hangt vom tatsachlichen Typ des Objekts ab das von c referenziert wird Ein von Component abgeleiteter Typ konnte seine eigene repaint Methode definieren indem er die von Component geerbte Methode repaint uberschreibt In der aspektorientierten Programmierung wird die Nachvollziehbarkeit durch die Verwendung von Pointcuts weiter reduziert Ein Pointcut enthalt fur einen Join Point auszufuhrenden Code ein Join Point ist dabei ein genau definiertes Aufrufereignis Hier konnen zu nahezu beliebigen Punkten in der Aufrufkette Advices aktiviert werden Damit ist es im Extremfall sogar moglich den Aufruf der Methoden function oder repaint an sich zu verhindern So konnte man sich einen Aspekt vorstellen der fur den Join Point Aufruf der Methode function einen Advice definiert der explizit die weitere Abarbeitung dieses Funktionsaufrufs untersagt Ebenso konnte man in einem Advice festlegen dass anstatt der Methode repaint eine andere Methode auf das Objekt angewandt werden soll Die Information daruber was als Nachstes geschehen soll ist dabei am Ort des Geschehens selbst zunachst nicht abzulesen Vergleiche Bearbeiten Zum besseren Verstandnis der Konzepte von Pointcuts Join Points und Advices dienen die Vergleiche mit den nachstehenden alteren Paradigmen Structured Query Language SQL Man stelle sich ein SELECT Statement vor das alle Methoden in allen Klassen eines Systems selektieren kann In diesem Zusammenhang entspricht dann ein Pointcut der WHERE Klausel welche die Menge der selektierten Methoden einschrankt ein Join Point einem konkreten Suchergebnis im Sinne eines Datensatzes aus einer Datenbank nur dass hier keine Datensatze aus einer Datenbank selektiert werden sondern Methoden in einem System ein Advice ist dann die Methode in einem Aspekt die vor nach oder anstatt der ausgewahlten Methode ausgefuhrt werden soll andere Programmierparadigmen Wahrend in der prozeduralen Programmierung die Nachvollziehbarkeit durch ein Quelltextfragment und in der objektorientierten Programmierung unter zusatzlicher Kenntnis uber die Laufzeittypen vergleichsweise direkt gegeben ist erfordert die Nachvollziehbarkeit in der aspektorientierten Programmierung die Kenntnis samtlicher Aspekte die Point Cuts fur die Join Points des Code Fragment definieren Orthogonal bedeutet hier dass Eigenschaften von Methoden senkrecht zur normalen Programmierrichtung definiert werden Die tatsachliche Code Ausfuhrung wird nicht nur durch die Aufruf und Typenhierarchie sondern zusatzlich senkrecht orthogonal dazu von den Aspekten definiert Analogie Bearbeiten Anschaulich kann man sich das Prinzip wie folgt vorstellen ein Programm gleichgultig ob prozedural oder objektorientiert folgt einem Programmablaufplan d h der Programmfluss ist an jeder Stelle durch lineare Folgen von Anweisungen Codeblocke und Sprunge zwischen diesen z B Methodenaufrufe festgelegt Ein Aspekt ware hier so viel wie eine Schablone die uber diesen Originalplan gelegt wird und verschiedene Anderungen oder Erganzungen am Ablaufschema vornimmt Anderungen an der Schablone lassen den Originalplan unangetastet die Schablone lasst sich jederzeit austauschen mit anderen kombinieren oder wieder entfernen Technische Betrachtung Bearbeiten In einer objektorientierten Laufzeitumgebung konnte aspektorientierte Programmierung durch veranderbare Sprungvektoren ermoglicht werden Man kann sie als eine Art im Programmierparadigma vorgesehenes Patchen von Funktionen ansehen Ein Objekt C wird in die Lage versetzt Interaktionen zwischen zwei Objekten A und B zu uberwachen ohne dass dafur Veranderungen oder Erweiterungen an A und B notwendig sind Naturlich ist tatsachlich doch eine Veranderung von A oder B oder beiden notwendig AspectJ erzeugt diese Anderungen automatisch der Vorgang dafur heisst Weaving da besagte Anderungen vor dem Kompilieren in den Originalcode eingewebt werden Einsatzgebiete BearbeitenDie aspektorientierte Programmierung ist in der Lage die bisher in der objektorientierten Programmierung eingesetzte ereignisgesteuerte Programmierung Event Handling ganz zu ersetzen Die ereignisgesteuerte Programmierung dient dazu ein Objekt X uber Veranderungen an einem Objekt Y zu benachrichtigen Das Objekt Y braucht das Objekt X dabei aber nicht zu kennen Die bisherige Losung wird hier am Beispiel eines Fensters in Java java awt Frame erklart Zu Ereignissen die speziell fur Fenster eintreten und uber die ein anderer Programmteil benachrichtigt werden soll zahlt unter anderem das Schliessen das Aktivieren und das Deaktivieren Eine Schnittstelle java awt event WindowListener definiert dafur unterschiedliche Methoden und muss von den Objekten die uber Veranderungen am Fenster benachrichtigt werden mochten implementiert werden Objekte die benachrichtigt werden mochten mussen sich bei dem jeweiligen anderen Objekt registrieren Die aspektorientierte Programmierung kann die Definition solcher Schnittstellen uberflussig machen Ein Aspekt X definiert fur das zu uberwachende Objekt Y die genau zu uberwachenden Code Ereignisse genannt Point Cut zusammengesetzt aus Join Points Gesamte Methode Methoden Aufruf Methoden Ruckkehr unterscheidbar in Methoden Ruckkehr mit Ruckgabewert und Methoden Ruckkehr mit Exception und definiert fur die verschiedenen Point Cuts den Advice das ist der auszufuhrende Code Die Ausfuhrung von Code in X durch Veranderungen an einem Objekt Y kann also ohne zusatzliches Interface Methoden und Registrierungsmechanismus erfolgen Aspektorientierte Programmierung kann bei der Entwicklung von Frameworks Libraries eingesetzt werden um z B Eigenschaften wie Persistenz oder Synchronisierbarkeit zu implementieren Der Transfermechanismus bleibt dann vor dem Benutzer der Bibliothek verborgen Das Verbergen des Transfermechanismus macht den Code in diesem Fall ubersichtlicher da die Methoden nicht mit Framework Code uberfrachtet werden Ein weiteres Einsatzgebiet ist das Software Testen wo insbesondere das Einfuhren neuer Attribute in Klassen ohne die Veranderung ihrer Quelltexte Inter type Declarations neue interessante Moglichkeiten fur die Entwicklung von White Box Tests darstellt z B um ein Tracing privater Attribute durchzufuhren Joinpoint vs Joinpoint shadow BearbeitenEs muss zwischen Joinpoints und den sogenannten Joinpoint shadows unterschieden werden Ein Joinpoint shadow ist das statische Vorkommen eines potentiellen Joinpoints Ob dieser shadow etwa ein im Quellcode stehender Methodenaufruf tatsachlich zu einem Joinpoint wird entscheidet sich erst zur Laufzeit in Abhangigkeit vom korrespondierenden Pointcut resp Pointcut Designator Ein Pointcut definiert eine Menge von Joinpoint shadows die er aus dem zugrunde liegenden Programm herausschneidet cut Wird wahrend des Programmablaufs ein Joinpoint shadow betreten und ist sein definierender Pointcut erfullbar wird der Joinpoint shadow zum Joinpoint Beispiel BearbeitenFolgendes Beispiel erlautert den Grundgedanken der aspektorientierten Programmierung Die verwendete Programmiersprache ist AspectJ die Java um die Aspektorientierung erweitert Einfuhrendes Beispiel Bearbeiten Als einfuhrendes Beispiel soll eine Standardaufgabe bei der Softwareentwicklung dienen Tracing von Informationen in eine Datei Das Vorgehen ohne aspektorientierte Programmierung besteht darin einen Logger zu erzeugen und dort eine entsprechende Methode aufzurufen die die eigentliche Information in die Logdatei speichert public void eineMethode logger trace Betrete eineMethode Abarbeitung der Methode m a 2 logger trace Verlasse eineMethode Zu Beginn der Methode wird an den Logger gemeldet dass die Methode betreten wird Danach folgt die eigentliche Logik der Methode Zum Schluss wird das Verlassen der Methode protokolliert In einer typischen Anwendung sind derartige Methodenaufrufe an den Logger in vielen Methoden und Klassen vorhanden sie sind uber die gesamte Anwendung verstreut und keinesfalls modular Der Logger muss jedem Objekt bekannt gemacht werden und kann nicht ohne weiteres an einer zentralen Stelle ausgetauscht werden jedenfalls nicht ohne diesen im System public static zu deklarieren was einer globalen Variablen und somit zweifelhaftem Design gleichkommt Somit wird auch klar was mit semantisch und physisch unabhangige Programmstrecken gemeint ist In obiger Methode sind zwei eigentlich unabhangige Aufgaben miteinander vermengt Dies ist zum einen das Protokollieren und zum anderen die eigentliche Logik der Methode die darin besteht das Ergebnis einer Addition in der Membervariablen m zu speichern Die aspektorientierte Programmierung erlaubt es nun auch Aufgaben wie das Tracing zu modularisieren Angenommen das Betreten und Verlassen einer jeden Methode der Klasse soll auf die oben gezeigte Weise protokolliert werden Gegenuber der konventionellen Programmierung lasst sich eine solche Anweisung in der AOP direkt als Aspekt formulieren public aspect Tracing pointcut traceCall call AOPDemo before traceCall System out println Betrete thisJoinPoint after traceCall System out println Verlasse thisJoinPoint Im Aspekt wird bestimmt dass alle Methoden der Klasse AOPDemo unabhangig von ihrer Signatur einbezogen werden sollen Die Aufgaben werden auf diese Weise separiert und die ursprungliche Methode kann verkurzt geschrieben werden public void eineMethode Abarbeitung der Methode m a 2 Weiterfuhrendes Beispiel Bearbeiten Ausserdem ermoglicht die aspektorientierte Programmierung eine Umleitung des ursprunglichen Programmablaufs Sicherheitsaspekte konnen zum Beispiel den ursprunglichen Programmablauf austauschen um unberechtigte Zugriffe auf geschutzte Programmteile zu verhindern Caching Aspekte erhohen die Ausfuhrungsgeschwindigkeit von Programmen und werden eingesetzt um den Aufruf aufwendiger Programmteile wie Datenbank oder Dateisystemzugriffe zu reduzieren Das folgende Beispiel demonstriert die Umleitung von Methodenaufrufen bzw den Austausch von Programmteilen als Interception Around Advice 1 public aspect Caching pointcut cacheCall call AOPDemo private Map cache new Map around cacheCall Joinpoint joinPointContext Prufen ob Ruckgabewert fur aktuelle Aufruf Argumente schon im Cache abgelegt wurde Object args joinPointContext getArguments boolean isCallCached cache containsKey args if isCallCached Umleitung und Austausch des ursprunglichen Methodenaufrufs gesicherten Ruckgabewert aus Cache verwenden Object cachedReturnValue cache get args return cachedReturnValue else Weiterleitung an ursprungliche Methode und neuen Ruckgabewert im Cache sichern Object newReturnValue joinPointContext proceed cache put args newReturnValue return newReturnValue Begriffe Bearbeiten Das Beispiel beinhaltet bereits die wichtigsten Konzepte wenn auch nicht alle In diesem Abschnitt werden die fehlenden hinzugefugt und den in der AOP verwendeten Begriffen zugeordnet Dazu wird das Beispiel um folgende Codesequenz erweitert und der bisherige Ablauf grafisch dargestellt public void quellMethode eineMethode nbsp Der Aspekt kommt zum Tragen noch bevor eineMethode betreten wird Der Grund dafur ist der Join Point direkt davor Diese Join Points sind implizit gegeben Das heisst sie sind vor jeder Methode vorhanden Das Muster das aus allen vorhandenen Join Points diejenigen aussucht die fur einen Aspekt interessant sind nennt sich Pointcut Tatsachlich handelt es sich bei den Pointcuts um Muster die auch Wildcards erlauben Um festzulegen wann welcher Code innerhalb des Aspekts auszufuhren ist kommen Advices zum Tragen Im einfuhrenden Beispiel sind dies before und after im weiterfuhrenden Beispiel around Diese Advices sind neben weiteren implizit gegeben Die Programmierung mit Aspekten erlaubt es zudem in und mit Aspekten das Verhalten von Klassen zu verandern Es konnen durch Aspekte Felder und Methoden zu Klassen hinzugefugt werden Auch hier ist es durch die Angabe von Wildcards gleichzeitig bei mehreren Klassen moglich In einer Sprache wie Java verletzen diese Inter Type Declarations die Regel dass samtliche Felder und Methoden einer Klasse in einer Datei bzw der Vererbungshierarchie der Klasse zu finden sind da Aspekte dieser nicht angehoren Typische Aufgaben BearbeitenAOP ist besonders zur Programmierung von sogenannten Cross Cutting Concerns geeignet Beispiele dafur sind Protokollierung Fehlerbehandlung Persistenz Datenvalidierung und IT Sicherheit Profiling APIs wie bspw in Java enthalten arbeiten auf ahnliche Weise wie AOP Sie dienen dazu unperformante Codestellen zu ermitteln Dazu werden durch einen sog Profiler Zeitmessungen fur die Abarbeitung samtlicher Methoden angestellt Der eigentliche Profiler kann sich von der Virtual Machine mitteilen lassen wann eine Methode betreten und verlassen wird Mit aspektorientierter Programmierung lasst sich daher auch ein Profiler realisieren Ahnliche Losungsansatze BearbeitenAspekte haben ihren Ursprung in der objektorientierten Programmierung und sind zumindest in ihrer Intention vergleichbar mit Metaobjektprotokollen wie man sie beispielsweise im Common Lisp Object System vorfindet Ferner sind Aspekte mit Konzepten wie der subjektorientierten Programmierung den Mixins den Classboxes oder dem Konzept der Delegation verwandt wie es in der Programmiersprache Self vorzufinden ist Einen ahnlich gelagerten oder gar gleichwertigen Losungsansatz stellen die sogenannten Traits dar Anmerkungen BearbeitenVorteil der Aspektorientierung ist die logische und physische Trennung der Semantik der Komponente von dem technischen Detail Aspekt Als Nachteil der aspektorientierten Programmierung sei hier insbesondere der Overhead erwahnt der nach dem Weaving im generierten Programm entsteht Dies fuhrt im Allgemeinen zu Performance Einbussen Des Weiteren reduziert aspektorientierte Programmierung die Nachvollziehbarkeit von Programmverhalten da die Stellen an denen ein Aspekt zustandig ist im betroffenen Code nicht direkt erkennbar sind Debugging wird so stark erschwert allerdings kann dieser Nachteil durch Unterstutzung einer IDE neutralisiert oder zumindest reduziert werden indem das Debugging ebenso mehrdimensional vor sich geht wie das Entwickeln des Codes Ein weiterer Nachteil ist dass beim Einsatz dieser Technik unerwunschte und schwer nachvollziehbare Wechselwirkungen zwischen einzelnen Aspekten auftreten konnen Aspekte und Komponenten konnen in verschiedenen Programmiersprachen definiert sein Siehe auch BearbeitenReflexion Programmierung Literatur BearbeitenLars Wunderlich AOP Aspektorientierte Programmierung in der Praxis Entwickler press Frankfurt am Main 2005 ISBN 3 935042 74 4 Oliver Bohm Aspektorientierte Programmierung mit AspectJ 5 Einsteigen in AspectJ und AOP Dpunkt Verlag Heidelberg 2006 ISBN 3 89864 330 1 Renaud Pawlak Lionel Seinturier Jean Philippe Retaille Foundations of AOP for J2EE Development Foundation Apress Berkeley CA 2005 ISBN 1 59059 507 6 Ralf Westphal Aspektorientierte Programmierung mit NET In dotnetpro Ulm 22 2007 10 ISSN 1610 1553Weblinks BearbeitenAspectL Aspektorientierte Programmierung fur Lisp AspectJ Aspektorientierte Programmierung fur Java LOOM NET Aspektorientierte Programmierung fur NET AspectC Aspektorientierte Programmierung fur C FeatureC Kombination von merkmalsorientierter Programmierung und aspektorientierter Programmierung fur C Fehlersuche mit aspektorientierter Programmierung in Java deutsch FLOW3 PHP Framework mit AOP PHP AOP AOP io aspektorientierter Programmierung in PHP Go Aspektorientierte Programmierung fur PHP loom as3 ActionScript3 AOP Bytecode Weaver Aspektorientierte Programmierung fur Objective CEinzelnachweise Bearbeiten Interception Around Advice Abgerufen von https de wikipedia org w index php title Aspektorientierte Programmierung amp oldid 228093146