Ingegneria del Software
Introduzione al pattern…
Laboratorio: problema introduttivo



• L’inventario di un magazzino è composto da collezioni di
  oggetti che rappresentano i prodotti (InventoryItem).

• Tali oggetti possono essere memorizzati in un database, in
  un array, in una linked list, ecc.

• Un’applicazione vuole accedere sequenzialmente agli oggetti
  in modo indipendente dalla struttura dati usata per
  memorizzarli

                Come risolvere il problema?
                Come risolvere il problema?



                   Ingegneria del Software - A.A. 2003/2004
Soluzione al problema introduttivo




                                        X

        Ingegneria del Software - A.A. 2003/2004
Presentazione del pattern
        Iterator
Il pattern Iterator (1/6)


•   Nome       Iterator [GoF95]

•   Synopsis   Fornisce una modalità di accesso sequenziale ad
               una collezione di oggetti indipendentemente
               dalla struttura dati usata per memorizzarli.

•   Context    Cfr. esempio introduttivo

•   Forces     - Una classe ha bisogno di accedere al contenuto
                 di una collezione senza risultare dipendente
                 dalla classe usata per implementare la
                 collezione
               - Una classe ha bisogno di un modo uniforme per
                 accedere il contenuto di più collezioni
                 eterogenee.

                    Ingegneria del Software - A.A. 2003/2004
Il pattern Iterator (2/6)

     Da Context…

     … a Solution
                                                     Client




• Solution - Gli “attori” del pattern Iterator sono:
– Collection: Classe che incapsula una collezione di oggetti o valori
– IteratorIF: Interfaccia che definisce i metodi di accesso sequenziale
– Iterator: Classe che implementa IterationIF
– CollectionIF: Interfaccia che obbliga una collezione a creare il proprio
                Iterator

                        Ingegneria del Software - A.A. 2003/2004
Il pattern Iterator (3/6)



•   Consequences

       - E’ possibile accedere agli oggetti senza conoscere la
         struttura dati contenente tali oggetti.

       - Usando più iteratori è facile gestire diversi
         “attraversamenti” contemporanei

       - E’ possibile per una classe fornire più iteratori che
         attraversano la collezione in modo diverso (su cosa si
         basa il metodo getNextItem()?)



                     Ingegneria del Software - A.A. 2003/2004
Il pattern Iterator (4/6)


•   Implementation

    - Oltre ai metodi già presentati è possibile trovare:
         - Test per l’esistenza e la restituzione dell’elemento
           precedente
         - Posizionamento sul primo o ultimo elemento
         - Cardinalità della collezione
         -…
    - Spesso Iterator è implementato come inner class privata
      della Collection associata
    - Modificare il contenuto di una collezione durante
      l’attraversamento di un client può creare problemi (oggetti
      mancanti o duplicati)


                     Ingegneria del Software - A.A. 2003/2004
Il pattern Iterator (5/6)



•   Java API usage



      java.util.Collection
       java.util.Collection                      java.util.Iterator
                                                  java.util.Iterator




        java.util.Vector
         java.util.Vector                     Inner class private di:
                                               Inner class private di:
     java.util.LinkedList                         java.util.Vector
                                                   java.util.Vector
      java.util.LinkedList
      java.util.ArrayList                      java.util.LinkedList
                                                java.util.LinkedList
       java.util.ArrayList
                …                               java.util.ArrayList
                                                 java.util.ArrayList
                 …
                                                          ……

                     Ingegneria del Software - A.A. 2003/2004
Il pattern Iterator (6/6)

