25
Ingegneria del Software

Lezione 11 - Visitor

Embed Size (px)

Citation preview

Page 1: Lezione 11 - Visitor

Ingegneria del Software

Page 2: Lezione 11 - Visitor

Introduzione al pattern…

Page 3: Lezione 11 - Visitor

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.

Page 4: Lezione 11 - Visitor

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.

Page 5: Lezione 11 - Visitor

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()

Page 6: Lezione 11 - Visitor

Ingegneria del Software - A.A. 2003/2004

Soluzione al problema introduttivo (2/3)

VisitorExample

Visitor Visitable

java.util.Vector

VisitableString VisitableFloatWatcherVisitor

contiene

usa

usa

Page 7: Lezione 11 - Visitor

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 );

}

Page 8: Lezione 11 - Visitor

Presentazione del pattern Visitor

Page 9: Lezione 11 - 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

Page 10: Lezione 11 - Visitor

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

Page 11: Lezione 11 - Visitor

Ingegneria del Software - A.A. 2003/2004

Il pattern Visitor (3/16)

Ideal Solution:

Visita guidata

Page 12: Lezione 11 - Visitor

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.

Page 13: Lezione 11 - Visitor

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

Page 14: Lezione 11 - Visitor

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

Page 15: Lezione 11 - Visitor

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).

Page 16: Lezione 11 - Visitor

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 );

}

Page 17: Lezione 11 - Visitor

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?

Page 18: Lezione 11 - Visitor

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:

Page 19: Lezione 11 - Visitor

Ingegneria del Software - A.A. 2003/2004

Il pattern Visitor (11/16)

– Due concreti oggetti visitabili sono VisitableString eVisitableFloat:

Page 20: Lezione 11 - Visitor

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 :

Page 21: Lezione 11 - 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

Page 22: Lezione 11 - Visitor

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.

Page 23: Lezione 11 - Visitor

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.

Page 24: Lezione 11 - Visitor

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

Page 25: Lezione 11 - Visitor

Ingegneria del Software - A.A. 2003/2004

Domande?