Aspect Oriented Programming in C++ - TU Braunschweig+small.pdf · 16/01/12 2 Referenz Teile dieser...

53

Transcript of Aspect Oriented Programming in C++ - TU Braunschweig+small.pdf · 16/01/12 2 Referenz Teile dieser...

16/01/12 1

Dipl.-Inform. Dominik JürgensInstitut für Wissenschaftliches RechnenTechnische Universität Braunschweig

Aspect Oriented Programming in C++

Überblick und Einsichten

16/01/12 2

Referenz

Teile dieser Präsentation sind stark angelehnt an :

�Aspect-Oriented Programming with C++ and AspectC++� from AOSD.07 Konferenz

� Olaf Spinczyk, Friedrich-Alexander-University

� Daniel Lohmann, Friedrich-Alexander-University

16/01/12 3

Der rote Faden

� Warum AOP?� Wie AOP mit C++-Templates?� Die Konzepte hinter AOP� Grenzen der AOP mit Templates� AspectC++

16/01/12 4

Der rote Faden

� Warum AOP?Warum AOP?� Wie AOP mit C++-Templates?� Die Konzepte hinter AOP� Grenzen der AOP mit Templates� AspectC++

16/01/12 5

Architektureller Softwareentwurf

� Im Softwareentwurf werden komplexe Systeme in unabhängige Teilsysteme zerlegt und über Schnittstellen miteinander verbunden

Model View

Controller

Data

16/01/12 6

logging,... logging,...

Error handling,...

middleware,...

Nicht-funktionale Angelegenheiten

� Nicht-funktionale Angelegenheiten:� tracing, synchronization, security, buffering,

error handling, constraint checks, middle-ware

Model View

Controller

Data

16/01/12 7

logging,... logging,...

Error handling,...

middleware,...

Nicht-funktionale Angelegenheiten

� Nicht-funktionale Angelegenheiten:� tracing, synchronization, security, buffering,

error handling, constraint checks, middle-ware

Model View

Controller

Data

Funktionseinheit?

16/01/12 8

Zusammenfassung

� Nicht-funktionale Angelegenheiten können:� Sich auf mehrere Funktionseinheiten

zerstreuen� Unabhängig von Funktionseinheiten

existieren

Zerlegung in Komponenten und Aspekte

Das zeigt sich auch in realen Projekten

Code for Logging in the Apache Tomcat

Funktionseinheiten

Beispiel

Beispiel: Code der Queue Komponente

Beispiel: Code der Queue Komponente

Zusätzliche Anforderungen:

�Element Counter�Error Handling with exceptions

�Thread-Safety

Erweiterete Queue

COUNTER THREAD

EXCEPTION

16/01/12 14

Der rote Faden

� Warum AOP?� Wie AOP mit C++-Templates?Wie AOP mit C++-Templates?� Die Konzepte hinter AOP� Grenzen der AOP mit Templates� AspectC++

Mit dem Preprocessor

Counting Aspekt: Basic Idea

OO Erweiterung

Weaving

� Das verbinden (verweben) von Komponenten mit Aspekten wird in der AOP Weaving genannt:

16/01/12 18

Der rote Faden

� Warum AOP?� Wie AOP mit C++-Templates?� Die Konzepte hinter AOPDie Konzepte hinter AOP� Grenzen der AOP mit Templates� AspectC++

16/01/12 19

JoinPoint Model

Eine Konzeptbeschreibung braucht ein JoinPoint Model (JPM) und damit Mechanismen zur:

� Spezifikation zusätzlicher Funktionalität (Advice � Anweisung)

� Spezifikation von Mengen von Code- Stellen (Pointcuts � Schnittpunktmenge)

� Interaktion mit konkreten Code-Stellen (Joinpoints � Verbindungstellen)

16/01/12 20

Der rote Faden

� Warum AOP?� Wie AOP mit C++-Templates?� Die Konzepte hinter AOPDie Konzepte hinter AOP� Grenzen der AOP mit Templates� AspectC++

16/01/12 21

Locking-Konzept

Die KodeänderungKodeänderung (Advice) legt sich um die gegebene Implementierung herum.

Es handelt sich um einen so genannten arround advicearround advice.

16/01/12 22

Locking-Konzept

Um den Advice Advice an anderen Joinpoints wiederzuverwenden.müsste Code dubliziert werden.

16/01/12 23

Alternative zur Behandlung von mehreren Joinpoints

� Einschränkung: Joinpoints müssen immer die gleiche Schnittstelle haben

...

Kontext wird übergeben

Kontext wird übergeben

KeineDublikation

16/01/12 24

Weving: Jetzt wird�s langsam zu bunt

� Der benutzende Code muss jetzt einen anderen Typ benutzen

� Lösung: Namespacing...

Selektion

16/01/12 25

Der rote Faden

� Warum AOP?� Wie AOP mit C++-Templates?� Die Konzepte hinter AOP� Grenzen der AOP mit TemplatesGrenzen der AOP mit Templates� AspectC++

16/01/12 26

Grenzen

� Typen von Joinpoints:� Keine Unterscheidung zwischen

Funktionsaufruf und seiner Ausführung� Keine generische Schnittstelle zum

