AspectJ: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m ortografia
RolloBot (discussione | contributi)
m Bot: Correzione di uno o più errori comuni
Riga 12:
È possibile definire un pointcut in maniera estremamente dettagliata; si può ad esempio definire un pointcut che sia valido quando un qualsiasi metodo della [[Classe (informatica)|classe]] A viene chiamato, o ancora, definire un pointcut che è valido quando un metodo di un oggetto di classe A chiama il [[metodo]] xyz(int a, int b) di un oggetto di classe B, oppure un pointcut che sia valido quando viene eseguito il metodo B.exec(String s) tranne nel caso in cui il suddetto metodo venga chiamato da un membro della classe F. È anche possibile definire un pointcut che sia valido quando uno qualunque di un certo insieme di metodi specificato dal programmatore viene chiamato.
 
Un pointcut può contenere informazioni sui join point che lo compongono, quali ad esempio gli argomenti del metodo chiamato (se il pointcut contiene un join point definito dalla chiamata di un metodo) o lo specifico oggetto cui era diretta la chiamata (sempre che il pointcut contenga un join point consistente nella chiamata di un metodo di un oggetto). Facendo riferimento alla metafora precedente, i pointcut definiscono quando gli spettatori salgono sul palcoscenico, ossia il momento in cui gli aspetti modificano il normale flusso del programma .
 
===Advice===
 
Gli advice sono degli insiemi di istruzioni che vengono eseguite
quando un certo pointcut diventa valido . è importante notare che un advice può contenere esso stesso la definizione del pointcut che lo attiva. Un advice nella sua esecuzione può accedere ad eventuali
informazioni sui join point che lo compongono che il pointcut può
fornirgli. Sempre con riferimento alla metafora del teatro, gli advice definiscono cosa fanno gli spettatori sul palcoscenico.
Riga 25:
Le unità elementari dell' OOP sono gli oggetti, raggruppati in classi; le unità fondamentali dell'AOP sono gli aspetti.
 
Un aspetto normalmente contiene uno o più pointcut e uno o più advice, oltre a metodi e attributi, come le normali classi. Un aspetto modella una certa 'problematica trasversale' (cioè comune a più oggetti) del problema da risolvere ; per esempio, poniamo di dover effettuare uno stesso controllo sui valori di input su più metodi appartenenti a classi differenti. Supponendo che tali oggetti non siano legati tra loro da relazioni di ereditarietà, nell'OOP si dovrebbe implementare tale controllo in ogni classe; nell'AOP è invece sufficiente implementare un unico aspetto che abbia un pointcut definito come un OR logico tra un insieme di join point che corrispondono all' esecuzione dei metodi che ci interessano, che contenga al suo interno un advice che restituisca un errore se gli argomenti del metodo eccedono i valori prefissati.
 
===AspectJ in dettaglio===
Riga 31:
====Join points====
 
un join point può essere, ad esempio, la chiamata di un metodo ; in aspectj, un join point che viene attivato dalla chiamata del metodo void faiqualcosa(int a), si scrive come :
 
call (void faiqualcosa(int))
 
o anche come :
 
execution(void faiqualcosa(int))
 
La differenza tra un join point di tipo execution e uno di tipo call è molto semplice : un join point di tipo call corrisponde alla chiamata di un metodo da parte di un altro metodo, mentre un join point di tipo execution corrisponde all' esecuzione del corpo del metodo. Normalmente un join poit di tipo call è pressoché equivalente a un join point di tipo execution ; a volte però non è così . Prendiamo ad esempio il caso della classe contenente il metodo main : in java, per convenzione, ogni programma deve comprendere una classe che implementi un metodo che abbia la seguente firma : public static void main(String[] args). Tale metodo è il primo ad essere eseguito dalla java VM . Un join point definito come call (public static void main(String[] args)) non verrà mai raggiunto durante l'esecuzione di un programma java , a differenza del join point definito da execution (public static void main(String[] args)). Questo accade perché ,anche se il metodo main verrà sicuramente eseguito, esso non viene mai chiamato da un altro metodo, in quanto sarà sempre il primo metodo ad essere eseguito .
Esistono inoltre molti altri modi per individuare dei join point nel flusso del programma :