•   Code example

                      InventoryIteratorIF
    public interface InventoryIteratorIF {
         public boolean hasNextInventoryItem() ;
         //…
    }
                  InventoryCollection
    public class InventoryCollection { //...
         public InventoryIteratorIF iterator() {
                  return new InventoryIterator();
         }
                         InventoryIterator implements InventoryIteratorIF
          private class InventoryIterator
                  {
                  public boolean hasNextInventoryItem() {
                          //...
    } //… } }

•   Related Patterns   Adapter, Factory Method, Null Object

                         Ingegneria del Software - A.A. 2003/2004
Domande?




Ingegneria del Software - A.A. 2003/2004

Lezione 08 - Iterator

  • 1.
  • 2.
  • 3.
    Laboratorio: problema introduttivo •L’inventario di un magazzino è composto da collezioni di oggetti che rappresentano i prodotti (InventoryItem). • Tali oggetti possono essere memorizzati in un database, in un array, in una linked list, ecc. • Un’applicazione vuole accedere sequenzialmente agli oggetti in modo indipendente dalla struttura dati usata per memorizzarli Come risolvere il problema? Come risolvere il problema? Ingegneria del Software - A.A. 2003/2004
  • 4.
    Soluzione al problemaintroduttivo X Ingegneria del Software - A.A. 2003/2004
  • 5.
  • 6.
    Il pattern Iterator(1/6) • Nome Iterator [GoF95] • Synopsis Fornisce una modalità di accesso sequenziale ad una collezione di oggetti indipendentemente dalla struttura dati usata per memorizzarli. • Context Cfr. esempio introduttivo • Forces - Una classe ha bisogno di accedere al contenuto di una collezione senza risultare dipendente dalla classe usata per implementare la collezione - Una classe ha bisogno di un modo uniforme per accedere il contenuto di più collezioni eterogenee. Ingegneria del Software - A.A. 2003/2004
  • 7.
    Il pattern Iterator(2/6) Da Context… … a Solution Client • Solution - Gli “attori” del pattern Iterator sono: – Collection: Classe che incapsula una collezione di oggetti o valori – IteratorIF: Interfaccia che definisce i metodi di accesso sequenziale – Iterator: Classe che implementa IterationIF – CollectionIF: Interfaccia che obbliga una collezione a creare il proprio Iterator Ingegneria del Software - A.A. 2003/2004
  • 8.
    Il pattern Iterator(3/6) • Consequences - E’ possibile accedere agli oggetti senza conoscere la struttura dati contenente tali oggetti. - Usando più iteratori è facile gestire diversi “attraversamenti” contemporanei - E’ possibile per una classe fornire più iteratori che attraversano la collezione in modo diverso (su cosa si basa il metodo getNextItem()?) Ingegneria del Software - A.A. 2003/2004
  • 9.
    Il pattern Iterator(4/6) • Implementation - Oltre ai metodi già presentati è possibile trovare: - Test per l’esistenza e la restituzione dell’elemento precedente - Posizionamento sul primo o ultimo elemento - Cardinalità della collezione -… - Spesso Iterator è implementato come inner class privata della Collection associata - Modificare il contenuto di una collezione durante l’attraversamento di un client può creare problemi (oggetti mancanti o duplicati) Ingegneria del Software - A.A. 2003/2004
  • 10.
    Il pattern Iterator(5/6) • Java API usage java.util.Collection java.util.Collection java.util.Iterator java.util.Iterator java.util.Vector java.util.Vector Inner class private di: Inner class private di: java.util.LinkedList java.util.Vector java.util.Vector java.util.LinkedList java.util.ArrayList java.util.LinkedList java.util.LinkedList java.util.ArrayList … java.util.ArrayList java.util.ArrayList … …… Ingegneria del Software - A.A. 2003/2004
  • 11.
    Il pattern Iterator(6/6) • Code example InventoryIteratorIF public interface InventoryIteratorIF { public boolean hasNextInventoryItem() ; //… } InventoryCollection public class InventoryCollection { //... public InventoryIteratorIF iterator() { return new InventoryIterator(); } InventoryIterator implements InventoryIteratorIF private class InventoryIterator { public boolean hasNextInventoryItem() { //... } //… } } • Related Patterns Adapter, Factory Method, Null Object Ingegneria del Software - A.A. 2003/2004
  • 12.