Aspekt-orientierte Programmierung



Ähnliche Dokumente
Aspekt Orientierte Programmierung

Einführung in AOP. Rico Schiekel rschiekel@web.de. Agenda. Kernproblem der Objekt Orientierung

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Java Kurs für Anfänger Einheit 5 Methoden

Objektorientierte Programmierung

Java: Vererbung. Teil 3: super()

Objektorientierte Programmierung

SEP 114. Design by Contract

Objektorientierte Programmierung. Kapitel 12: Interfaces

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Client-Server-Beziehungen

Einführung in die Programmierung

Operationalisierbare Qualitätskriterien für die Programmierung mit Erfahrungen aus PRÜ1 und PRÜ2

Einführung in die Java- Programmierung

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Advanced Software Engineering WS0910 Kapitel4. Dr. Dominik Haneberg

Aspektorientierte Programmierung (aspect-oriented programming, AOP)

Daniel Warneke Ein Vortrag im Rahmen des Proseminars Software Pioneers

Programmieren in Java

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Programmierkurs Java

Testen mit JUnit. Motivation

Prinzipien Objektorientierter Programmierung

Klausur zur Einführung in die objektorientierte Programmierung mit Java

5.2 Neue Projekte erstellen

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Code wiederverwenden: Objektorientierte Programmierung (OOP) sinnvoll nutzen Roland Wagner Automatisierungstreff IT & Automation 2015

Innere Klassen in Java

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Kapitel 6. Vererbung

Vorkurs C++ Programmierung

Software Engineering Klassendiagramme Assoziationen

Grundlagen von Python

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

Zählen von Objekten einer bestimmten Klasse

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

Java Einführung Collections

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

GRS SIGNUM Product-Lifecycle-Management

Gründe für fehlende Vorsorgemaßnahmen gegen Krankheit

Kostenstellen verwalten. Tipps & Tricks

Tagesprogramm

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.

Graphic Coding. Klausur. 9. Februar Kurs A

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Klassendefinitionen verstehen

Typumwandlungen bei Referenztypen

Aufgabenblatt Nr. 5 Generizität und TicTacToe

Objektorientierte Programmierung OOP

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Was meinen die Leute eigentlich mit: Grexit?

Abschnitt 12: Strukturierung von Java-Programmen: Packages

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen.

Dokumentation für das Spiel Pong

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Kapitel 6. Vererbung

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Fassade. Objektbasiertes Strukturmuster. C. Restorff & M. Rohlfing

Workshop 6. Einführung in die objektorientierte Programmierung. Teil: Java mit BlueJ

Datenbanken Kapitel 2

Kapitel 6. Vererbung

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Grundlagen. Kapitel 1

SEMINAR Modifikation für die Nutzung des Community Builders

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

13. Tutorium zu Programmieren

Kurzanleitung zu. von Daniel Jettka

BIF/SWE - Übungsbeispiel

Im Folgenden wird Ihnen an einem Beispiel erklärt, wie Sie Excel-Anlagen und Excel-Vorlagen erstellen können.

Übung 6: Feinentwurf. Prof. Dr. Dr. h.c. Manfred Broy Dr. Herbert Ehler, Martin Feilkas 6. Juli 2006 Bernd Spanfelner, Sebastian Winter

Mobile-Szenario in der Integrationskomponente einrichten

BEISPIELKLAUSUR Softwareentwicklung:

Übungen Programmieren 1 Felix Rohrer. Übungen

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Programmieren Tutorium

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Qt-Projekte mit Visual Studio 2005

Informatik für Schüler, Foliensatz 21 Objektorientierte Programmierung

StuPro-Seminar Dokumentation in der Software-Wartung. StuPro-Seminar Probleme und Schwierigkeiten in der Software-Wartung.

Professionelle Seminare im Bereich MS-Office

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Einführung in die Programmierung

Willkommen bei KONTAKTMANAGEMENT INTERAKTIVE-TOUR

Kapitel 12 Dokumentation und Zugriffsrechte

5. Abstrakte Klassen

Individuelle Formulare

Java Einführung Operatoren Kapitel 2 und 3

BFV Widget Kurzdokumentation

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:

Transkript:

