La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Aspect Oriented programming with AspectJ Rebora Federico.

Presentazioni simili


Presentazione sul tema: "Aspect Oriented programming with AspectJ Rebora Federico."— Transcript della presentazione:

1 Aspect Oriented programming with AspectJ Rebora Federico

2 INTRODUZIONE Concern –Ogni sistema software è composto da concern modulari e concern di sistema. –Si prenda come esempio un piccolo editor di figure geometriche: Point, Line e FigureElement sono esempi di concern di modulo che la programmazione ad oggetti ben si adatta a modellare utilizzando concetti come ereditarietà e polimorfismo

3 INTRODUZIONE Crosscutting Concern –Le cose cambiano quando si tenta di rappresentare requisiti come logging, tracing, gestione della sicurezza, autenticazione ed altri. –Si tratta di concern di sistema, spesso ortogonali o indipendenti dagli altri, e che per loro natura risultano distribuiti in più moduli. –In questo caso si usa il termine crosscutting (traducibile cometrasversale).

4 INTRODUZIONE Esempio –Osservando il codice di org.apache.tomcat notiamo che funzionalità come lXML parsing (sono colorate in rosso le parti di codice interessate) vengono ben modellate con la OOP.

5 INTRODUZIONE Esempio –Osserviamo invece che il codice che gestisce il logging viene distribuito in quasi tutte le classi. Questo è un classico esempio di crosscutting concern.

6 AOP Programmazione Aspect Oriented –La nascita dellAspect Oriented Programming (AOP) si deve a XEROX PARC (Palo Alto Research Center) negli anni 90. –Concetto trasversale alla programmazione ad oggetti (anche se si integra con essa) in quanto ci aiuta ad affrontare in maniera elegante problematiche che riguardano lapplicazione nel suo insieme. –LAOP si occupa di trasformare in moduli i crosscut concern similmente a come il java trasforma in moduli (classi) i concern comuni.

7 AspectJ Cosa è AspectJ? –Per sperimentare i benefici del nuovo paradigma, si è utilizzato AspectJ, unestensione AOP di Java, sviluppato da Gregor Kiczales ed il suo gruppo alla Xerox PARC ed ora integrato nel progetto Eclipse, un potente ambiente di sviluppo Open Source. E possibile scaricarlo liberamente insieme a documentazione e sorgenti allindirizzo internet –AspectJ aggiunge a java il concetto di join point ed aggiunge un limitato numero di costrutti che vedremo nel seguito.

8 AspectJ I join point –Identificano dei punti nellesecuzione di un programma. –AspectJ fornisce vari strumenti (detti pointcut) per definire questi punti come la primitiva call: call(void Point.setX(int)) Identifica tutti i punti in cui viene chiamato il metodo che ha come signature void Point.setX(int) (metodo setX della classe Point che ha come parametro un intero).

9 AspectJ I join point –AspectJ permette di mettere insieme dei pointcut per generarne altri utilizzando gli operatori logici and, or e not (&&, || e !): call(void Point.setX(int)) || call(void Point.setY(int))) si riferisce ad una chiamata di setX(int) o di setY(int) nella classe Point

10 AspectJ Nominare un pointcut –E possibile assegnare un nome ad un pointcut: pointcut set(): call(void Point.setX(int)) || call(void Point.setY(int)); Il programmatore potrà riferirsi semplicemente a set() (se visibile in quel punto del codice) senza dover riscrivere il codice tutte le volte.

11 AspectJ Altri esempi di pointcut –Il pointcut successivo si riferisce a tutti i metodi della classe figure il cui nome inizia con make call(void Figure.make*(..)) –Questo si riferisce a tutti i metodi public della classe Figure call(public * Figure.* (..))

12 AspectJ Advice –I pointcut stabiliscono dei punti nellesecuzione del programma e non si occupano di nientaltro. Per fare qualcosa quando si raggiunge quel preciso join point utilizziamo gli Advice. before(): set() { System.out.println(About to set); } Il blocco di codice viene eseguito prima di eseguire il codice del join point.

13 AspectJ Advice –Allo stesso modo è possibile eseguire il codice dopo lesecuzione del join point tramite ladvice After(): after() return: set() { System.out.println(I have set); } Esistono tre tipi di advice: after returning, after throwing e plain after (viene eseguito in entrambi i casi).