Kontext� Kein zugriff auf private Methoden

� Im Vergleich zu echten AOP Lösungen:� Kein flexibler Weg um Änderungsziele

anzugeben (AC++ Pointcuts)� Interfaces müssen fix bleiben, oder

enden in exzessiver Meta-Programmierung

16/01/12 27

Grenzen II:

� Skalierbarkeit:� Der Wrapper kann schnell viel

aufwendiger werden als der Aspekt selbst� Die Reihenfolge der Template-

Instantiierung spielt eine wichtige Rolle� Exzessive Meta-Programmierung um

Aspekte zu realisierten macht den Code (wenigstens für dritte) schwer zu verstehen

16/01/12 28

Grenzen II:

� Skalierbarkeit:� Der Wrapper kann schnell viel

aufwendiger werden als der Aspekt selbst� Die Reihenfolge der Template-

Instantiierung spielt eine wichtige Rolle� Exzessive Meta-Programmierung um

Aspekte zu realisierten macht den Code (wenigstens für dritte) schwer zu verstehen

16/01/12 29

Der rote Faden

� Warum AOP?� Wie AOP mit C++-Templates?� Die Konzepte hinter AOP� Grenzen der AOP mit Templates� AspectC++AspectC++

16/01/12 30

Ein kleines Beispiel: main.cc

#include <iostream>#include <math.h>

double _sin(double v){ return sin(v);}

int main(){

for(int i=0;i<3;i++){ std::cout << sin((double)i*0.1) << std::endl; std::cout << _sin((double)i*0.1) << std::endl;}

}

16/01/12 31

Ein kleines Beispiel: Aspect.ah

#include <iostream>#include <math.h>

double _sin(double v){ return sin(v);}

int main(){

for(int i=0;i<3;i++){ std::cout << sin((double)i*0.1) << std::endl; std::cout << _sin((double)i*0.1) << std::endl;}

}

#include <iostream>using namespace std;aspect Trace { pointcut functions() = "% ...::%(...)" ; advice execution(functions()) : around() { std::cout << "before-> " << JoinPoint::signature()<< "("; for(unsigned i=0; i < JoinPoint::ARGS; i++) std::cout << (i ? ", " : "") << JoinPoint::argtype(i); std::cout << ")" << std::endl; tjp->proceed(); std::cout << "<-after" << std::endl; }};

16/01/12 32

Ein kleines Beispiel: Ausführung und Ausgabe

$ ag++ main.cc -o main $ ./mainbefore-> int main()()0before-> double _sin(double)(d)<-after00.0998334before-> double _sin(double)(d)<-after0.09983340.198669before-> double _sin(double)(d)<-after0.198669<-after

Weaving

16/01/12 33

Nochmal die Queue

16/01/12 34

Element Counting Aspect

16/01/12 35

Element Counting Aspect

Aspekte sehen ähnlich aus wie Klassen

16/01/12 36

Element Counting Aspect

Attribute und Methoden

16/01/12 37

Element Counting Aspect

Ein after advice ist crosscutting code,der nach einer bestimmten Position

im Kontrollfluß ausgeführt werden soll

16/01/12 38

Element Counting Aspect

Pointcut-Ausdruck ist eine Art typ-sensitiver regulärer Ausdruck.

Treffer werden in die Pointcut-Mengedes Advice aufgenommen

16/01/12 39

Element Counting Aspect

Zugriff auf Aspekt-Member ausdem Body eines Advice

16/01/12 40

Element Counting Aspect

Problem: Der Counter gehört zum Aspekt, nicht zur Klasse.Er ist statisch für alle Objekte.

16/01/12 41

Slicing

16/01/12 42

Slicing

Klasse erweitern

16/01/12 43

Slicing

Eine Kontextvariable queuewird mit that gebunden

that: aussenstehendes this

16/01/12 44

Slicing

Kontext-Objekt nutzen.

16/01/12 45

Slicing

Zugriff auf Konstruktorzur Initialisierung

16/01/12 46

Aspekt Vererbung

Ein konkreter AspektErbt und überschreibt

Virtuelle Pointcuts

16/01/12 47

Ordnung von Aspekt

� Grundsätzlich sollten Aspekte in beliebiger Reihenfolge instantiierbar sein, das ist allerdings nicht immer möglich:

16/01/12 48

Aspekte individualisieren

� Grundsätzlich sind Aspekte Singletons� Sollen mehrere Instanzen z.B. pro

Thread, pro Client vorhanden sein:

16/01/12 49

Ein weiteres komplexeres Beispiel: Observer Pattern

16/01/12 50

Aspekte

Das Observer-Protokoll schneitet mehrere Funktionseinheiten.

16/01/12 51

Abstraktes Observer Pattern als Aspekt

16/01/12 52

Spezialisierung für die Clock

16/01/12 53

Zusammenfassung

� Vorhandener C++ Code lässt sich mit AC++ erweitern

� Eingriff in vorhandenen Code ist nicht erforderlich

� Aspekte helfen dabei vormals verflochtenen Code zu entflechten

� Einsatz von abstrakten Mustern ist sehr einfach

Aspect-Oriented Programming, Gregor Kiczales etal.