Advanced Software Engineering – WS0910 – Kapitel2 fileAnwendung, die nicht einem einzigen...

20
Advanced Software Engineering – WS0910 – Kapitel4 Dr. Dominik Haneberg

Transcript of Advanced Software Engineering – WS0910 – Kapitel2 fileAnwendung, die nicht einem einzigen...

Advanced Software Engineering – WS0910 – Kapitel4Dr. Dominik Haneberg

ASPEKT-ORIENTIERTE ENTWICKLUNG

08.02.2010 Advanced Software Engineering 2

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.

Vorführender
Präsentationsnotizen
Bei einer Lagerverwaltung zum Beispiel sind Bestandsverwaltung, Disposition und Nachschub mögliche Module. Aspekte sind z. B. Anforderungen wie Transaktionsverwaltung, Auditfähigkeit und Loggingverhalten, die für alle Module in der Lagerverwaltung gelten. Also behandelt ein Aspekt einen Cross-Cutting Concern („querschnittlichen Belang“) von mehreren Softwaremodulen. Es gibt auch Aspekte die über unterschiedliche Komponenten verteilt sind + Gruppierung der Verantwortlichkeiten schwer möglich + Austauschbarkeit des Systems in unterschiedlichen Umgebungen (Adaptivität) ist nicht gegeben + Quelltextduplizierung als Folge

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

Vorführender
Präsentationsnotizen
Die Jointpoints, an denen tatsächlich eine Änderung des Verhaltens passiert, werden erst durch pointcuts selektiert

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

Vorführender
Präsentationsnotizen
Es sind logische Kombinationen von pointcuts möglich, z.b. call(methode1) || call(methode2) && !(target(mypackage.MyClass))

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

Vorführender
Präsentationsnotizen
Intertype Deklarationen sind mit Vorsicht zu genießen. Sie haben aber durchaus sinnvolle Anwendungen, beispielsweise kann man so einer Collektionklasse der Java-Lib die Möglichkeit geben, einen Visitor anzunehmen, um so ein Visitor-Pattern umzusetzen.