title: Programmazione orientata agli aspetti
text: # Programmazione orientata agli aspetti
  
  La programmazione orientata agli aspetti è un paradigma di programmazione basato sulla creazione di entità software - denominate aspetti - che sovrintendono alle interazioni fra oggetti finalizzate ad eseguire un compito comune. Il vantaggio rispetto alla tradizionale Programmazione orientata agli oggetti consiste nel non dover implementare separatamente in ciascuna classe il codice necessario ad eseguire questo compito comune.
  
  ## Utilità della programmazione orientata agli aspetti
  
  È noto che ci sono varie ragioni per cui la Programmazione orientata agli oggetti (in inglese OOP - Object Oriented Programming) è così diffusa oggigiorno. Alcune delle più importanti sono la semplicità dell'ingegnerizzazione del software tramite un design object-oriented, l'incremento nella manutenibilità del codice e le aumentate possibilità di riuso dello stesso. Tuttavia, col passare degli anni ci si è resi conto che il modello di sviluppo object-oriented non si adatta perfettamente alla modellazione di tutti i problemi che un sistema software deve risolvere.
  
  Ad esempio, uno dei principi fondamentali dell'OOP è la modellazione del programma come uno scambio di messaggi tra oggetti, i quali sono entità tra loro indipendenti. Tale principio garantisce sicuramente la modularità del sistema software sviluppato con un linguaggio object oriented, ma al tempo stesso rende difficile l'implementazione di alcune funzionalità che per loro natura sono comuni a più oggetti (quali ad es. logging e sicurezza). Ci sono cioè alcuni compiti del sistema informativo che non possono essere modellati come oggetti, semplicemente perché interessano l'applicazione nel suo insieme.
  
  Prendiamo ad esempio un'applicazione che deve effettuare il logging di alcune transazioni che richiedano l'interazione tra più oggetti: ognuno degli oggetti coinvolti deve, nei propri metodi, contenere codice in grado di gestire il suddetto problema; si viene così a creare, nella stesura del codice, una ridondanza non necessaria. Inoltre gli oggetti modificati a tale scopo diventano più complessi e quindi diminuisce la manutenibilità del programma.
  
  L'aspect oriented programming (AOP) è nato con lo scopo di risolvere problemi di questo tipo. Gli aspetti modellano cioè le problematiche trasversali agli oggetti stessi, ossia compiti (quali ad esempio l'accounting) che nell'OOP tradizionale sono difficilmente modellabili.
  
  ### In sintesi
  
  Un programma aspect-oriented è costituito essenzialmente da due insiemi di costrutti: gli aspetti e gli oggetti. Gli aspetti sono delle entità esterne agli oggetti che osservano il flusso del programma generato dalle interazioni tra oggetti, modificandolo quando opportuno. Se paragonassimo gli oggetti a degli attori, potremmo dire che gli aspetti sono degli spettatori, cioè delle entità che osservano le azioni in corso nel programma senza esservi direttamente coinvolti, ma degli spettatori un po' particolari, visto che in determinate circostanze salgono sul palcoscenico e partecipano alla rappresentazione (l'esecuzione del programma, fuor di metafora).
  
  ## I linguaggi più usati per l'AOP
  
  * AspectJ
  * AspectC++
  * PHP-AOP, su github.com.
  