Esercitazione Frame. Argomento Realizzazione di un tipo di dato astratto Usare le eccezioni per...

Post on 01-May-2015

215 views 0 download

Transcript of Esercitazione Frame. Argomento Realizzazione di un tipo di dato astratto Usare le eccezioni per...

Esercitazione

Frame

Argomento

• Realizzazione di un tipo di dato astratto

• Usare le eccezioni per segnalare situazioni particolari

• Invariante e funzione di astrazione

Tipo di dato astratto

• Definire una classe Frame i cui oggetti rappresentano funzioni parziali (a dominio finito) da String (dominio) ad int (Codominio)

• In sostanza sono delle tabelle (senza duplicati)

Quali operazioni?

• Vogliamo le seguenti operazioni (al solito espresse da costruttori e metodi pubblici)

• Simili alle operazioni usate nei Frames della semantica operazionale

• Usiamo delle eccezioni NotFoundException, DuplicateException per segnalare situazioni particolari (checked)

Specifica

public class Frame{

\\ costruttore

public Frame(){\\EFFECTS: costruisce un nuovo Frame indefinito per tuttii valori }

\\ metodi d’istanza

public boolean defined(String s) {\\EFFECTS: se s e’ null solleva NullPointerException, se this e’

definita per s restituisce true, altrimenti restituisce false}

Metodi d’Istanza

public int apply(String s) throws NotFoundException{\\EFFECTS: se s e’ null solleva NullPointerException, se this e’

definita per s restituisce il valore associato, altrimenti solleva NotFoundException}

public String toString(){\\EFFECTS: restituisce una stringa che contiene le coppie di this,

(x,y) \\dove y e’ l’elemento associato ad x}public void bind(String s, int x) throws DuplicateException{\\MODIFIES: this\\EFFECTS: se s e’ null solleva NullPointerException, se this e’

definita per s solleva DuplicateException, altrimenti modifica this aggiungendo l’associazione tra s ed x}

public void update(String s, int x) throws NotFoundException{\\MODIFIES: this\\EFFECTS: se s e’ null solleva NullPointerException, se this non e’

definita per s solleva NotFoundException, altrimenti modifica this rimpiazzando l’associazione per s con x}

}

Implementazione

• La scelta fondamentale (come per tutte le classi che definiscono oggetti) e’ quella delle variabili d’istanza

• Definiscono lo stato degli oggetti

• Vanno dichiarate nella classe private

• Inizializzate dal costruttore

Come si scelgono?

• Devono permettere di memorizzare le informazioni che gli oggetti hanno

• Devono anche permettere di implementare i costruttori e metodi d’istanza richiesti (in modo possibilmente efficiente)

• Come si puo’ rappresentare un Frame?

Una soluzione

• Utilizzare due Vectors, uno che contiene gli elementi del dominio ed uno quelli del codominio

dom= [d,e,g] cod= [4,7,9]• La posizione i-esima di cod contiene l’intero

associato alla stringa nella posizione i-esima di dom

• I due vettori hanno sempre la stessa dimensione

Un’altra soluzione

• Utilizzare un tipo ausilario Pair che memorizza le coppie (x,y), y e’ l’elemento associato ad x

• Utilizzare un vettore di Pair

fun= [(d,4), (e,7), (g,9)]

Tipo Recordpublic class Pair{\\EFFECTS: un Pair e’ una coppia (stringa,intero)

public String left;public int right;

public Pair (String s,int i){\\EFFECTS: costruisce una nuova coppia (s,i)}

}

•La rappresentazione puo’ anche essere pubblica•Non ci sono operazioni da mascherare

Implementazione

• Realizzare quella tramite vettore di Pair• Dare l’invariante e la funzione di astrazione, e

sviluppare il ragionamento di correttezza in parallelo a costruttori e metodi

• In ogni caso la scelta dell’implementazione e’ invisibile ai moduli che usano Frame

Seconda Parte

• Un modulo che usa Frame

• Procedura statica (deve essere scritta in base all’interfaccia pubblica)

public class usaframe{

public int sum(Frame f, String[] a){\\EFFECTS: se f o a sono null solleva NullPointerexception, altrimenti restituisce la somma dei valori associati da f agli elementi di a}

}

Esempio:

f=[(d,4), (e,7), (g,9)] a=[e,h,g]

sum=16