AspectJ: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
+F
FrescoBot (discussione | contributi)
m Bot: accenti e modifiche minori
Riga 14:
 
===Advice===
Gli advice sono degli insiemi di istruzioni che vengono eseguite quando un certo pointcut diventa valido. E'È 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.
 
===Aspect===
Riga 83:
pointcut pc(int i): call (void doSomething(int)) && args(i)
 
mette a disposizione dell'advice una variabile int i che sarà inizializzata al valore del parametro intero passato al metodo void doSomething(int n). Vale la pena notare che il pointcut definito qui sopra è formalmente una intersezione, ossia un and logico tra due insiemi di join point definiti dalle due espressioni call (void doSomething(int)) e args( int i): quest'ultima espressione indica tutti i join point che accettano come input un unico parametro di tipo int. Facendo riferimento a pointcut che nelle loro definizioni hanno, tra gli altri, anche dei join point di tipo call, è possibile che essi indichino all'advice l'oggetto che effettua la chiamata e quello che la riceve. Prendiamo ad esempio il pointcut wait, così definito:
 
pointcut wait(A1 ac, B2 bd) : call(void wait()) && this(ac) && target(bd)
Riga 248:
alla riga 2 c'è la dichiarazione dell'aspetto. Gli aspetti possono essere privati o pubblici, esattamente come le classi, ma possono anche essere privilegiati ('privileged') oppure no: un normale aspetto rispetta il principio dell'information hiding, mentre uno privilegiato no. In parole povere, solo gli aspetti dichiarati come 'privileged' hanno la visibilità degli attributi e dei metodi privati di una classe, e di conseguenza solo gli aspetti privilegiati possono contenere al loro interno dei pointcut che nella loro definizione facciano riferimento a join point corrispondenti, per esempio, al get o al set di un attributo privato dell'oggetto o all'esecuzione di un metodo privato. L'aspetto in esame alla riga 2 viene dichiarato come un aspetto pubblico privilegiato.
 
Un aspetto, esattamente come qualsiasi altro oggetto, può avere uno o più costruttori: in questo caso, il costruttore è implementato nelle righe dalla 5 alla 9.
 
Nella riga 10 e 13 troviamo la definizione di due semplici pointcut, definiti tramite dei join point di tipo execution. Alla riga 16 e alla riga 18 ci sono due advice che vengono eseguiti, rispettivamente, prima e dopo il pointcut definito alla riga 10; nell'aspetto ci sono anche due advice (righe 29 e 31) che vengono eseguiti l'uno prima e l'altro dopo il pointcut definito alla riga 13. Come accade nelle classi, tutti questi advice hanno accesso alle variabili private dell'aspetto (definite nelle righe dalla 2 alla 15).
Riga 278:
creerà un aspetto ogni volta che il metodo stampa verrà chiamato.
 
Una caratteristica molto utile dell'AspectJ è la possibilità di specificare quali aspetti abbiano la precedenza sugli altri: supponiamo che un certo join point sia parte di due diversi pointcut definiti in due aspetti diversi che si chiamano, rispettivamente, Prestaz e Logging. Ad ognuno di questi due pointcut è associato un advice di tipo before; quale dei due advice sarà eseguito per primo? Per avere una risposta a questa domanda, è necessario scrivere, in uno dei due aspetti, la seguente dichiarazione:
 
declare precedence : Prestaz, Logging;
Riga 289:
 
====''Inter-Type declarations''====
In aspectj un aspetto può alterare la struttura stessa degli oggetti aggiungendo ad essi metodi, attributi e costruttori oltre a quelli che già possiede. Bisogna però fare attenzione a non creare conflitti: i metodi, i costruttori e gli attributi che un aspetto aggiunge ad un oggetto non devono sovrapporsi a metodi, costruttori e attributi che l'oggetto già ha. In parole povere, un aspetto può aggiungere dei metodi, degli attributi o dei costruttori, purché non siano già definiti dall'oggetto stesso.
 
La sintassi delle inter-type declarations è molto semplice: la dichiarazione
Riga 295:
aggiunge un attributo di tipo intero e di nome 'time' alla classe Game, mentre
private String Ship.name;
aggiunge un attributo di tipo stringa name alla classe Ship. È importante notare che questo attributo è stato dichiarato come privato dall'aspetto, e quindi questo attributo sarà visibile solo dai metodi e dagli advice dell'aspetto, ma non dai metodi della classe Ship.
 
Public int Game.score () {
Riga 312:
*[http://www.eclipse.org/aspectj/ Home page progetto AspectJ]
 
[[categoriaCategoria:Linguaggi di programmazione]]
 
[[bg:AspectJ]]