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\\EFFECTS: costruisce un nuovo Frame indefinito per tutti i valori } \\ metodi distanza public boolean defined(String s) { \\EFFECTS\\EFFECTS: se s e null solleva NullPointerException, se this e definita per s restituisce true, altrimenti restituisce false}
Metodi dIstanza public int apply(String s) throws NotFoundException{ \\EFFECTS\\EFFECTS: se s e null solleva NullPointerException, se this e definita per s restituisce il valore associato, altrimenti solleva NotFoundException} public String toString(){ \\EFFECTS\\EFFECTS: restituisce una stringa che contiene le coppie di this, (x,y) \\dove y e lelemento associato ad x} public void bind(String s, int x) throws DuplicateException{ \\MODIFIES\\MODIFIES: this \\EFFECTS\\EFFECTS: se s e null solleva NullPointerException, se this e definita per s solleva DuplicateException, altrimenti modifica this aggiungendo lassociazione tra s ed x} public void update(String s, int x) throws NotFoundException{ \\MODIFIES\\MODIFIES: this \\EFFECTS\\EFFECTS: se s e null solleva NullPointerException, se this non e definita per s solleva NotFoundException, altrimenti modifica this rimpiazzando lassociazione per s con x} }
Implementazione La scelta fondamentale (come per tutte le classi che definiscono oggetti) e quella delle variabili distanza 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 distanza 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 lintero associato alla stringa nella posizione i-esima di dom I due vettori hanno sempre la stessa dimensione
Unaltra soluzione Utilizzare un tipo ausilario Pair che memorizza le coppie (x,y), y e lelemento associato ad x Utilizzare un vettore di Pair fun = [(d,4), (e,7), (g,9)]
Tipo Record public class Pair{ \\EFFECTS\\EFFECTS: un Pair e una coppia (stringa,intero) public String left; public int right; public Pair (String s,int i){ \\EFFECTS\\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 linvariante e la funzione di astrazione, e sviluppare il ragionamento di correttezza in parallelo a costruttori e metodi In ogni caso la scelta dellimplementazione e invisibile ai moduli che usano Frame
Seconda Parte Un modulo che usa Frame Procedura statica (deve essere scritta in base allinterfaccia pubblica)
public class usaframe{ public int sum(Frame f, String[] a){ \\EFFECTS\\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