Aspect Oriented programming with AspectJ

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Oggetti Java.
Costruttori e Distruttori
Recupero debito quarto anno Primo incontro
PHP.
Informatica 2 Lezione 4 Corso di laurea in matematica Informatica 2 Dott. Ing. Leonardo Vito Corso di laurea matematica indirizzo matematica per le applicazioni.
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
Le gerarchie di tipi.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
Introduzione al linguaggio C++ 5 lezioni
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Lezione 12 (19 novembre 2008) Programmazione in Java: i metodi statici.
Corso di Laurea in Biotecnologie Informatica (Programmazione)
Introduzione al linguaggio Java
Astrazioni sul controllo Iteratori. 2 Nuove iterazioni Definendo un nuovo tipo come collezione di oggetti (p. es., set) si vorrebbe disporre anche di.
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
1 Lezione XIII Lu 17-Nov-2005 Programmare le classi.
Derivazione tra classi
Gestione dei Progetti Software 2 (a.a. 2004/05) - Lezione 3 1 JAVA e Internet: il World Wide Web Internet: milioni di computer collegati fra di loro attraverso.
Selezione (=scelta) con “if-else”
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
Java Collections.
Corso di PHP.
Programmazione in Java
AlgoLab - Ereditarieta' Ereditarietà e polimorfismo in Java Laboratorio di Algoritmi 02/03 Prof. Ugo de Liguoro.
Java Contardi Carlo A.S. 2008/09.
I Metodi in Java Il termine "metodo" è sinonimo di "azione". Quindi, affinché un programma esegua qualche istruzione, deve contenere metodi.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Fondamenti di Programmazione Prof.ssa Elisa Tiezzi
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Appunti di Java (J2SDK 1.4.2, JDK 1.6.0) prof. Antonella Schiavon settembre 2009.
Le variabili in Java Nella programmazione tradizionale, una variabile è una porzione di memoria in cui è immagazzinato un certo tipo di dato. Per esempio.
Una "vera" classe.. ..un esempio pratico: la calcolatrice
Programmazione ad oggetti
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
1 Corso di Informatica (Programmazione) Lezione 8 (7 novembre 2008) Programmazione in Java: operatori aritmetici, operatori di assegnamento e cast.
Introduzione a Javascript
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Parte 3 Lo stato: variabili, espressioni ed assegnazioni
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
© Copyright NTT DATA Italia – All Rights Reserved The information contained in this document is the property of NTT DATA Italia S.p.A. and the addressee.
Gestione dei thread in Java
Programmazione in Java
TW Asp - Active Server Pages Nicola Gessa. TW Nicola Gessa Introduzione n Con l’acronimo ASP (Active Server Pages) si identifica NON un linguaggio di.
Ripasso su Java. Introduzione Per risolvere problemi complessi, i linguaggi di programmazione forniscono costrutti per realizzare nuove funzioni che trasformino.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
1 Metodologie di Programmazione = decomposizione basata su astrazioni.
LIP: 15 Marzo 2005 Vettori di interi. Esercizio proposto Definire una classe VectorInt i cui oggetti sono vettori omogenei di interi ordinati in modo.
La Programmazione ad Oggetti
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
13/08/02Input 1 Interagire con il computer Da tastiera Da riga di comando Funzioni di conversione.
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Metodi in Java. Note Identificazione input: (il raggio è un numero reale !!!) Identificazione delle operazioni necessarie al calcolo Area=r*r*PI Circonferenza=2*r*PI.
Introduzione alle Classi e agli Oggetti in Java 1.
Transcript della presentazione:

Aspect Oriented programming with AspectJ Rebora Federico

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

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 come “trasversale”).

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

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.

AOP Programmazione Aspect Oriented La nascita dell’Aspect 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 l’applicazione nel suo insieme. L’AOP si occupa di trasformare in “moduli” i crosscut concern similmente a come il java trasforma in “moduli” (classi) i concern comuni.

AspectJ Cosa è AspectJ? Per sperimentare i benefici del nuovo paradigma, si è utilizzato AspectJ, un’estensione 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 all’indirizzo internet http://eclipse.org/aspectj/ AspectJ aggiunge a java il concetto di join point ed aggiunge un limitato numero di costrutti che vedremo nel seguito.

AspectJ I join point Identificano dei punti nell’esecuzione 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).

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

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.

AspectJ Altri esempi di pointcut call(void Figure.make*(..)) 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.* (..))

AspectJ Advice I pointcut stabiliscono dei punti nell’esecuzione del programma e non si occupano di nient’altro. 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.

AspectJ Advice Allo stesso modo è possibile eseguire il codice dopo l’esecuzione del join point tramite l’advice 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).

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 dell’advice: after(Point p, int x) returning: call(void Point.setX(int)) && target(p) && args(x) { System.out.println(p + “moved to: " + x); } Nell’esempio notiamo le primitive target ed args che servono a pubblicare i valori di p ed x .

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 un’interfaccia 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.

AspectJ Inter-type declarations Immaginiamo di implementare degli oggetti Screen che “osservano” 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.

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); } ... }

AspectJ Inter-type declarations A questo punto basta aggiungere nel corpo dell’aspect: 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.

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 dell’istanziazione di un aspetto (non è il programmatore ad usare un costrutto simile al new). Di default viene creata solo un’istanza per aspetto.

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"); }

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

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.

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.

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++;

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.

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

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;

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

Bibliografia The AspectJ Programming Guide http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/aspectj-home/doc/progguide/index.html Aspect Oriented programming con AspectJ http://www.objectway.it/articles/0308_AOPAspectJ.pdf Aspect Oriented Programmi di Kiczales (articolo originale del 1997) http://www2.parc.com/csl/groups/sda/publications/papers/Kiczales-ECOOP97/for-web.pdf