Einführung
• Objektorientierung trat an mit dem Ziel, die Modularisierung und Wiederverwendung zu verbessern
• Das hat für den fachlichen Teil der Software auch gut funktioniert
• … aber leider besteht Software nicht nur aus der Problemdomäne
08.02.2010 Advanced Software Engineering 3
Aspektorientierte Programmierung (AOP) ist ein Programmierparadigma, das anstrebt, verschiedene logische Aspekte eines Programms getrennt voneinander zu entwerfen, zu entwickeln und zu testen. Die getrennt entwickelten Aspekte werden dann zur endgültigen Anwendung zusammengefügt.
Aspekte beziehungsweise Concerns in diesem Sinne sind alle eigenständigen Anforderungen der Anwendung, die nicht einem einzigen (Klassen-)Modul zugeordnet werden können sondern vielmehr von mehreren Modulen berücksichtigt werden müssen.
Einführung: Vertikale Funktionalität
• XML-Parsing im Apache Tomcat
• Gesamte diesbezügliche Funktionalität in einem Modul vereinigt
08.02.2010 Advanced Software Engineering 4
[PARC AOP Workshop 2002]
Einführung: Horizontale Funktionalität
• Logging im Apache Tomcat
• Funktionalität über nahezu alle Module verteilt
08.02.2010 Advanced Software Engineering 5
[PARC AOP Workshop 2002]
Querschnittsfunktionen
• Querschnittsfunktionen sind horizontal über das gesamte System verteilt
• Beispiele– Logging– Sicherheit (Zugriffskontrolle)– Persistenz und Caching– Einbettung verschiedener Datenbanken– Profiling– Anpassung an verschiedene Einsatzorte
08.02.2010 Advanced Software Engineering 6
Funktionsaufteilung
08.02.2010 Advanced Software Engineering 7
Systemfunktionalität
Systemfunktionalität
Komponente
(Objekt)
Komponente
(Objekt)
Komponente
(Objekt)
Komponente
(Objekt)
Komponente
(Objekt)
Komponente
(Objekt)
Komponente
(Objekt)
Komponente
(Objekt)
funktionaleAufteilung
horizontale Systemfunktionalität (Datenbank)
horizontale Systemfunktionalität (Sicherheitsrichtlinie)
Negative Folgen horizontaler Aspekte
• Redundanz– Duplizierung von Quelltextfragmenten– Ähnliche Fragmente über das ganze System verteilt
• Verständnisschwierigkeiten– Unklare Quelltextstruktur– Abbildung des Systems im Quelltext wird unklar
• Änderungsproblematik– Konsistent halten des redundanten Codes– Nicht-offensichtliche Abhängigkeiten
• Verstoß gegen GRASP– Hohe Kopplung– Niedriger Zusammenhalt
08.02.2010 Advanced Software Engineering 8
Lösung durch Auslagerung der Aspekte
• Querschnittsbelange, die von der Funktionalität unabhängig sind, identifizieren
• Diese in andere Module auslagern• Verweise auf den ausgelagerten Quelltext nachträglich
einfügen
Entkopplung der Module, klarere Struktur
08.02.2010 Advanced Software Engineering 9
Systemfunktionalität
Komponente
(Objekt)
Komponente
(Objekt)
Komponente
(Objekt)
Komponente
(Objekt)
Komponente
(Objekt)
Komponente
(Objekt)
Komponente
(Objekt)
Komponente
(Objekt)
horizontale Systemfunktionalität (Datenbank)
horizontale Systemfunktionalität (Sicherheitsrichtlinie)
Definition
Aspektorientierte Programmierung (AOP) ist ein Pro-grammierparadigma, um räumlich getrennte Pro-grammbestandteile (zum Beispiel Funktionen) von zen-traler Stelle mit bestimmten Eigenschaften (zum Bei-spiel die Protokollierung von Aufrufen) auszustatten.Dazu werden so genannte Aspekte in eigenen Dateiendefiniert und frühestens zur Übersetzungszeit auto-matisch in den Programmcode eingefügt.
(Wikipedia)
08.02.2010 Advanced Software Engineering 10
Zentrale Begriffe
• Verbindungspunkte (Joinpoints)– Wohldefinierte Ereignisse im Quelltext– AOP Framework erlaubt hier Modifikation des Verhaltens (z.B.
Quelltexteinfügung)
• Definition von Schnittpunkten (Pointcut)– Ein Schnittpunkt ist eine Teilmenge der Joinpoints– AOP Framework erlaubt logische Kombinationen
• Empfehlungen (Advice)– Was ist zu tun– Quelltext in der Zielsprache
• Aspekte– Kombiniert ähnliche Pointcut/Advice Definitionen
Hier: Betrachtung von AspectJ
08.02.2010 Advanced Software Engineering 11
Joinpoints
• Vordefinierte Verbindungspunkte, an denen das Framework das Einfügen von Quelltext erlaubt
• In AspectJ– method call/execution– constructor call/execution– static initializer execution– object (pre) initialization– field reference/assignment– handler execution– advice execution
• Joinpoints sind all jene Verbindungspunkte, an denen ein Einfügen möglich ist, nicht nur all diejenigen, an denen es tatsächlich passiert!
08.02.2010 Advanced Software Engineering 12
Pointcut
• Filtern der Menge der Joinpoints
• Über (syntaktische) Kriterien (Patterns) wird eine Teilmenge der Joinpoints definiert, und diese Menge benannt
• Logische Kombination von Pointcuts möglich
• Geeignete Pointcuts erlauben den Zugriff auf Methodenparameter und Rückgabewerte
08.02.2010 Advanced Software Engineering 13
Primitive Pointucts
• call/execution(MethodPattern/ConstructorPattern)• get/set(FieldPattern)• (pre)initialization(ConstructorPattern)• staticinitialization(TypePattern)• handler(TypePattern)• adviceexecution()• within(TypePattern)• withincode(MethodPattern/ConstructorPattern)• this(Type or Id)• target(Type or Id)• args(Type or Id, ...)
08.02.2010 Advanced Software Engineering 14
Komplexe Pointcuts
• cflow(Pointcut)• cflowbelow(Pointcut)• PointcutId(TypePattern or Id, ...)• if(BooleanExpression)• ! Pointcut• Pointcut0 && Pointcut1• Pointcut0 || Pointcut1• ( Pointcut )
08.02.2010 Advanced Software Engineering 15
Pointcut Beispiele
• call (Methodenpattern)– call(public void calculateSum())– call(public *(..))– call(*(int))– call(private * Account.*(..))
• handler(TypePattern)– handler(IOException)
• args– args(int, int)– args(e, int)– args(BankAccount, m)
• &&– call(private * Account.*(int, SecReg)) && args(i, s)
08.02.2010 Advanced Software Engineering 16
Pointcut Beispiele
• pointcut publicMethods(): call (public * *(..));
• pointcut accountConstructor(): call(public Account(..));
• pointcut publicAccountMethod(Account a):call(public void VisToken.*(Account, int) && args(a, *);
• pointcut exHandler(Exception e):handler(IOException) && args(e);
• pointcut accountCalls(): this(Account);08.02.2010 Advanced Software Engineering 17
Advice
• Advice spezifizieren den Quelltext, der eingefügt wird, falls der angegebene Pointcut erreicht wird
• Syntax[ strictfp ] AdviceSpec[ throws TypeList ] : Pointcut { Body }
• Dabei ist Advicespec– before( Formals )
– after( Formals ) returning [ ( Formal ) ]
– after( Formals ) throwing [ ( Formal ) ]
– after( Formals )
– Type around( Formals )
08.02.2010 Advanced Software Engineering 18
Advice Beispiele
• pointcut test(): call(public * *());• pointcut getInt(int i): args(i) && call(public * *(int))
• after() : test() {do_something()};• after() returning (Account a): test() {System.out.println(a); };• before(int i) : test(i) { LogUnit.getLogger().log(i) };• Account around(): call(* modifyAccount(..)) {
System.err.println(„modifyAccount deprecated“);return Account.emptyAccount; };
08.02.2010 Advanced Software Engineering 19
Intertype Declarations
• Über spezielle Aspekte (Intertype Deklarationen) können bestehende Klassen um zusätzliche Methoden, Konstruktoren und Attribute erweitert werden
• Erweiterung von Klassen in Bibliotheken möglich
public aspect ZusatzZahlAspect {public int lotto.Ziehung.zusatzzahl = 0;public int lotto.Ziehung.zieheZusatzzahl() {
zusatzzahl = trommel.getNumber().intValue();return zusatzzahl;
}
08.02.2010 Advanced Software Engineering 20