1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

22
1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung

Transcript of 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

Page 1: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

1 TIT10AIK @ WS 2012

Software-Engineering II

Aspektorientierung

Page 2: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

2 TIT10AIK @ WS 2012

Themenübersicht» Objektorientierung» Aspektorientierung» Vorgehensmodelle» UML» Analyse- & Entwurfsmuster» Objektorientiertes Testen» Versionsverwaltung» Refactoring» Labor (Praktischer Teil)

Page 3: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

3 TIT10AIK @ WS 2012

Aspektorientierung

Projektdokumentation:

http://www.eclipse.org/aspectj/doc/released/progguide/

Page 4: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

4 TIT10AIK @ WS 2012

Aspektorientierung

» Programmierparadigma (Prinzip)» Erweiterung der herkömmlichen (objektorientierten) Programmierung

» Hilft dabei, Anwendungen strukturierter aufzubauen

Page 5: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

5 TIT10AIK @ WS 2012

Grundproblem

» Man kann die generellen Aufgaben, die Applikationen erfüllen müssen in zwei bereiche Aufteilen» Core-Level-Concerns: Erfüllen die funktionalen Anforderungen der Software (Berechnungen, …)

» System-Level-Concers: Erfüllen die technischen Randbedingungen der Software (Logging, …)

» Diese zwei Ebenen sind in Software-Systemen fast immer sehr eng verwoben» „Cross-Cutting-Concerns“

» Bei der Programmierung sollte es stets das Ziel sein, Methoden möglichst einfach und für einen dedizierten Zweck zu schreiben» Vermeidung von Cross-Cutting-Concerns

Page 6: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

6 TIT10AIK @ WS 2012

Die Idee des Aspekts

» Durch die Definition eines Aspektes ist es möglich, Code bei bestimmten Ereignissen auszuführen» Beispiel: Immer vor dem Ausführen der Methode „setName“ soll ein Text auf der Kommandozeile ausgegeben werden

» Mimimierung der Vermischung von System-Level-Concerns und Core-Level-Concerns in Methoden

Page 7: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

7 TIT10AIK @ WS 2012

Beispiel: SQL-Statement

» Applikation führt Datenbank-Abfragen aus» Alle SQL-Queries müssen vor und nach dem Ausführen in ein Log-File eingetragen werden => Fehleranalyse und Benchmarking

void execute( String query ){ Logger.Log( “START DB-Query @“ + new Date() + “: “ + query ); myDBMS.connect(…); myDBMS.execute(query); myDBMS.disconnect(…); Logger.Log( “END DB-Query @“ + new Date() + “: “ + query );}

====8<====8<====8<====8<====8<====8<====8<====8<====8<====8<====8<====8<====START DB-Query @Mon Jan 01 12:00:00 CEST 2007: SELECT `password` FROM `user` WHERE `status` = ‘secret‘;END DB-Query @Mon Jan 01 12:00:01 CEST 2007: SELECT `password` FROM `user` WHERE `status` = ‘secret‘;START DB-Query @Mon Jan 01 12:00:01 CEST 2007: UPDATE `user` SET `password` = ‘hijacked‘;END DB-Query @Mon Jan 01 12:00:29 CEST 2007: UPDATE `user` SET `password` = ‘hijacked‘;====8<====8<====8<====8<====8<====8<====8<====8<====8<====8<====8<====8<====

System-Level-Concerns

Page 8: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

8 TIT10AIK @ WS 2012

Werkzeuge

» Für Java: AspectJ» Java hat Aspekte nicht als Feature in die Programmiersprache implementiert

=> Keine native Unterstützung» Durch sogenanntes „weaving“ wird der Aspekt-Code in die Class-Dateien, die durch die Aspekte betroffen sind, eingesetzt („eingewoben“)» AspectJ führt dies beim Compilieren der Code-Dateien durch

Page 9: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

9 TIT10AIK @ WS 2012

Download

» AOP-Library: http://www.eclipse.org/aspectj/

» Mit Eclipse-Integration:http://www.eclipse.org/ajdt/

Voraussetzung: Passende Version von Eclipse mit PDE

(Plugin Development Environment)

-> http://www.eclipse.org/

Page 10: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

10 TIT10AIK @ WS 2012

Neues AspectJ-Projekt

Page 11: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

11 TIT10AIK @ WS 2012

Neue Klasse

sayHello-Methode

Console-Output

Page 12: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

12 TIT10AIK @ WS 2012

Aspekt anlegen I

Neuen Aspektanlegen

Page 13: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

13 TIT10AIK @ WS 2012

Aspekt anlegen II

Aspekt-definition

Page 14: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

14 TIT10AIK @ WS 2012

Methodenaufruf überwachen

