Aspect Oriented programming with AspectJ Rebora Federico
Slide 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
Slide 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).
Slide 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.
Slide 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.
Slide 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.
Slide 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
http://eclipse.org/aspectj/http://eclipse.org/aspectj/ AspectJ
aggiunge a java il concetto di join point ed aggiunge un limitato
numero di costrutti che vedremo nel seguito.
Slide 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).
Slide 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
Slide 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.
Slide 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.* (..))
Slide 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.
Slide 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).