AOP: la programmazione Orientata agli Aspetti

In questo articolo daremo una definizione di Aspect Oreinted Programming e vedremo le differenze con l'Object Oriented Programming.La programmazione orientata agli oggetti (OOP) è una tecnologia che aiuta il lavoro del Software Engineer in quanto il modello ad oggetti rappresenta il modo migliore per modellare il dominio del mondo reale. A questa fondamentale capacità sono poi correlate altri benefici quali l'incremento nella manutenibilità del codice e le aumentate possibilità di riuso dello stesso. La programmazione ad oggetti essenzialmente vede il sistema da modellare come un insieme di oggetti che collaborano tra di loro scambiandosi messaggi. Le classi ci permettono di nascondere i dettagli implementativi dietro a delle interfacce, il polimorfismo ci consente di ottenere un comportamento comune per dei concetti tra di loro correlati mentre l'ereditarietà ci permette a componenti più specializzati di cambiare un determinato comportamento senza cambiare l'implementazione di quelli più generici.

Edit Distance o Levenshtein Distance: un algoritmo di similarità tra stringhe
Metodologie e tecniche del Natural Language Processing
Reti Neurali

In questo articolo daremo una definizione di Aspect Oreinted Programming e vedremo le differenze con l’Object Oriented Programming.

La programmazione orientata agli oggetti (OOP) è una tecnologia che aiuta il lavoro del Software Engineer in quanto il modello ad oggetti rappresenta il modo migliore per modellare il dominio del mondo reale. A questa fondamentale capacità sono poi correlate altri benefici quali l’incremento nella manutenibilità del codice e le aumentate possibilità di riuso dello stesso. La programmazione ad oggetti essenzialmente vede il sistema da modellare come un insieme di oggetti che collaborano tra di loro scambiandosi messaggi. Le classi ci permettono di nascondere i dettagli implementativi dietro a delle interfacce, il polimorfismo ci consente di ottenere un comportamento comune per dei concetti tra di loro correlati mentre l’ereditarietà ci permette  a componenti più specializzati di cambiare un determinato comportamento senza cambiare l’implementazione di quelli più generici.

Esistono però dei comportamenti (che più avanti chiameremo Concern) che sono comuni a più oggetti, ci sono cioè alcuni compiti di un applicativo che non possono essere modellati come oggetti, semplicemente perché interessano l’applicazione nel suo insieme (quali, ad esempio logging e sicurezza).

Propriamente possiamo definire un Concern come un requisito che deve essere soddisfatto al fine di realizzare gli obiettivi dell’intero sistema, possiamo dunque vedere un sistema non più come un insieme di oggetti, ma come un insieme di Concern. Un sistema può comprendere diveri tipi di concern, quali : la business logic, le performance, la persistenza dei dati, logging e debugging, authenticazione, la security, il multithread safety, error checking, e così via.

I Concern possono poi essere divisi in due tipologie:

  • Core Concerc: incapsulano la logica di business dell’applicativo;
  • Crosscutting Concern: sono dei Concern la cui implementazione è trasversale a molti moduli dell’applicativo, servono cioè ai Core Concern.

Esempi tipici di Crosscutting Concern sono l’autenticazione, il logging e la persistenza dei dati.

Utilizzando il solo paradigma OOP, in presenza di crosscutting Concern accadono le seguenti problematiche:

  • Code tangling: si ha quando un modulo deve gestire più concerns contemporaneamente, business logic, performance, logging,security, e quando un modulo presenta al suo interno elementi implementativi di altri concerns;
  • Code scattering: si ha quando una funzionalità è implementata in più di un modulo ed è di due tipologie: blocchi di codice duplicato: stesso codice in moduli differenti e blocchi di codice complementare: altri moduli implementano parti complementari del concern.

L’AOP invece fornisce degli strumenti adatti per superare le problematiche evidenziate, consentendo la separazione chiara ed efficace dei Concern e la loro modularizzazione che in AOP è denominata Aspect (Aspetto). Un Aspetto rappresenta l’unità base per la modularizzazione proprio come una Classe nella programmazione ad oggetti è l’unità fondamentale che raggruppa un insieme di comportamenti comuni.

Lo sviluppo tramite l’AOP si articola in tre fasi:

  • Decomposizione per Aspetti: si analizza il sistema alla ricerca dei crosscutting concern e la separazione di questi dai Core Concern;
  • Implementazione dei Concern:  si implementano separatamente i Concern individuati;
  • Ricomposizione per Aspetti: in questa fase si specificano le regole per creare le unità di modularizzazione, che abbiamo chiamato Aspetti. Il linguaggio che definisce queste regole è fornito da una particolare implementazione del paradigma AOP (esistono varie implementazioni).

Come detto esistono varie implementazioni presenti in rete (sia commerciali che Open Source), ma fortunatamente utilizzano una terminologia comune per gli elementi che implementatno:

  • Aspect: come abbiamo già detto rappresenta la funzionalità crosscutting da implementare;
  • Joinpoint: punto di applicazione dell’aspetto (when);
  • Advice: l’implementazione del crosscutting concern (what);
  • Pointcut: espressione per la selezione dei joinpoint (where);
  • Target: il modulo (oggetto) dove verrà applicato l’aspetto.

Una implementazione concreta del paradigma AOP in Java è AspectJ che vedremo in un prossimo articolo.

COMMENTS

WORDPRESS: 0