1 Progettazione dettagliata di un Tipo di Dato Astratto: l’ambiente di metodi.

Slides:



Advertisements
Presentazioni simili
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Advertisements

1 Semantica Operazionale di un frammento di Java: lo stato.
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
Le gerarchie di tipi.
Esercitazione Frame. Argomento Realizzazione di un tipo di dato astratto Usare le eccezioni per segnalare situazioni particolari Invariante e funzione.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
Semantica Operazionale di un frammento di Java: lo stato
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
PolyFun. Dare implementazione,funzione di astrazione, invarianti della rappresentazione. Provare che i metodi apply e bind preservano gli invarianti.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
1 Le gerarchie di tipi. 2 Supertipi e sottotipi 4 un supertipo –class –interface 4 può avere più sottotipi –un sottotipo extends il supertipo ( class.
GESTIONE DEGLI ERRORI Spesso vi sono istruzioni critiche, che in certi casi possono produrre errori. Lapproccio classico consiste nellinse- rire controlli.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Astrazione procedurale ed eccezioni
1 Un esempio con iteratore: le liste ordinate di interi.
Heap concetti ed applicazioni. maggio 2002ASD - Heap2 heap heap = catasta condizione di heap 1.albero binario perfettamente bilanciato 2.tutte le foglie.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Eccezioni Metodi parziali Eccezioni: Usi e Metodi parziali Eccezioni: rimuovere i requires Eccezioni: rimuovere i requires Eccezioni: definizione, sollevamento,
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
estensione (con piccole varianti) di quella in
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
Liste di Interi Esercitazione. Una variante Liste concatenate di Integers Non modificabile Costruttori per creare la lista vuota o un nodo Metodi d’istanza.
Primo Compitino Primo esercizio Identificare gli errori segnalati dal compilatore Verifica statica del codice Regole di binding per i nomi (quelle.
1 Semantica Operazionale di un frammento di Java: le regole di transizione estensione (con piccole varianti) di quella in FONDAMENTI DI PROGRAMMAZIONE.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
Liste di Interi Esercitazione. IntList Lista di interi Una lista è una disposizione ordinata di elementi ( non in modo crescente-descrescente, ma per.
Si dia la specifica del tipo di dato astratto Tabella.Una Tabella ha due colonne e un numero variabile di righe. Gli elementi della prima colonna sono.
1 Gerarchie e polimorfismo: liste. 2 Generalizzare le liste di interi  List 4 lista di oggetti –non modificabile 4 vorremo poi definire un sottotipo.
1 Astrazione sul controllo: gli iteratori. 2 Gli iteratori 4 perché vogliamo iterarare “in modo astratto” 4 iteratori e generatori in Java –specifica.
LIP: 9 Maggio Esercizi Riprendiamo un esercizio proposto Definire un tipo di dato Persona che definisce oggetti che rappresentano le informazioni.
1 Progettare un Tipo di Dato Astratto. 2 Scelte di Progetto (astrazione) 4 Caratteristiche degli oggetti –Modificabilità 4 Scelta delle operazioni –Realizzare.
1 Astrazione procedurale ed Eccezioni. 2 Procedure stand alone 4 indipendenti da specifici oggetti 4 come si realizzano in Java –metodi statici definiti.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
1 Un esempio: le liste ordinate di interi. 2 Liste ordinate  OrderedIntList 4 lista ordinata di interi –modificabile.
1 Semantica Operazionale di un frammento di Java: le regole di transizione estensione (con piccole varianti) di quella in Barbuti, Mancarella, Turini,
1 Semantica Operazionale di un frammento di Java: le regole di transizione estensione (con piccole varianti) di quella in Barbuti, Mancarella, Turini,
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
Metodologie di Programmazione Esercizi sulla semantica di Java.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
Ese 3 (del 31 Marzo 2004). Testo Dare rappresentazione e realizzazione dei metodi della seguente classe QueueWithPriority. Nella risposta, non riportare.
LIP: 22 Marzo 2005 Eccezioni. Eccezioni-Richiami Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
1 Le s-espressioni. 2  Sexpr 4 alberi binari (possibilmente “vuoti”) che hanno sulle foglie atomi (stringhe) 4 sono la struttura dati base del linguaggio.
Esercizio 3. Testo Dare rappresentazione e realizzazione dei metodi della seguente classe QueueWithPriority. Nella risposta, non riportare i commenti.
PolyFun. Dare implementazione,funzione di astrazione, invarianti della rappresentazione. Provare che i metodi apply e bind preservano gli invarianti.
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
1 Semantica Operazionale di un frammento di Java: lo stato estensione (con piccole varianti) di quella in Barbuti, Mancarella, Turini, Elementi di Semantica.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Esercitazione. Problema Vogliamo definire in modo gerachico un tipo di dato che definisce Tabelle multi-dimensionali con un numero di righe variabili.
Primo Compitino Terzo Esercizio Implementare il tipo di dato astratto Table un oggetto di tipo Table ha due colonne e un numero variabile di righe.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Ese 1 e 3 (del 6 Aprile 2005). Primo Ese Si identifichino gli errori che il compilatore segnalerebbe per il seguente programma Tipi Legami tra dichiarazioni.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Esercitazione 14 Marzo Esercizio dell’altra volta Definire un tipo di dato Abbonato i cui oggetti descrivono le informazioni relative ad un abbonato.
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
Liste Concatenate 28 Marzo Avviso Martedi’ 4 Aprile: Verifica di LIP Per iscriversi (obbligatorio) inviare un e- mail entro venerdi’ 31 Marzo a.
1 Semantica Operazionale di un frammento di Java: intro estensione (con piccole varianti) di quella di FP | v |
1 Semantica Operazionale di un frammento di Java: intro estensione (con piccole varianti) di quella di FP | v |
1 Un esempio con iteratore: le liste ordinate di interi.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
LIP: 18 Aprile 2008 Interfacce. Rappresentazione Lista val next vuota Lista vuota: any true Lista non vuota: any true 154 false 24 false.
1 Espressioni 4 dato che non abbiamo previsto inizializzazioni per le variabili (statiche e di istanza) all’interno delle classi, le espressioni possono.
Ese 3 (del 3 Aprile 2003).
Transcript della presentazione:

1 Progettazione dettagliata di un Tipo di Dato Astratto: l’ambiente di metodi

2 L’ambiente di metodi 4 Ambiente dei metodi Menv = Id -> Mdescr Mdescr = Idlist * Blocco * ( Loc | Id ) –memptyenv() –mbind((  :Menv), (i:Id), (m:Mdescr)) –mdefined ((  :Menv), (i:Id)) –instantiate((  :Menv), (l: Loc)) –applicazione

3 Dove era usato nello stato (1) 4 parte statica (classi) Object A B C A A a b c 23 5 d e ? ? f3 C () ? (x)? ()? f4 f1 f2 (y,z) (w) C C codice blocco f2 codice blocco f3 codice blocco f4 codice blocco f1 codice blocco C puntatore ad oggetto

4 Dove era usato nello stato(2) 4 parte dinamica (pila e heap) C d e 3 f3 C () (x) () f4 puntatori al codice dei metodi stack x heap

5 L’ambiente di metodi 1 public class MethodEnv { // OVERVIEW: un MethodEnv è una // funzione parziale da identificatori // di metodi (stringhe) a descrizioni di // metodi. Non è modificabile. // costruttore public MethodEnv () // EFFECTS: costruisce un nuovo // MethodEnv indefinito per tutti // gli identificatori

6 L’ambiente di metodi 2 public boolean defined (String s) // EFFECTS: se this è definita per // l'identificatore s ritorna true // altrimenti ritorna false

7 L’ambiente di metodi 3 public Mdescr apply (String s) throws Undefined // EFFECTS: se la funzione this è // definita per l'identificatore x // restituisce this(s) altrimenti // solleva l'eccezione (unchecked) // Undefined

8 L’ambiente di metodi 4 public MethodEnv bind (String s, Mdescr m) // EFFECTS: restituisce una funzione // diversa da this solo perché se // applicata ad s restituisce m

9 L’ambiente di metodi 5 public MethodEnv instantiate (ClassorObject o) throws NonObjectException // EFFECTS: restituisce una funzione // diversa da this solo perché per ogni // nome restituisce una descrizione di // metodo nuova contenente l'oggetto o // se o non e' un oggetto solleva // NonObjectException (unchecked)

10 Di che altri tipi abbiamo bisogno? 4 le descrizioni di metodo –Mdescr = Idlist * Blocco * ( Loc | Id ) –Mdescr 4 l’identificatore di classe o oggetto –( Loc | Id ) –ClassorObject 4 i due exception types (unchecked) –NonObjectException –Undefined

11 I tipi eccezione 4 i due exception types (unchecked) –NonObjectException –Undefined public class NonObjectException extends RuntimeException { // costruttore public NonObjectException (String s) {super (s); } }

12 I tipi eccezione 4 i due exception types (unchecked) –NonObjectException –Undefined public class Undefined extends RuntimeException { // costruttore public Undefined (String s) {super (s); } }

13 L’identificatore di classe o oggetto 1 –ClassorObject –( Loc | Id ) public class ClassorObject { // un ClassorObject è un oggetto che può // essere un identificatore di classe // (stringa), un identificatore di // oggetto (Loc) o indefinito

14 L’identificatore di classe o oggetto 2... // 3 costruttori overloaded public ClassorObject () // EFFECTS: costruisce un ClassorObject // indefinito public ClassorObject (String x) // EFFECTS: costruisce un ClassorObject // che contiene la classe x public ClassorObject (Loc x) // EFFECTS: costruisce un ClassorObject // che contiene l’oggetto x

15 L’identificatore di classe o oggetto 3 public boolean isClass () // EFFECTS: se this è un identificatore // di classe restituisce true altrimenti // restituisce false public boolean isUndefined () // EFFECTS: se this è indefinito // restituisce true altrimenti // restituisce false public boolean isObject () // EFFECTS: se this è un oggetto // restituisce true altrimenti // restituisce false }

16 Di che altri tipi abbiamo bisogno?  le locazioni (identificatori di oggetti) –Loc public class Loc { // Loc contiene un intero che permette // di indirizzare una heap: ha uno stato // interno che permette di generare // valori sempre diversi

17 Le locazioni // costruttore public Loc () // EFFECTS: costruisce una nuova Loc // MODIFIES: lo stato interno // metodi public int key () // restituisce il valore contenuto in // this }

18 Le descrizioni di metodo 4 le descrizioni di metodo –Mdescr = Idlist * Blocco * ( Loc | Id ) –Mdescr 4 lo realizziamo direttamente con un record type –Idlist e Blocco sono stringhe –il terzo campo è un ClassorObject

19 Le descrizioni di metodo 1 public class Mdescr { // OVERVIEW: un Mdescr è un record type // che contiene tutta l’informazione // associata ad un metodo String parameters; String body; ClassorObject belongsto;

20 Le descrizioni di metodo 2 // costruttore public Mdescr (String x, String y, ClassorObject z) // EFFECTS: costruisce un record // contenente i tre argomenti {parameters = x; body = y; belongsto = z;} }

21 Lo stato della progettazione 4 classi specificate e implementate (eccezioni e record types) –Mdescr –NonObjectException –Undefined 4 classi specificate –ClassorObject –Loc –MethodEnv

22 La relazione “chi usa chi” a livello di specifica MethodEnv MdescrUndefined ClassorObject Loc NonObjectException

23 Come continuare 4 le classi da implementare –ClassorObject –Loc –MethodEnv 4 possono essere implementate in un ordine qualunque –Loc –ClassorObject –MethodEnv

24 Implementazione di Loc 1 public class Loc { // Loc contiene un intero che permette // di indirizzare una heap: ha uno stato // interno che permette di generare // valori sempre diversi private static int stato = 0; private int chiave;  chiave è il valore “contenuto”  stato è lo stato interno (static)

25 Implementazione di Loc 2 // costruttore public Loc () // EFFECTS: costruisce una nuova Loc // MODIFIES: lo stato interno { chiave = stato; stato = stato + 1; return; }

26 Implementazione di Loc 3 // metodi public int key () // restituisce il valore contenuto in // this { return chiave; } }

27 Implementazione di ClassorObject 1 public class ClassorObject { // un ClassorObject è un oggetto che può // essere un identificatore di classe // (stringa), un identificatore di // oggetto (Loc) o indefinito private Object v;  lo stato è una variabile di tipo Object

28 Implementazione di ClassorObject 2 public ClassorObject () // EFFECTS: costruisce un ClassorObject // indefinito { } public ClassorObject (String x) // EFFECTS: costruisce un ClassorObject // che contiene la classe x { v = x; } public ClassorObject (Loc x) // EFFECTS: costruisce un ClassorObject // che contiene l’oggetto x { v = x; }

29 Implementazione di ClassorObject 3 public boolean isClass () // EFFECTS: se this è un identificatore // di classe restituisce true altrimenti // restituisce false {if (isUndefined()) return false; String s; try {s = (String) v;} catch (Exception e) {return false; } return true; }  utilizziamo le eccezioni (mascherate) per fare un’analisi di casi sul tipo

30 Implementazione di ClassorObject 4 public boolean isUndefined () // EFFECTS: se this è indefinito // restituisce true altrimenti // restituisce false { if (v == null) return true; else return false; }

31 Implementazione di ClassorObject 5 public boolean isObject () // EFFECTS: se this è un oggetto // restituisce true altrimenti // restituisce false {if (isUndefined()) return false; Loc l; try {l = (Loc) v;} catch (Exception e) {return false;} return true;} }

32 Implementazione di MethodEnv public class MethodEnv { // OVERVIEW: un MethodEnv è una // funzione parziale da identificatori // di metodi (stringhe) a descrizioni di // metodi. Non è modificabile.  decidiamo di rappresentare le funzioni con arrays i cui elementi sono coppie ( String, Mdescr ) –specifichiamo quindi per prima cosa un tipo record PairIdeVal un po’ più generale di quello che ci serve

33 Specifica ed implementazione di PairIdeVal public class PairIdeVal { // OVERVIEW: un PairIdeVal è un record // type che contiene una associazione // tra nome e valore String nome; Object valore; // costruttore public PairIdeVal (String x, Object z) // EFFECTS: costruisce un record // contenente i due argomenti {nome = x; valore = z;} } un po’ più generale di quello che ci serve –i valori sono Object e non Mdescr

34 La relazione “chi usa chi” a livello di specifica e di implementazione MethodEnv MdescrUndefined ClassorObject Loc NonObjectException PairIdeVal

35 Implementazione di MethodEnv 1 public class MethodEnv { // OVERVIEW: un MethodEnv è una // funzione parziale da identificatori // di metodi (stringhe) a descrizioni di // metodi. Non è modificabile. private PairIdeVal[] associazioni;

36 Implementazione di MethodEnv 2 // costruttore pubblico public MethodEnv () // EFFECTS: costruisce un nuovo // MethodEnv indefinito per tutti // gli identificatori {associazioni = new PairIdeVal[0];}

37 Implementazione di MethodEnv 3 // altri costruttori privati private MethodEnv (PairIdeVal[] m) // EFFECTS: costruisce una nuova // funzione la cui rappresentazione // è m {associazioni = new PairIdeVal[m.length]; if (m.length == 0) return ; for (int i = 0; i < m.length; i++) { PairIdeVal p = m[i]; associazioni[i] = p;} }

38 Implementazione di MethodEnv 4 // altri costruttori privati private MethodEnv (int n) // EFFECTS: costruisce una nuova // funzione la cui rappresentazione // è un array vuoto lungo n {associazioni = new PairIdeVal[n];}

39 Implementazione di MethodEnv 5 // altri costruttori privati private MethodEnv (PairIdeVal[] m, int n) // REQUIRES: n = m.length+1 // EFFECTS: costruisce una nuova // funzione la cui rappresentazione // è un array uguale ad m più una // posizione vuota {associazioni = new PairIdeVal[n]; if (m.length == 0) return ; for (int i = 0; i < m.length; i++) { PairIdeVal p = m[i]; associazioni[i] = p;} }

40 Implementazione di MethodEnv 6 public boolean defined (String s) // EFFECTS: se this è definita per // l'identificatore s ritorna true // altrimenti ritorna false {if (associazioni.length == 0) return false; for (int i = 0; i < associazioni.length; i++) { PairIdeVal p = associazioni[i]; if (s.equals(p.nome)) return true;} return false;}

41 Implementazione di MethodEnv 7 public Mdescr apply (String s) throws Undefined // EFFECTS: se la funzione this è // definita per l'identificatore x // restituisce this(s) altrimenti // solleva l'eccezione (unchecked) // Undefined {for (int i = 0; i < associazioni.length; i++) { PairIdeVal p = associazioni[i]; if (s.equals(p.nome)) return (Mdescr) p.valore;} throw new Undefined("Methodenv.apply");}

42 Implementazione di MethodEnv 8 public MethodEnv bind (String s, Mdescr m) // EFFECTS: restituisce una funzione diversa da this // solo perché se applicata ad s restituisce m {MethodEnv nuovo; PairIdeVal newass = new PairIdeVal(s,m); if (defined(s)) {nuovo = new MethodEnv(associazioni); for (int i = 0; i < nuovo.associazioni.length; i++) {PairIdeVal p = nuovo.associazioni[i]; if (s.equals(p.nome)) nuovo.associazioni[i] = newass;} return nuovo;} else {if (associazioni.length == 0) {nuovo = new MethodEnv(1);} else {nuovo = new MethodEnv(associazioni, associazioni.length + 1);} nuovo.associazioni[associazioni.length] = newass; return nuovo;}

43 Implementazione di MethodEnv 9 public MethodEnv instantiate (ClassorObject o) throws NonObjectException // EFFECTS: restituisce una funzione diversa da this // solo perché per ogni nome restituisce una // descrizione di metodo nuova contenente l'oggetto o // se o non e' un oggetto solleva NonObjectException // (unchecked) {MethodEnv nuovo = new MethodEnv(associazioni); if (o.isObject()) { for (int i = 0; i < associazioni.length; i++) { Mdescr vecchia = (Mdescr) associazioni[i].valore; Mdescr nuova = new Mdescr(vecchia.parameters,vecchia.body,o); PairIdeVal newass = new PairIdeVal(associazioni[i].nome,nuova); nuovo.associazioni[i] = newass;} return nuovo;} else {throw new NonObjectException("MethodEnv.instantiate");}}

44 Quello che dovete fare 4 seguire la stessa metodologia per la specifica e l’implementazione del tipo di dato astratto (modificabile) Frame = Id -> Val Val = (Bool | Int | Loc) –newframe() –copy((  :Frame)) –bind((  :Frame), (i:Id), (v:Val)) –update((  :Frame), (i:Id), (v:Val)) –defined((  :Frame), (i:Id))  cercando di riutilizzare al massimo i tipi definiti per MethodEnv