14 AspectJ Context exposing –I pointcut possono esporre parte del contesto di esecuzione nel loro join point. –I valori esposti da un pointcut possono essere utilizzati nel codice delladvice: after(Point p, int x) returning: call(void Point.setX(int)) && target(p) && args(x) { System.out.println(p + moved to: " + x); } Nellesempio notiamo le primitive target ed args che servono a pubblicare i valori di p ed x.

15 AspectJ Inter-type declarations –Dichiarazioni indipendenti dalla gerarchia delle classi. –Le inter-type declarations agiscono a livello statico (compile- time). –Ad esempio vogliamo implementare un concern in un certo numero di classi della nostra applicazione. In java potremmo creare uninterfaccia ed implementarne i metodi in ciascuna classe interessata. –AspectJ ci fornisce uno strumento totalmente indipendente dalle classi interessate per definire questo concern: le inter-type declarations.

16 AspectJ Inter-type declarations –Immaginiamo di implementare degli oggetti Screen cheosservano i nostri oggetti Point e vanno aggiornati ogni volta che il Point che stanno osservando cambia. –E possibile implementare questa funzione aggiungendo un campo nella classe Point contente la lista degli oggetti che stanno osservando quel punto. aspect PointObserving { private Vector Point.observers = new Vector();... } Con questo semplice costrutto abbiamo aggiunto il campo observers nella classe Point.

17 AspectJ Inter-type declarations –Il campo observers è privato (quindi è visibile solo in PointObserving). –Per modificare la lista degli osservatori servono due metodi: aspect PointObserving { private Vector Point.observers = new Vector(); public static void addObserver(Point p, Screen s) { p.observers.add(s); } public static void removeObserver(Point p, Screen s) { p.observers.remove(s); }... }

18 AspectJ Inter-type declarations –A questo punto basta aggiungere nel corpo dellaspect: pointcut changes(Point p): target(p) && call(voidPoint.set*(int)); after(Point p): changes(p) { Iterator iter = p.observers.iterator(); while ( iter.hasNext() ) { updateObserver(p, (Screen)iter.next()); } static void updateObserver(Point p, Screen s) { s.display(p); } Notiamo che il sorgente delle classi Screen e Point non è stato assolutamente modificato e tutto il necessario per implementare la funzionalità risiede in PointObserving.

19 AspectJ Aspetti –Un aspetto è molto simile ad una classe in quanto può avere dei campi e dei metodi propri oltre ad i crosscut dichiarati. –AspectJ si occupa dellistanziazione di un aspetto (non è il programmatore ad usare un costrutto simile al new). –Di default viene creata solo unistanza per aspetto.

20 AspectJ Aspetti (Esempio) aspect Logging { OutputStream logStream = System.err; pointcut set(): call(void Point.setX(int)) || call(void Point.setY(int)); before(): set() { logStream.println("about to set"); }

21 AspectJ Utilizzare AspectJ –Di seguito vedremo alcuni esempi di utilizzo della AOP nello sviluppo di unapplicazione. –Possiamo distinguere due categorie. –I development aspects vengono facilmente rimossi al momento della produzione (build) dellapplicazione. –I production aspects invece vengono mantenuti ma tendono ad interessare un numero ristretto di classi.

22 AspectJ Development aspects –Servono a facilitare operazioni come il debugging, testing e performance tuning. –Usando AspectJ è possibile abilitare e disabilitare queste funzionalità in qualunque momento. –Senza AspectJ si renderebbe necessario manipolare il codice ogni volta.

23 AspectJ Tracing –Questo primo esempio ci mostra come aumentare la visibilità di ciò che accade dentro la nostra applicazione aspect SimpleTracing { pointcut tracedCall(): call(void FigureElement.draw(GraphicsContext)); before(): tracedCall() { System.out.println("Entering: " + thisJoinPoint); } –La variabile speciale thisJoinPoint contiene la signature del join point interessato. –Se volessimo fare il trace di un altro metodo basterebbe cambiare il pointcut senza dover cambiare nemmeno una riga di codice dentro il metodo vero e proprio.

24 AspectJ Profiling and Logging –Con questo esempio mostriamo come è possibile esaminare alcuni comportamenti della nostra applicazione. –Ad esempio vogliamo contare quante volte viene chiamato il metodo rotate della classe Line: aspect SetsInRotateCounting { int rotateCount = 0; int setCount = 0; before(): call(void Line.rotate(double)) { rotateCount++; } before(): call(void Point.set*(int)) && cflow(call(void Line.rotate(double))) { setCount++; }

25 AspectJ Production aspects –Rispetto ai development aspects, questi servono ad aggiungere funzionalità alla nostra applicazione anziché limitarsi a darne una maggiore visibilità. –Di seguito vedremo alcuni esempi.

26 AspectJ Change Monitoring –Vogliamo implementare una funzionalità che tenga traccia delle figure che hanno subito una modifica in modo da eseguire il refresh dello schermo

27 AspectJ aspect MoveTracking { private static boolean dirty = false; public static boolean testAndClear() { boolean result = dirty; dirty = false; return result; } pointcut move(): call(void FigureElement.setXY(int, int)) || call(void Line.setP1(Point)) || call(void Line.setP2(Point)) || call(void Point.setX(int)) || call(void Point.setY(int)); after() returning: move() { dirty = true; }

28 AspectJ Conclusioni –Esistono altre implementazioni di AOP per java e per C++ (maggiori informazioni sul sito si è scelto di prendere in esame AspectJ in quanto tra tutte è sicuramente limplementazione quella più matura ed ampiamente usata.http://aosd.net/ –Per maggiori informazioni riguardo luso di AspectJ è possibile visitare la pagina ufficiale al seguente URL:

29 Bibliografia –The AspectJ Programming Guide home/doc/progguide/index.html home/doc/progguide/index.html –Aspect Oriented programming con AspectJ –Aspect Oriented Programmi di Kiczales (articolo originale del 1997)


Scaricare ppt "Aspect Oriented programming with AspectJ Rebora Federico."

Presentazioni simili


Annunci Google