Aspektorientierte Programmierung (aspect-oriented programming, AOP) Abstract Die aspektorientierte Programmierung ist ein neues Programmierparadigma, das die Probleme und Nachteile, die aus der prozeduralen und objektorientierten Programmierung entstehen, zu verhindern sucht. In dieser Präsentation werden die grundlegenden Begriffe der AOP erläutert und ein einführendes Beispiel gegeben. Echtzeitsysteme (SoSe 2006) Grundlagen der Software-Entwicklung Die Entwicklung großer Software-Systeme gliedert sich in mehrere Phasen. Eine der wichtigsten Phasen ist der korrekte und vollständige Entwurf (Design) bzw. die Modellierung des Software-Systems. In der Entwurfsphase kommt es üblicherweise zu einer Untersuchung und Zerlegung des Gesamtproblems in kleinere Teilprobleme, die auf Konstrukte der eingesetzten Programmiersprache abgebildet und unabhängig voneinander implementiert werden können. Æ funktionaler Dekomposition oder Modularisierung Als Programmierkonstrukte kommen bei der objektorientierten Programmierung Klassen bzw. Objekte und deren Methoden in Frage. Echtzeitsysteme (SoSe 2006) Probleme bei der Modellierung Bestimmte Concerns (”Anforderungen“ oder ”Belange“) des Software-Systems lassen sich nicht eindeutig einer Klasse zuordnen. Man unterscheidet: à Common-Concerns · lassen sich eindeutig in einer Klasse kapseln à Crosscutting-Concerns · betreffen viele oder sogar alle Teile des Software-Systems Beispiele für Crosscutting-Concerns: à Authentifizierung von Benutzern à Protokollierung von Systemereignissen à Synchronisation à Einhaltung von Zeitschranken à Datenkonsistenz à … Echtzeitsysteme (SoSe 2006) Code Tangling und Code Scattering Problem: à OO-Sprachen bieten dem Entwickler kein anderes Konstrukt außer Klassen an, um Crosscutting-Concerns zu modellieren. Dies führt zu à Code Tangling · Durcheinander an Code, der ganz verschiedene Anforderungen implementiert, aber dennoch in einer Klasse gekapselt ist à Code Scattering · Verteilen von Code, der eine bestimmte Aufgabe erfüllt (z.B. Einhaltung von Zeitschranken), über viele verschiedene Klassen hinweg Widerspruch zum à Prinzip der funktionalen Dekomposition à Prinzip der Kapselung Probleme motivieren eine Erweiterung der OOP um Möglichkeiten, Crosscutting-Concerns zu kapseln und den Software-Entwurf flexibler zu gestalten. Auf diese Anforderungen bietet die AOP eine Antwort. Echtzeitsysteme (SoSe 2006) Weaver Vorgehensweise der AOP Echtzeitsysteme (SoSe 2006) Joinpoints Unter einem Joinpoint versteht man einen bestimmten Punkt oder ein bestimmtes Ereignis im Ablauf eines Programms. Beispiele: à à à à Aufruf einer Methode Werfen einer Ausnahme Ausführung eines Konstruktors Lesen und Schreiben von Attributen Echtzeitsysteme (SoSe 2006) Pointcut Ein Pointcut definiert auf welche Joinpoints reagiert werden soll, definiert also einen Filter für Joinpoints. Beispiele: à Reaktion auf Methode mit bestimmten Namen à Reaktion auf Methode mit bestimmter Signatur à Reaktion auf einen Konstruktor In AspectJ werden Pointcuts mit dem Schlüsselwort pointcut deklariert. Echtzeitsysteme (SoSe 2006) Advice Da ein Pointcut nur definiert, auf welche Joinpoints reagiert werden soll, aber nicht wie, benötigt man ein weiteres Konstrukt, welches Advice genannt wird. Ein Advice verknüpft einen Pointcut mit Code, der bei Erreichen eines Joinpoints ausgeführt wird. AspectJ unterscheidet drei verschiedene Arten von Advice: à before · spezifizierter Joinpoint wurde erreicht, aber noch nicht abgearbeitet à after · spezifizierter Joinpoint wurde erreicht und abgearbeitet à around · Entwickler kann selbst entscheiden, wann Joinpoint abgearbeitet wird Echtzeitsysteme (SoSe 2006) Aspekte Aspekte fassen mehrere Pointcuts und Advice zusammen, dienen also zur Kapselung selbiger. Ein Aspekt wird durch das Schlüsselwort aspect definiert und ist von der Struktur her einer Klasse vergleichbar. Von Aspekten können keine Exemplare mittels new erzeugt werden. Echtzeitsysteme (SoSe 2006) Java und Echtzeit Implementierung eines Echtzeitsystems setzt echtzeitfähige Programmiersprache voraus Java ist auf Grund seiner Speicherverwaltung nicht echtzeitfähig: à Objekte werden mittels new erzeugt und auf dem Heap abgelegt à nicht mehr benötigte Objekte werden durch Garbage Collector (GC) entfernt à GC ist als eigenständiger Thread mit höchster Priorität implementiert à Folge: GC kann zu beliebigen Zeitpunkten den Programmablauf für unbestimmte Zeit unterbrechen à Unterbrechungszeit der Anwendungsthreads ist nicht deterministisch Echtzeitsysteme (SoSe 2006) Arbeitsweise des Garbage Collector Echtzeitsysteme (SoSe 2006) Real-Time Specification for Java entwickelt von der Real-Time for Java Expert Group (RTJEG) Quelle: https://rtsj.dev.java.net/ Erweiterung der Java Sprachspezifikation und der JVM Spezifikation Hauptziele: à à à à Analyse Erzeugung Ausführung Verifikation von Threads, die Zeitanforderungen genügen müssen Echtzeitsysteme (SoSe 2006) RealtimeThread und NoHeapRealtimeThread Einführung von zwei neuen Thread-Klassen: à RealtimeThread · besitzt niedrigere Priorität als der GC ⇒ kann unterbrochen werden · erlaubt die Festlegung von SchedulingParameters und ReleaseParameters à NoHeapRealtimeThread · besitzt höhere Priorität als der GC ⇒ kann nicht unterbrochen werden · verwendet keinen Heap-Speicher Echtzeitsysteme (SoSe 2006) AspectJ AspectJ ist eine frei verfügbare Aspektsprache für Java, entwickelt von Xerox PARC. Quelle: http://eclipse.org/aspectj AspectJ erweitert Java um aspektorientierte Programmkonstrukte. Die Menge der gültigen AspectJ-Programme ist demnach eine Obermenge der gültigen Java-Programme, d.h. jedes gültige JavaProgramm ist auch ein gültiges AspectJ-Programm. Vorteile: à Verfügbarkeit von zahlreichen Werkzeugen (Debugger, Dokumentationsgenerator, Aspektvisualisierer, …) à Integration in zahlreiche Entwicklungsumgebungen (NetBeans, SunONE, JBuilder, Eclipse, …) Echtzeitsysteme (SoSe 2006) Beispiel: Logging (1) public class ExampleClass1 { public void method1() { System.err.println("Logger: ExampleClass1:method1 wurde betreten."); // Anweisungen von Methode 1 ... System.err.println("Logger: ExampleClass1:method1 wird verlassen."); } public void method2() { System.err.println("Logger: ExampleClass1:method2 wurde betreten."); // Anweisungen von Methode 2 ... System.err.println("Logger: ExampleClass1:method2 wird verlassen."); } ... } Echtzeitsysteme (SoSe 2006) Beispiel: Logging (2) Nachteile: à In jeder Methode müssen die Statusmeldungen manuell eingefügt werden. Da eine Statusmeldung immer die gleiche Form hat, kommt es zu Code-Replikation. à Sollte neben der Meldung, dass eine Methode betreten bzw. verlassen wurde, noch weitere Informationen benötigt werden, wie beispielsweise die Systemzeit, müssen alle Programmstellen manuell geändert werden. Æ inflexibel gegenüber Änderungen. à Werden die Statusmeldungen nicht mehr benötigt, müssen sie manuell wieder entfernt werden. Echtzeitsysteme (SoSe 2006) Beispiel: Logging (3) import org.aspectj.lang.*; public aspect LoggerAspect { pointcut executionMethods() : execution(void ExampleClass2.method*()); before() : executionMethods() { Signature s = thisJoinPoint.getSignature(); System.err.println("Logger: " + s.getDeclaringTypeName() + ":" + s.getName() + " wurde betreten."); } after() : executionMethods() { Signature s = thisJoinPoint.getSignature(); System.err.println("Logger: " + s.getDeclaringTypeName() + ":" + s.getName() + " wird verlassen."); } } Echtzeitsysteme (SoSe 2006) Quellen Ramnivas Laddad: I want my AOP!, Part 1 – Separate software concerns with aspect-oriented programming, http://www.javaworld.com/javaworld/jw-01-2002/jw-0118-aspect_p.html, 18. Januar 2002 Ramnivas Laddad: I want my AOP!, Part 2 – Learn AspectJ to better understand aspect-oriented programming, http://www.javaworld.com/javaworld/jw-03-2002/jw-0301-aspect2_p.html, 01. März 2002 Ramnivas Laddad: I want my AOP!, Part 3 – Use AspectJ to modularize crosscutting concerns in real-world problems, http://www.javaworld.com/javaworld/jw-04-2002/jw-0412-aspect3_p.html, 12. April 2002 The AspectJ project at Eclipse.org, http://www.eclipse.org/aspectj/ Eclipse.org home, http://www.eclipse.org/ Echtzeitsysteme (SoSe 2006)