Aspekt-orientierte Programmierung Andreas Zeller Lehrstuhl für Softwaretechnik Universität des Saarlandes, Saarbrücken 2006-01-09 Separation der Interessen Die Separation der Interessen (separation of concerns) ist ein Grundprinzip der Softwaretechnik. Seit Beginn der Programmierung wurden Konzepte entwickelt, um Teile des Systems isoliert betrachten zu können. Separation der Interessen: der heilige Gral der Softwaretechnik Separation der Interessen (2) Die Konzepte zur Separation der Interessen definieren ganze Paradigmen der Programmierung: Unterprogramme und Funktionen in der imperativen Programmierung: Jede Funktion realisiert eine bestimmte Funktion. Module und abstrakte Datentypen in der modularen Programmierung: Ein Modul fasst Daten und Zugriffsfunktionen zusammen Objekte und Klassen in der objektorientierten Programmierung Oberklassen fassen Gemeinsamkeiten zusammen 1

Aspekte in Apache Wir betrachten den Quellcode des Apache-Servers: Der Code zum XML-Parsen steckt in einer eigenen Klasse (rot) Quelle: aspectj.org Aspekte in Apache (2) Auch der Code zum Matchen von URLs steckt in zwei Klassen (Ober- und Unterklasse): Gute Separation der Interessen! 2

Aspekte in Apache (3) Log-Meldungen aber sind über den gesamten Code verteilt: Frage: Kann man das Logging besser lokalisieren? Aspekte in Apache (4) In den Apache-Methoden sind mehrere Aspekte verwoben: die eigentliche Funktionalität wie XML- oder URL-Parsen (nach denen sie Klassen zugeordnet sind) das Logging, das den Programmablauf dokumentiert In Apache sind die Methoden den Klassen gemäß der eigentlichen Funktionalität zugeordnet zufriedenstellende Struktur, dominante Dekomposition Würde man alternativ eine Klasse mit der Zuständigkeit Logging einführen, müssten alle Methoden, die Log-Ausgaben produzieren, dieser Klasse zugeordnet werden monolithische Struktur! Aspekte in Apache (5) Die verwobenen Aspekte der Apache-Methoden machen jedoch Probleme. Beispiel: Wir führen ein neues Log-Format ein. Folge: Wir müssen alle Methoden ändern, in denen Logging praktiziert wird. Das Logging lässt sich nicht kapseln: Tyrannei der dominanten Dekomposition! 3

Aspekte beim Figurenzeichnen Beispiel: Einfache Figurenbibliothek Figure 0..* FigureElement Display Point Line +getx() +gety() +setx(x:int) +sety(y:int) 2 +getp1() +getp2() +setp1(p1:point) +setp2(p2:point) Aspekte beim Figurenzeichnen (2) Jede set-methode ruft display.update() auf: Figure 0..* FigureElement Display Point Line +getx() +gety() +setx(x:int) +sety(y:int) 2 +getp1() +getp2() +setp1(p1:point) +setp2(p2:point) ruft display.update()auf 4

Aspekte beim Figurenzeichnen (3) Auch dies ist ein verwobener Aspekt: Figure 0..* FigureElement Display Point Line +getx() +gety() +setx(x:int) +sety(y:int) 2 +getp1() +getp2() +setp1(p1:point) +setp2(p2:point) DisplayUpdating Die set-methoden ändern die jeweiligen Attribute (1. Aspekt) und aktualisieren die Anzeige (2. Aspekt) Verwobene Aspekte Generell machen verwobene Aspekte folgende Probleme: Redundanter Code. Gleiche oder ähnliche Code-Fragmente finden sich an vielen Stellen im Programmtext Schwer verständlicher Code. Aspekte wie Logging oder DisplayUpdating sind nicht als eigene syntaktische Einheit realisiert Schwer änderbarer Code. Bei Änderungen müssen alle Code-Teile identifiziert werden (und konsistent und sicher geändert werden) 5

