Aspektorientierte Programmierung (aspect

Werbung
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)
Herunterladen