Esercitazione Frame. Argomento Realizzazione di un tipo di dato astratto Usare le eccezioni per...
-
Upload
filumena-grande -
Category
Documents
-
view
215 -
download
0
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