Aspekt-orientierte Programmierung Modulübergreifende Sachverhalte ( Aspekte ) treten in komplexen Systemen ständig auf haben eine klare Zuständigkeit haben eine klare Struktur: bestimmte Menge von Methoden, überschreiten Modulgrenzen, werden an bestimmten Stellen benutzt Also schaffen wir entsprechende syntaktische Strukturen! Aspekt-orientierte Programmierung Aspekt-orientierte Programmierung (AOP) führt Aspekte als eigene syntaktische Strukturen ein erhöht die Modularität von (OO-)Programmen in Bezug auf Aspekte. Wozu ein neuer Ansatz? Braucht man aspekt-orientierte Programmierung? Nein, alles ist mit Objekten beschreibbar! Braucht man objekt-orientierte Programmierung? Nein, alles ist mit Funktionen modellierbar! Braucht man Funktionen? Nein, alles ist mit Sprüngen modellierbar! etc. etc. Aspekte in AspectJ AspectJ ist eine Erweiterung von Java (von XEROX PARC) Grundideen: Aspekte (aspects) fassen Code (advices) zusammen, der an bestimmten Stellen im Programm (join points, point cuts) ausgeführt wird. Aspekte werden mit dem restlichen Code zu einem Java-Programm verwoben 6

Join Points Ein Join Point ist ein wohldefinierter Punkt im Programmfluss. AspectJ unterstützt zahlreiche Arten von Join Points. Wir betrachten zunächst nur einen, den Aufruf einer Methode (call): Der Join Point call(void Point.setX(int)) definiert den Aufruf der Methode void Point.setX(int). Weitere Arten: get, set, within, cflow Pointcuts Ein Pointcut besteht aus bestimmten Join Points (und ggf. Werten an diesen join points). In Pointcuts werden mehrere Join Points durch boolesche Operationen zusammengefasst. Beispiel Der Pointcut setter fasst die Join Points bei setx und sety zusammen. pointcut setter(): (call(void Point.setX(int)) call(void Point.setY(int))); Pointcuts (2) Der Pointcut move fasst alle Methodenaufrufe zusammen, die die Position eines Punktes oder einer Linie ändern: pointcut move(): call(void Point.setX(int)) call(void Point.setY(int)) call(void Line.setP1(Point)) call(void Line.setP2(Point)); Advices Ein Advice ist Code, der ausgeführt wird, wenn ein Pointcut erreicht wird. Ein After Advice ( after ) wird nach dem Methodenaufruf des Join Points ausgeführt. Beispiel nach jedem Ändern einer Position einen Text ausgeben: 7

