Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Aspect Oriented Programming

  • Loggen Sie sich ein, um Kommentare anzuzeigen.

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

×