Aspect Oriented programming with AspectJ Rebora Federico.

29
Aspect Oriented programming with AspectJ Rebora Federico

Transcript of Aspect Oriented programming with AspectJ Rebora Federico.

  • Slide 1
  • 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).
  • Slide 14