Aspect Oriented Programming

4,762 views

Published on

Published in: Technology
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,762
On SlideShare
0
From Embeds
0
Number of Embeds
52
Actions
Shares
0
Downloads
0
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

Aspect Oriented Programming

  1. 1. Aspect-Oriented Programming <ul><li>AOP </li></ul><ul><li>Programmazione Orientata agli Aspetti </li></ul>
  2. 2. <ul><li>Un sistema software è la realizzazione di una serie di requisiti </li></ul><ul><li>In fase di disegno di un sistema i requisiti vengono classificati e raggruppati allo scopo di identificare i moduli implementativi </li></ul><ul><li>Separare le realizzazioni dei requisiti in moduli differenti è una fase fondamentale per la realizzazione del sistema </li></ul><ul><li>Si assegnano così le responsabilità ad ogni modulo che risulta coeso e non accoppiato </li></ul><ul><li>Le metodologie di programmazione in vario modo supportano la Separation Of Concerns </li></ul>Separation of concerns Aspect-Oriented Programming
  3. 3. <ul><li>L'ingegneria del software si è occupata di trovare un rimedio al problema della Separation Of Concern introducendo i concetti di modularizzazione e sviluppando metodologie e linguaggi che supportassero tali concetti. </li></ul><ul><li>In questo senso abbiamo assistito ad un'evoluzione nelle metodologie e negli strumenti di supporto a queste: </li></ul><ul><li>I linguaggi procedurali hanno introdotto l’astrazione funzionale </li></ul><ul><li>L’OOP ha introdotto il concetto di astrazione di 'oggetto' e quindi il costrutto di classe </li></ul><ul><li>L’AOP introduce il concetto di astrazione di 'concern' e quindi il costrutto di aspetto </li></ul>Aspect-Oriented Programming Separation of concerns
  4. 4. <ul><li>In un sistema bancario i concerns sono rispettivamente: </li></ul><ul><li>la gestione dei clienti </li></ul><ul><li>il calcolo degli interessi </li></ul><ul><li>la gestione del bancomat </li></ul><ul><li>la gestione della persistenza </li></ul><ul><li>la gestione delle autorizzazioni </li></ul><ul><li>la gestione della sicurezza </li></ul><ul><li>il logging </li></ul><ul><li>... </li></ul>Esempio di concerns di un sistema Aspect-Oriented Programming
  5. 5. <ul><li>Un concern è un requisito che deve essere soddisfatto al fine di realizzare gli obiettivi dell'intero sistema </li></ul><ul><li>di conseguenza: </li></ul><ul><li>Un sistema software è la realizzazione di una serie di concerns </li></ul>Definizione di Concern Aspect-Oriented Programming
  6. 6. <ul><li>In un sistema bancario i concerns sono rispettivamente: </li></ul><ul><li>la gestione dei clienti </li></ul><ul><li>il calcolo degli interessi </li></ul><ul><li>la gestione dell'ATM (bancomat) </li></ul><ul><li>la gestione della persistenza </li></ul><ul><li>la gestione delle autorizzazioni </li></ul><ul><li>la gestione della sicurezza </li></ul><ul><li>il logging </li></ul><ul><li>... </li></ul>Esempio di concerns di un sistema Aspect-Oriented Programming Core concerns Crosscutting concerns
  7. 7. <ul><li>Sono concerns la cui implemetazione è 'trasversale' a molti moduli del sistema </li></ul>Aspect-Oriented Programming Crosscutting Concerns
  8. 8. <ul><li>XML parsing in org.apache.tomcat </li></ul><ul><ul><li>Ottima modularizzazione </li></ul></ul>Aspect-Oriented Programming Case study Apache
  9. 9. <ul><li>URL Pattern matching in org.apache.tomcat </li></ul><ul><ul><li>Buona modularizzazione </li></ul></ul>Aspect-Oriented Programming Case study Apache
  10. 10. <ul><li>Logging in org.apache.tomcat </li></ul><ul><ul><li>Pessima modularizzazione </li></ul></ul>Aspect-Oriented Programming Case study Apache
  11. 11. <ul><li>Code tangling: </li></ul><ul><ul><li>si ha quando un modulo deve gestire più concerns contemporaneamente, business logic, performance, logging, security, ... </li></ul></ul><ul><ul><li>e quando un modulo presenta al suo interno elementi implementativi di altri concerns </li></ul></ul>Aspect-Oriented Programming Crosscutting Concerns - conseguenze
  12. 12. <ul><li>Code scattering: </li></ul><ul><ul><li>si ha quando una funzionalità è implementata in più di un modulo (il requisito è disperso) </li></ul></ul><ul><ul><li>è di due tipologie: </li></ul></ul><ul><ul><ul><li>Blocchi di codice duplicato: stesso codice in moduli differenti </li></ul></ul></ul><ul><ul><ul><li>Blocchi di codice complementare: altri moduli implementano parti complementari del concern </li></ul></ul></ul>Aspect-Oriented Programming Crosscutting Concerns - conseguenze
  13. 13. <ul><li>Quindi il sistema presenta i seguenti difetti: </li></ul><ul><ul><li>Codice ridondante </li></ul></ul><ul><ul><li>La sua struttura tende a non essere esplicita </li></ul></ul><ul><ul><li>Presenta difficoltà nell'implementazione di ulteriori requisiti </li></ul></ul><ul><li>L'OOP in questo caso non è in grado di fornire un adeguato supporto </li></ul>Aspect-Oriented Programming Crosscutting Concerns - conseguenze
  14. 14. <ul><li>L'Aspect Oriented Programming complementa l'OOP </li></ul><ul><li>Offre gli strumenti e i costrutti per la modularizzazione dei crosscutting concerns </li></ul><ul><li>Abilita l'applicazione dei crosscutting concerns in modo dichiarativo </li></ul><ul><li>Favorisce il disaccoppiamento fra i moduli </li></ul><ul><li>Consente, attraverso l'uso degli aspetti, la rimozione delle dipendenze di un crosscutting concerns nei moduli interessati </li></ul>Aspect-Oriented Programming Overview
  15. 15. <ul><li>Aspect : funzionalità crosscutting </li></ul><ul><li>Joinpoint : punto di applicazione dell'aspetto (when) </li></ul><ul><li>Advice : l'implementazione del crosscutting concern (what) </li></ul><ul><li>Pointcut : espressione per la selezione dei joinpoint (where) </li></ul><ul><li>Target : il modulo (oggetto) dove verrà applicato l'aspetto </li></ul>Aspect-Oriented Programming Terminologia
  16. 16. <ul><li>Fra le varie implementazioni open source si distinguono per qualità e diffusione: </li></ul><ul><li>AspectJ </li></ul><ul><ul><li>Reference implementation per l'AOP </li></ul></ul><ul><li>Spring AOP </li></ul><ul><ul><li>Basandosi sui pricipi fondamentali di Spring come la DI offre strumenti di supporto dichiarativi per l'AOP basati su XML e annotazioni Java </li></ul></ul>Aspect-Oriented Programming AOP's Java framework
  17. 17. <ul><ul><li>AspectJ </li></ul></ul>Aspect-Oriented Programming AspectJ
  18. 18. <ul><li>E' un'estensione del linguaggio Java: </li></ul><ul><ul><li>Ogni programma aspectj è un programma java </li></ul></ul><ul><ul><li>Sfrutta tutte le potenzialità del linguaggio </li></ul></ul><ul><ul><li>Bassa curva di apprendimento </li></ul></ul><ul><li>Come ogni linguaggio è costituito da: </li></ul><ul><ul><li>Una definizione: aggiunge i costrutti per il weaving dei crosscutting concern </li></ul></ul><ul><ul><li>Una implementazione: compilatore, debugger e l'integrazione con i più diffusi ambienti di sviluppo </li></ul></ul>Aspect-Oriented Programming AspectJ
  19. 19. <ul><li>Rappresenta un punto di esecuzione di un programma: </li></ul><ul><ul><li>Invocazione ed esecuzione di un metodo </li></ul></ul><ul><ul><li>Invocazione ed esecuzione del costruttore </li></ul></ul><ul><ul><li>Accesso ai campi </li></ul></ul><ul><ul><li>Inizializzazione di classe </li></ul></ul><ul><ul><li>Lancio di una eccezione </li></ul></ul><ul><li>quindi dove applicare un crosscutting concern </li></ul><ul><ul><li>dove viene effettivamente applicato un aspetto </li></ul></ul>Aspect-Oriented Programming AspectJ - Joinpoint
  20. 20. <ul><li>E' il costrutto che consente di esprimere i criteri per la selezione dei joinpoints </li></ul><ul><li>E' possibile collezionare il contesto di esecuzione nei joinpoints selezionati dal pointcut </li></ul><ul><li>Esempio: </li></ul>Aspect-Oriented Programming AspectJ - Pointcut public pointcut print() : call ( public void Message.print*(..));
  21. 21. <ul><li>Specifica il codice che deve essere eseguito ad un pointcut </li></ul><ul><li>AspectJ consente tre modalità di applicazione di un advice: </li></ul><ul><ul><li>before: prima joinpoint </li></ul></ul><ul><ul><li>After: dopo </li></ul></ul><ul><ul><li>Around: intorno al joinpoint </li></ul></ul><ul><li>Esempio: </li></ul>Aspect-Oriented Programming AspectJ - Advice void around () : print() { System.out.println( &quot;Buongiorno!&quot; ); proceed (); System.out.println( &quot;Arrivederci!&quot; ); return ; }
  22. 22. <ul><li>Aspects è l'unità di modularizzazione del concern, ed è come una classe java </li></ul><ul><li>Un aspetto contiene i pointcuts e gli advice </li></ul><ul><li>Esempio: </li></ul>Aspect-Oriented Programming AspectJ - Aspect public aspect ServiceAspect { public pointcut print() : call ( public void Message.print*(..)); void around () : print() { System.out.println( &quot;Buongiorno!&quot; ); proceed (); System.out.println( &quot;Arrivederci!&quot; ); return ; } }
  23. 23. <ul><ul><li>Spring AOP </li></ul></ul>Aspect-Oriented Programming Spring AOP
  24. 24. Aspect-Oriented Programming Pattern GoF DECORATOR - Abstract <ul><li>Aggiunge comportamenti addizionali ad un oggetto dinamicamente. </li></ul><ul><li>Può essere applicato: </li></ul><ul><li>per “decorare” con azioni un oggetto a run-time senza impatti per l'oggetto decorato </li></ul><ul><li>per suddividere le responsabilità e aumentare il disaccoppiamento </li></ul><ul><li>per privilegiare la composizione (HAS-A) all'estensione (IS-A) </li></ul><ul><li>per aprire alle estensioni ma chiudere alle modifiche le classi ( open-closed principle ) </li></ul><ul><li>Ritroviamo esempi pratici di DECORATOR all'interno della JSE nel package java.io (classi input/output streams) e in ambito JEE nei Filter . </li></ul>
  25. 25. Aspect-Oriented Programming Pattern GoF DECORATOR - Class diagram
  26. 26. Aspect-Oriented Programming Pattern GoF PROXY - Abstract <ul><li>Fornisce un surrogato di un oggetto target per controllarne l'accesso. </li></ul><ul><li>Può essere applicato: </li></ul><ul><li>per fornire una rappresentazione di un oggetto distribuito sulla rete (REMOTE PROXY ) </li></ul><ul><li>per fornire uno strumento che faciliti il lazy-loading di risorse all'interno della classe ( VIRTUAL PROXY ) </li></ul><ul><li>per controllare l'accesso all'oggetto target (PROTECTION PROXY) </li></ul><ul><li>per applicare comportamenti addizionali quando l'oggetto target è invocato ( SMART REFERENCE ) </li></ul><ul><li>Si distingue dal DECORATOR (o WRAPPER) perchè hai il controllo completo dell'accesso. Ritroviamo un esempio pratico di applicazione del pattern PROXY all'interno della tecnologia RMI (oggetto stub ). </li></ul>
  27. 27. Aspect-Oriented Programming Pattern GoF PROXY - Class diagram
  28. 28. Aspect-Oriented Programming DYNAMIC PROXY - Abstract <ul><li>Presenti dalla versione 1.3 della JSE, una Dynamic Proxy Class è una classe che implementa a run-time, piuttosto che a design-time, una o più interfacce. </li></ul><ul><li>target interface </li></ul><ul><li>target class </li></ul><ul><li>invocation handler (implementa java.lang.reflect.InvocationHandler ) </li></ul><ul><li>dynamic proxy class (generata a run-time dalla JVM) </li></ul>
  29. 29. Aspect-Oriented Programming DYNAMIC PROXY - Class diagram
  30. 30. Aspect-Oriented Programming DYNAMIC PROXY - Sequence diagram
  31. 31. Aspect-Oriented Programming DYNAMIC PROXY - Invocation handler POJO impl interface dynamic proxy factory invocation handler
  32. 32. Aspect-Oriented Programming Spring AOP module
  33. 33. Aspect-Oriented Programming SPRING AOP Support <ul><li>Spring fornisce le seguenti modalità di supporto alla programmazione orientata agli aspetti: </li></ul><ul><li>Proxy Factory Bean </li></ul><ul><li>@AspectJ annotation-driven </li></ul><ul><li>Pure-POJO </li></ul>
  34. 34. Aspect-Oriented Programming PROXY FACTORY BEAN - Proxy mode Target Bean Target Interface Proxy Factory Interceptor List Pointcut Advice
  35. 35. Aspect-Oriented Programming PROXY FACTORY BEAN - Decorator mode
  36. 36. <ul><ul><li>Permette di evitare la dependency injection automatizzando la creazione dei proxy che soddisfano il pointcut definito </li></ul></ul>Aspect-Oriented Programming PROXY FACTORY BEAN – Autoproxy facility BeanPostProcessor Pointcut Advice
  37. 37. Aspect-Oriented Programming SPRING AOP - Advice <ul><li>Before org.springframework.aop.MethodBeforeAdvice </li></ul><ul><li>After-returning org.springframework.aop.AfterReturningAdvice </li></ul><ul><li>After-throwing org.springframework.aop.ThrowsAdvice </li></ul><ul><li>Around org.aopalliance.intercept.MethodInterceptor </li></ul><ul><li>Introduction org.springframework.aop.IntroductionInterceptor </li></ul>
  38. 38. Aspect-Oriented Programming Around Advice
  39. 39. Aspect-Oriented Programming Around Advice - Code
  40. 40. <ul><ul><li>AspectJ mette a disposizione la possibilità di configurare POJO come aspetti mediante annotazioni . </li></ul></ul><ul><ul><li>Per facilitare l'attivazione di un bean AspectJ e trattarlo come un aspetto Spring mette a disposizione un autoproxy factory </li></ul></ul><ul><ul><li><aop:aspectj-autoproxy> </li></ul></ul>Aspect-Oriented Programming @AspectJ annotation crea un autoproxy factory di tipo AnnotationAwareAspectJ AutoProxyCreator @AspectJ annotations
  41. 41. <ul><ul><li>Permette di applicare aspetti ad una classe POJO in una modalità meno invasiva rispetto all'uso della ProxyFactoryBean </li></ul></ul>Aspect-Oriented Programming Pure POJO aspect Before Advice XML Tag
  42. 42. <aop:config> <aop:aspect> <aop:advisor> <aop:pointcut> <aop:before> <aop:around> <aop:after> <aop:after-returning> <aop:after-throwing> <ul><ul><li>Tag XML per la dichiarazione di </li></ul></ul><ul><ul><li>POJO-based aspects </li></ul></ul>Aspect-Oriented Programming Pure POJO XML elements
  43. 43. <ul><li>Servizio per recupero account utente. </li></ul><ul><li>Comportamenti cross-cutting individuati: </li></ul><ul><li>tracing Before </li></ul><ul><li>hit counter Before </li></ul><ul><li>caching Around </li></ul><ul><li>error handler After-throwing </li></ul>Aspect-Oriented Programming Case study overview
  44. 44. ...let's coding... Aspect-Oriented Programming Case study live session
  45. 45. References <ul><li>http://aopalliance.sourceforge.net/ </li></ul><ul><li>http://www.springframework.org/ </li></ul><ul><li>http://www.eclipse.org/aspectj/ </li></ul><ul><li>Spring in Action – Craig Walls with Ryan Breidenbach – Manning </li></ul><ul><li>AspectJ in Action - Ramnivas Laddad - Manning </li></ul><ul><li>Expert One-on-One J2EE Design and Development - Rod Johnson – Wrox </li></ul><ul><li>Expert One-on-One J2EE Development without EJB - Rod Johnson, Juergen Hoeller - Wrox </li></ul>Aspect-Oriented Programming
  46. 46. <ul><li>Grazie per la cortese attenzione e... </li></ul>...happy coding applying aspects!!! Aspect-Oriented Programming Conclusioni

×