[advice]: call( [return] [class].[method]([signature]) { [action] }

» [advice]: Definiert den Zeitpunkt der Überwachung» before(): Vor dem Methodenaufruf» after(): Nach dem Methodenaufruf (unabh. vom Ausgang)» after() throwing: Wenn die Methode mit einer Exception geendet ist» after() returning: Wenn die Methode regulär beendet wurde

» [return]: Der Rückgabetyp der Methode, auf den der Aspekt angewandt werden soll

» [class]: Der Name der Klasse, deren Methoden überwacht werden sollen» [method]: Der Name der Methode der zu überwachenden Methode» [signature]: Die Methodensignatur der zu überwachenden Methode» [action]: Java-Code, der im Eventfall ausgeführt werden soll

Im Bsp.:

before(): call( void HelloStudent.sayHello() ) {

System.out.println( "=== Saying hello ===" );

}

Page 15: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

15 TIT10AIK @ WS 2012

Wildcards

[advice]: call( [return] [class].[method]([signature]) { [action] }

» Es ist an den meisten Stellen einer Aspekt-Definition erlaubt Wildcards (mit * gekennzeichnet) an Stelle von konkreten Angaben zu verwenden

before(): call( * *.*() ) { System.out.println( "=== Calling any method ===" );}

Auch partielle Wildcards sind erlaubt:

before(): call( * Hello*.say*() ) { System.out.println( "=== Calling a special method ===" );}

Wildcards für die Methodensignatur: “..“

before(): call( * Hello*.say*( .. ) ) { System.out.println( "=== Calling a special method with any parameters ===" );}

Page 16: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

16 TIT10AIK @ WS 2012

Angewandt

» Werden der konkrete und der Wildcard-Aspekt zusammen auf das Beispiel angewandt, ergibt sich folgendes Ergebnis:

=== Saying hello ====== Calling any method ===Hello Student.

before(): call( void HelloStudent.sayHello() ) { System.out.println( "=== Saying hello ===" );}before(): call( * *.*() ) { System.out.println( "=== Calling any method ===" ); }

Page 17: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

17 TIT10AIK @ WS 2012

Pointcuts

» Um sich die eventuell öfters wiederkehrende Filter-Defintionen sparen zu können, wurden Pointcuts eingeführt

» Ein Pointcut spezifiert eine Filter-Definition (auch Join Point genannt) wie sie schon zuvor verwendet wurden

pointcut specialMethod(): call( void HelloStudent.sayHello() );

» Dieses Pointcut kann dann durch ein advice angewandt werden:

before(): specialMethod() { System.out.println( "=== Saying hello ===" );}

Page 18: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

18 TIT10AIK @ WS 2012

Parameter

» Für viele Anwendungen ist es sicherlich relevant, welche Parameter bei dem Methodenaufruf übergeben wurden

» Dies lässt sich über die Primitive args herausfinden

pointcut benotung( float note ): call( void DHStudent.setNote( float ) ) && args( note );

Die Primitive args fängt dabei die Methoden-Argumente ab und speichert sie in der definierten Variable note. Diese muss sowohl in den Klammern von args(…) als auch in der Bezeichnung des Pointcut definiert sein.

Angewandt werden kann dieses Pointcut folgendermaßen:

after( float note ) returning: benotung( note ) { System.out.println("Benotet " + note);}

Page 19: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

19 TIT10AIK @ WS 2012

Das aufgerufene Objekt

» So wie es möglich ist, die Parameter des Aufrufs zu erlangen, ist es auch möglich, herauszufinden, auf welches Objekt der Methodenaufruf stattfand

pointcut benotung( DHStudent student ): call( void DHStudent.setNote( float ) ) && target( student );

Wie bei den Parametern kann später auf die Instanz von DHStudent zugegriffen werden:

after( DHStudent student ) returning: benotung( student ) { System.out.println( "Student " + student + " wurde benotet." );}

Page 20: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

20 TIT10AIK @ WS 2012

@Annotation-Based

» Alternativ ist es möglich, Aspekte in herkömmlichen Java-Klassen mithilfe von Annotations zu definieren» Pointcut-Definition steht im Annotation-Value» Dabei sollte man Annotations in separaten Packages halten

@Aspectpublic class StudentAspect {  @Before("call(void DHStudent.setNote(float)) && target(student)") public void beforeSetNote(DHStudent student) { System.out.println("Student " + student + " wurde benotet. "); }}

Page 21: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

21 TIT10AIK @ WS 2012

Anwendung im BA-Umfeldpublic aspect Benotung {

pointcut benotung( DHStudent student, float note ): call( void DHStudent.setNote( float ) ) && args( note ) && target( student );

after( DHStudent student, float note ) returning: benotung( student, note ) { Studiengangsleiter.getInstance().NotifyBenotung( student, note ); }}

Beachte:Ohne das Ändern des Codes von BADozent oder BAStudent war es möglich, den Studiengangsleiter über eine Notengebung zu informieren!

Page 22: 1 TIT10AIK @ WS 2012 Software-Engineering II Aspektorientierung.

22 TIT10AIK @ WS 2012

Anwendung im BA-Umfeldpublic aspect Benotung {

pointcut benotung( DHStudent student, float note ): call( void DHStudent.setNote( float ) ) && args( note ) && target( student );

after( DHStudent student, float note ) returning: benotung( student, note ) { Studiengangsleiter.getInstance().NotifyBenotung( student, note ); }}

public class Studiengangsleiter { private static Studiengangsleiter sl = null; public static Studiengangsleiter getInstance() { if( Studiengangsleiter.sl == null ) { Studiengangsleiter.sl = new Studiengangsleiter(); } return Studiengangsleiter.sl; }

public void NotifyBenotung( DHStudent student, float note ) { System.out.println( "Habe Note " + note + " für Student " + student + " notiert." ); }}

Singleton Design-Pattern