after(): move() { System.out.println("A figure element moved."); Weitere Arten: before, around Advices (2) Advices können auf den Kontext der Join Points zurückgreifen. Der Pointcut setp merkt sich, welche Linie und welcher Punkt im Aufruf von void a_line.setp*(p) betroffen sind: pointcut setp(line a_line, Point p): call(void a_line.setp*(p)); after(line a_line, Point p): setp(a_line, p) { System.out.println( a_line + " moved to " + p + "."); Aspects Ein Aspect fasst Advices zu einer syntaktischen Einheit zusammen: aspect DisplayUpdating { pointcut move(): call(void Point.setX(int)) call(void Point.setY(int)) call(void Line.setP1(Point)) call(void Line.setP2(Point)); after(): move() { Display.update(); Aspects (2) Wir benutzen den Before Advice ( before ), der vor dem Methodenaufruf des Join Points ausgeführt wird. 8

aspect CheckPointsRange { pointcut set_x(point p, int x): call(void p.setx(x)); before(): set_x(p, new_x) { if (x < MIN_X x > MAX_X) throw new IllegalArgumentException( "x is out of bounds."); // set_y analog Aspect Weaver Der Aspect Weaver fasst Aspekte und Code zusammen: Komponenten! code AspectWeaver OO!Code Aspektcode Compiler lauffähiges Programm 9

Anwendungen von Aspekten Wir betrachten einige typische Anwendungen von Aspekten: Entwicklung Logging Profiling Produktion Änderungen verfolgen Konsistentes Verhalten Logging Wir definieren einen einfachen Aspekt zum Verfolgen von Aufrufen: aspect SimpleTracing { pointcut tracedcall(): call(void FigureElement.draw(GraphicsContext)); before(): tracedcall() { System.out.println("Entering: " + thisjoinpoint); thisjoinpoint enthält den aktuellen Join Point Profiling Wir definieren einen Aspekt zum Zählen von Aufrufen: aspect SetsInRotateCounting { int rotatecount = 0; // aspects are singletons int setcount = 0; before(): call(void Line.rotate(double)) { rotatecount++; before(): call(void Point.set*(int)) && cflow(call(void Line.rotate(double))) { setcount++; 10

cflow(x): Kontrollfluss des Join Points x Aspekte in der Entwicklung AOP bietet Vorteile in der Entwicklung: Diagnose-Code ist leicht definierbar Diagnose-Code ist in Aspekt eingekapselt Diagnose-Code ist leicht kombinierbar und abschaltbar Änderungen verfolgen MoveTracking merkt sich, ob ein Objekt bewegt wurde: aspect MoveTracking { private static boolean dirty = false; public static boolean testandclear() { boolean result = dirty; dirty = false; return result; pointcut move(): /* wie gesehen */; after() returning: move() { dirty = true; Konsistentes Verhalten Wir möchten alle Fehler in Methoden com.xerox.* protokollieren: aspect PublicErrorLogging { Log log = new Log(); pointcut publicmethodcall(): call(public * com.xerox.*.*(..)); after() throwing (Error e): publicmethodcall() { log.write(e); 11

Aspekte in der Produktion Aspekte bieten Vorteile in der Produktion: Die Struktur der übergreifenden Zuständigkeit ist klar sichtbar Einfachere Evolution (z.b. MoveTracking merkt sich, welche Objekte bewegt wurden) Optionale Funktionalität (die in Aspekten gekapselt ist) und freie Konfigurierbarkeit Sicherere Implementierung (z.b. auch nach Hinzufügen einer Line-Unterklasse wird Display.update() aufgerufen) Introduction Mit AspectJ ist es auch möglich, bestehende Klassen zu verändern und zu erweitern (introduction): aspect PointName { public String Point.name; public void Point.setName(String name) { this.name = name; fügt der Klasse Point ein neues Attribut name und eine Methode setname hinzu. Introduction (2) Introduction geht auch für mehrere Klassen gleichzeitig. Beispiel wir erlauben das Klonen von Figuren: aspect CloneableFigures { declare parents: (Point Line Square) implements Cloneable; public Object (Point Line Square).clone() throws CloneNotSupportedException { return super.clone(); 12

Kritik an AOP Nicht-lokaler Aufbau von AOP-Programmen erschwert Verständnis (wie auch schon bei OO-Programmen) Mögliche Interferenz von Aspekten Reihenfolge der Anwendung kann Schwierigkeiten bereiten Es ist kaum möglich, Aussagen über alle möglichen Aspekt-Kombinationen zu machen, da ein Aspekt alles ändern kann. Nutzen von AOP für orthogonale Funktionalität (z.b. Logging) ist unbestritten Lohnt sich AOP? Experiment (von Kiczales et al.): Überarbeitung eines Bildverarbeitungssystems Einsatz von Aspekten in der nichtoptimierten Variante, um Optimierungen einzufügen: Effizienzsteigerung um Faktor 100 (!) Überarbeitung der handoptimierten Variante: nur noch 1039 statt 35213 Zeilen Lohnt sich AOP? (2) Experiment (von Murphy et al.): Zwei Gruppen eine AspectJ, eine Java Debugging: AspectJ-Gruppe schneller im Finden und Beheben von Fehlern Änderung eines existierenden Systems: Kein Unterschied 13

Zusammenfassung Aspekt-Orientierte Programmierung (AOP) führt mit Aspekten einen neuen Modularisierungsbegriff ein Aspekte ermöglichen es, existierenden Systemen nach Belieben Code hinzuzufügen, um das System um genau definierte Funktionalitäten zu erweitern Aspekte brechen die Tyrannei der dominanten Dekomposition Aspekte sind leicht wiederverwendbar und wartbar Aspekte sind (derzeit) rein syntaktische Erweiterungen Aspekte bringen die meisten Vorteile für orthogonale Funktionalität (etwa Fehlersuche) Literatur http://aosd.net/ Alles über aspekt-orientierte Software-Entwicklung http://eclipse.org/aspectj/ Alles über AspectJ http://www.research.ibm.com/hyperspace/ Hyper/J, ein alternativer Ansatz ( subjekt-orientierte Programmierung ) Communications of the ACM, Oct. 2001 Themenheft Aspektorientierte Programmierung Zugang über ACM Digital Library (via Informatikbibliothek) 14