Post on 05-Jul-2015
Ingegneria del Software
Introduzione al pattern…
Ingegneria del Software - A.A. 2003/2004
Problema introduttivo
• Si consideri una struttura che contiene un insieme eterogeneo dioggetti, su i quali bisogna applicare la stessa operazione, che però è implementata in modo diverso da ogni classe di oggetto.
• Questa operazione potrebbe semplicemente stampare qualche dato dell’oggetto, formattato in un modo particolare.
• Per esempio la collezione potrebbe essere un Vector che ha dentro di se oggetti String, Integer, Double o altri Vector.
• Si consideri anche che l’operazione ad applicare non è in principio implementata negli oggetti appartenenti alla collezione e che questa operazione potrebbe essere ulteriormente ridefinita.
Ingegneria del Software - A.A. 2003/2004
Possibile soluzione al problema introduttivo
• Un approccio possibile sarebbe creare un oggetto con un metodo adeguato per scandire collezioni o stampare i dati dell’oggetto:
Questo approccio va bene se si vuole lavorare con pochi tipi di dati, ma quando questi aumentano il codice diventa una lunga sequenza di if-then-else.
Bisogna trovare un modo alternativo di applicare questa operazione a tutti gli oggetti senza includerla nel codice delle classi degli oggetti.
Bisogna trovare un modo alternativo di applicare questa operazione a tutti gli oggetti senza includerla nel codice delle classi degli oggetti.
Ingegneria del Software - A.A. 2003/2004
Soluzione al problema introduttivo (1/3)
VisitorExample
Visitor Visitable
java.util.Vector
VisitableString VisitableFloatWatcherVisitor
contiene
usa
usa
+getString()
Ingegneria del Software - A.A. 2003/2004
Soluzione al problema introduttivo (2/3)
VisitorExample
Visitor Visitable
java.util.Vector
VisitableString VisitableFloatWatcherVisitor
contiene
usa
usa
Ingegneria del Software - A.A. 2003/2004
Soluzione al problema introduttivo (3/3)
VisitorExample
Visitor Visitable
java.util.Vector
VisitableString VisitableFloatWatcherVisitor
public void accept( Visitor visitor ) {visitor.visit( this );
}
Presentazione del pattern Visitor
Ingegneria del Software - A.A. 2003/2004
Il pattern Visitor (1/16)
• Nome Visitor [GoF95]
• Synopsis Rappresenta una operazione da eseguire in una collezione di elementi di una struttura. Permette di definire nuove operazioni o modificare le esistenti senza cambiare le classi degli elementi sulle quali operano.
• Context Cfr. esempio introduttivo
Ingegneria del Software - A.A. 2003/2004
Il pattern Visitor (2/16)
• Forces
- Numerose operazioni possono essere eseguite sugli elementi di una struttura
- Gli elementi della struttura appartengono a classi diverse
- Gli elementi appartenenti alla struttura non cambiano spesso e neppure le relative classi
Ingegneria del Software - A.A. 2003/2004
Il pattern Visitor (3/16)
Ideal Solution:
Visita guidata
Ingegneria del Software - A.A. 2003/2004
Il pattern Visitor (4/16)
• Client Utilizzatore di una struttura e del suo contenuto. Usa :ConcretVisitorX per eseguire computazioni sulla struttura e sul suo contenuto.
• Visitor Superclasse astratta delle classi che eseguono computazioni sugli elementi di una struttura. Definisce un metodo per ogni tipo di elemento che le sue sottoclassi dovranno visitare.
• ConcreteVisitorX Classi concrete di visitatori, implementano operazioni da eseguire sugli elementi della struttura.
Ingegneria del Software - A.A. 2003/2004
Il pattern Visitor (5/16)
• ObjectStructure Rappresenta l’oggetto “radice” di una struttura. La visita di un :Visitor inizia da un :ObjectStructure e poi continua sugli altri oggetti nella struttura
• AbstractElement Superclasse astratta degli oggetti contenuti in una struttura. Definisce il metodo astrattoaccept con parametro di tipo AbstractVisitor.
• ConcreteElementX Elemento di un oggetto struttura. Accetta di farsi visitare da un :ConcreteVisitorN e poi instrada il visitatore verso il successivo ConcreteElementY
Ingegneria del Software - A.A. 2003/2004
Il pattern Visitor (6/16)
• Diagramma di collaborazione della versione ideale di Visitor:Il percorso della visita è determinato dagli elementi della struttura
• Vantaggi:I Visitor risultano indipendenti dalla struttura dell’oggetto struttura
• Situazioni in cui è inapplicabile:– I visitatori possono modificare la struttura– Oggetti struttura troppo grandi per essere visitati completamente
Ingegneria del Software - A.A. 2003/2004
Il pattern Visitor (7/16)
Solution:
Visita libera
Svantaggio: Classi Visitor non riutilizzabili (dipendono dalla struttura dell’oggetto struttura).
Svantaggio: Classi Visitor non riutilizzabili (dipendono dalla struttura dell’oggetto struttura).
Ingegneria del Software - A.A. 2003/2004
Il pattern Visitor (8/16)
• Il metodo accept è implementato con la tecnica del doubledispatch
• single-dispatch: il metodo da eseguire dipende dal nome del metodo e dal tipo dell'oggetto su cui viene invocato (polimorfismo).
• Il double-dispatch: il metodo da eseguire dipende non da uno ma da due oggetti.
• Nel metodo accept l’istruzione visitor.visit(this) fa si che l'implementazione scelta del metodo visit dipenda da due classi:ConcreteVisitorN e ConcreteElementX. Infatti, prima viene scelta in modo polimorfo la classe ConcreteElementX nella chiamata di accept, poi il metodo accept sceglie in modo polimorfo la classe ConcreteVisitorNnella chiamata di visit.
• Questo è l'elemento chiave del pattern del Visitor: l'operazione eseguita dipende sia dal tipo di operazione (Visitor) che dalla classe su cui viene applicata (Element).
public void accept( Visitor visitor ) {visitor.visit( this );
}
public void accept( Visitor visitor ) {visitor.visit( this );
}
Ingegneria del Software - A.A. 2003/2004
Il pattern Visitor (9/16)
• Consequences
- Semplifica l’aggiunta di nuove operazioni- Mette insieme operazioni correlate e separa quelle non
correlate- E’ scomodo aggiungere nuovi ConcreteElement- Incrina l’incapsulamento
• Implementation
- Chi si incarica di gestire il percorso della visita?
Ingegneria del Software - A.A. 2003/2004
Il pattern Visitor (10/16)
• Code example
– Per l’implementazione si definisce l’interfacciaVisitable, che dovrà essere implementata da ogni oggetto che accetti la visita di un Visitor:
Ingegneria del Software - A.A. 2003/2004
Il pattern Visitor (11/16)
– Due concreti oggetti visitabili sono VisitableString eVisitableFloat:
Ingegneria del Software - A.A. 2003/2004
Il pattern Visitor (12/16)
– I ConcreteVisitor che sono in grado di scandire la collezione e i suoi oggetti, implementano l’interfaccia Visitor :
Ingegneria del Software - A.A. 2003/2004
Il pattern Visitor (13/16)
:
– Si presenta di seguito il codice della classeWatcherVisitor, che corrisponde ad un ConcreteVisitor
Ingegneria del Software - A.A. 2003/2004
Il pattern Visitor (14/16)
– Ecco il codice di un’applicazione che gestisce una collezione eterogenea d’oggetti, e applica, tramite il WatcherVisitor, un’operazione di stampa su ogni elemento della collezione.
Ingegneria del Software - A.A. 2003/2004
Il pattern Visitor (15/16)
– Si noti che l’ultimo elemento della lista (un Double con valore uguale a 4), non implementa l’interfacciaVisitable, ed è trascurato nella scansione della collezione.
Ingegneria del Software - A.A. 2003/2004
Il pattern Visitor (16/16)
• Related Patterns
Iterator, Little Language, Composite
Il pattern Iterator rappresenta un’alternativa al pattern Visitor quando la struttura da navigare ha una struttura lineare
Ingegneria del Software - A.A. 2003/2004
Domande?