Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati...

33
Astrazione di dati Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: cosa e perchè Dati Astratti: due meccanismi Dati Astratti: due meccanismi differenti differenti Astrazione e incapsulamento di Astrazione e incapsulamento di dati in Java dati in Java Specifica in Java: costruttori, Specifica in Java: costruttori, operazioni operazioni Modificabilità: produttori, Modificabilità: produttori, modificatori, osservatori modificatori, osservatori Esempi: Intset, Poly Esempi: Intset, Poly

Transcript of Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati...

Page 1: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Astrazione di datiAstrazione di dati

• Dati Astratti: cosa e perchèDati Astratti: cosa e perchè

• Dati Astratti: due meccanismi differentiDati Astratti: due meccanismi differenti• Astrazione e incapsulamento di dati in JavaAstrazione e incapsulamento di dati in Java• Specifica in Java: costruttori, operazioniSpecifica in Java: costruttori, operazioni• Modificabilità: produttori, modificatori, osservatoriModificabilità: produttori, modificatori, osservatori• Esempi: Intset, PolyEsempi: Intset, Poly• Implementazione: stato e metodiImplementazione: stato e metodi• Esempi: RecordEsempi: Record

Page 2: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Dati Astratti: cosa e perchèDati Astratti: cosa e perchè

• Dati non presenti nel linguaggioDati non presenti nel linguaggio:– insiemi, polinomi, code, …insiemi, polinomi, code, …

• Come introdurli e usarli nei programmiCome introdurli e usarli nei programmi?

• Codifica: Codifica: – S: Set ->N; P: Poly->N; Q: Queue -> NS: Set ->N; P: Poly->N; Q: Queue -> N– espressivitàespressività

Page 3: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Dati Astratti: due meccanismi Dati Astratti: due meccanismi differentidifferenti

Tipi algebrici (Ling. Funzionali):Tipi algebrici (Ling. Funzionali):– set(t) = EmptySet + Add(t,set(t))set(t) = EmptySet + Add(t,set(t))– set(t) = EmptySet + {t} + Union(set(t),set(t))set(t) = EmptySet + {t} + Union(set(t),set(t))

Astrazione = Generalizzazione + IncapsulamentoAstrazione = Generalizzazione + Incapsulamento

(Linguaggi procedurali)(Linguaggi procedurali)– GeneralizzazioneGeneralizzazione - interfaccia di uso- interfaccia di uso– IncapsulamentoIncapsulamento - trasparenza implementazione- trasparenza implementazione

Page 4: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Astrazione e Incapsulamento di Astrazione e Incapsulamento di dati in Javadati in Java

• Oggetti: Oggetti: forniscono forniscono – rappresentazionerappresentazione per valori astratti e operazioni per valori astratti e operazioni

associateassociate

• Classi (e gerarchie): Classi (e gerarchie): forniscono forniscono – specificaspecifica per definire dati astratti e per definire dati astratti e – regole di visibilità e di accesso per incapsulare regole di visibilità e di accesso per incapsulare

(trasparenza) (trasparenza) implementazioneimplementazione

Page 5: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Specifica di dati in JavaSpecifica di dati in Java

Definisce:Definisce:• classe:

• overview: proprietà generali• modificabilità / non-modific.

• costruttori: • costruttori di oggetti• headers: nome, parametri e tipi, eccezioni• specifica: R+E

• operazioni:operazioni:• metodi di istanza;metodi di istanza;• headers: nome, parametri e tipi, eccezioni• specifica: R+M+E

Page 6: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

ModificabilitàModificabilità

Proprietà generale: valori con o senza stato– Valori modificabili:

• Hanno stato modificabile Hanno stato modificabile • Modificatori: Hanno operazioni (metodi) per la modifica Hanno operazioni (metodi) per la modifica

dello statodello stato

– Valori non modificabili: • Hanno stato non modificabileHanno stato non modificabile• Produttori: hanno operazioni (metodi) per il calcolo di

nuovi valorinuovi valori

– Osservatori:– Metodi per estrarre proprietà o visitare componenti Metodi per estrarre proprietà o visitare componenti

(modificabili o non modificabili) (modificabili o non modificabili)

Page 7: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Esempi: specifica di IntSetEsempi: specifica di IntSetpublic class IntSet{public class IntSet{//overview: gli IntSet sono oggetti modificabili per insiemi di interi. Un IntSet è un valore

{x1,…,xn} per n arbitrari, distinti interi xi.

//costruttoripublic IntSet()public IntSet()//Effects: inizializza this all’insieme vuoto

//metodi modificatoripublic void insert(int x)public void insert(int x)//modifies: this//effects: aggiunge x a this se non già presente, i.e: this_post=this+{x}public void remove(int x)public void remove(int x)//modifies: this//effects: rimuove x da this se presente, i.e: this_post=this-{x}…

//metodi osservatoripublic int size()public int size()//effects: calcola cardinalità di this……

presentazione

post-condizioni

Page 8: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Esempi: specifica di PolyEsempi: specifica di Polypublic class Poly{public class Poly{//overview: I Poly sono oggetti non modificabili per polinomi a coefficienti interi. Un Poly è un // valore co+c1x1+…+cnxn, per abitrario n e ci intero possibilmente 0.

//costruttoripublic Poly()public Poly()//Effects: inizializza this al polinomio 0, i.e: n=0 & co=0.public Poly(int c, int n) throws NegativeExponentExceptionpublic Poly(int c, int n) throws NegativeExponentException//Effects: se n<0 solleva l’eccezione, altrimenti inizializza this al polinomio cnxn.

//metodi produttoripublic Poly add(Poly q) throws NullPointerExceptionpublic Poly add(Poly q) throws NullPointerException//Effects: se q==null solleva eccezione, altrimenti calcola this+q, i.e: polinomio a coefficienti// somma coefficienti di esponenti corrispondentipublic void mul(Poly q) throws NullPointerExceptionpublic void mul(Poly q) throws NullPointerException //Effects: se q==null solleva eccezione, altrimenti calcola this*q, i.e: polinomio a coefficienti// prodotto coefficienti di esponenti con somma corrispondente ……

//metodi osservatoripublic int degree()public int degree()//Effects: calcola il massimo grado del polinomio.……

Page 9: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Implementazione: stato e metodiImplementazione: stato e metodi

Rappresentazione: 1.1. Stato:Stato:

• variabili di istanzavariabili di istanza

• anche statiche per proprietà comuni anche statiche per proprietà comuni

2. 2. Metodi:Metodi:• Operano su valori implementati con tale statoOperano su valori implementati con tale stato

• Operano in accordo alla specifica: R+M+EOperano in accordo alla specifica: R+M+E

• Realizzano algoritmi di calcolo utilizzando le 3 fasi dello Realizzano algoritmi di calcolo utilizzando le 3 fasi dello sviluppo:sviluppo:

1.1. Specifica Specifica

2.2. Implementazione: a) algoritmo, b) ausiliariImplementazione: a) algoritmo, b) ausiliari

3.3. Completamento ausiliari: ripeti 1-3 su ausiliariCompletamento ausiliari: ripeti 1-3 su ausiliari

Page 10: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Casi Semplici: Records solo statoCasi Semplici: Records solo statoTipo concretoTipo concreto

- RecordRecord = n-tuple di valori non omogenei. Ogni valore selezionabile con uno specifico selettore

- RappresentazioneRappresentazione: - solo statosolo stato- completamente accessibile (dall’esterno)completamente accessibile (dall’esterno)- nessuna operazione specifica nessuna operazione specifica

//---- un package che contiene la classe Polypackage PolyPackage;

class coppia{ // overview: una coppia di interi (x,y) per coefficiente-esponente degli addenti di un polinomio // accessibile solo nel package della classe Polyint coeff;int exp; coppia(int c, int e){ //effects: inizializza this.coeff con c, e this.exp con e;Coeff=c; exp=e;}}

Package+Default

Page 11: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Casi Semplici: Records Casi Semplici: Records Tipo astratto Tipo astratto

public class coppia{// overview: una coppia di interi (x,y), modificabile, per interi, // accessibile ovunque con selettori L (per Left) e R (per Right)

private int L;private int R;public coppia(int l, int r){

//effects: inizializza this.L con l, e this.R con r;L=l; R=r;}

//---- modificatoripublic void setL(int n){

//modifies: this//effects: modifica this.L con nL=n;}

public void setR(int n){//modifies: this//effects: modifica this.R con nR=n;}

//--- osservatori: diventano i selettoripublic int Left(){

//effects:calcola this.L Return L;}

public int Right(){//effects:calcola this.R Return R;}

}

Public + Incapsulamento

(accesso allo statosolo attraverso

operazioni)

Incapsulamento: Incapsulamento: accesso al valore solo attraverso particolari operazioni pubblicheaccesso al valore solo attraverso particolari operazioni pubbliche

Page 12: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Astrazione di dati - 1Astrazione di dati - 1 Implementazione di stato e metodiImplementazione di stato e metodi

Quando le strutture non sono semplici:

• Implementazione di IntSetImplementazione di IntSet

• Implementazione di PolyImplementazione di Poly– stato della rappresentazione: una scelta sui stato della rappresentazione: una scelta sui valori concretivalori concreti

– metodi: algoritmi per le operazionimetodi: algoritmi per le operazioni

• Rappresentazione: Rappresentazione: – come si sceglie?come si sceglie?

– Necessità di una metodologiaNecessità di una metodologia

Page 13: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

IntSet: statoIntSet: stato

La scelta dipende dalla specifica del tipo di dato. In particolare:La scelta dipende dalla specifica del tipo di dato. In particolare:• struttura dei valoristruttura dei valori• operazioni operazioni

• modificabilità dei valorimodificabilità dei valori• algoritmi di calcolo algoritmi di calcolo

Valori concreti più o meno adatti per operazioni disponibili Valori concreti più o meno adatti per operazioni disponibili

La scelta consiste in:La scelta consiste in:struttura di valori concreti con cui rappresentare…

Page 14: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

IntSet: uso VectorsIntSet: uso Vectorspublic class IntSet{//overview: gli IntSet sono oggetti modificabili per insiemi di interi. Un IntSet è un valore {x1,…,xn} per n arbitrari, distinti interi xi.

private Vector els;

//costruttoripublic IntSet()//Effects: inizializza this all’insieme vuoto{els = new Vector();}

public void insert(int x)//modifies: this//effects: aggiunge x a this se non già presente, i.e: this_post=this+{x}{Integer y = new Integer(x); if (getIndex(y) < 0) els.add(y);} public void remove(int x)//modifies: this//effects: rimuove x da this se presente, i.e: this_post=this-{x}{int n = getIndex(new Integer(x)); if (n < 0) return; els.set(n,els.get(size()-1)); els.remove(els.size()-1);}…public int size()//effects: calcola cardinalità di this{return els.size();}

//***** ausiliarie ********private int getIndex(Integer x)//effects: se x occorre in this.els alla posizione i, per 0<=i<els.size()-1

restituisci i, altrimenti -1{for (int i=0; i<els.size(); i++) if x.equals(els.get(i)) return i; return -1;}…

Class Vector //modificatori public void add(Object 0); public void set(int i, Object 0); public void remove(int i); … //osservatori public Object get(int n); public int size(); …….

PrivatePrivate: trasparenza implementazione: trasparenza implementazione

Ausiliarie:Ausiliarie: astrazioni+decomposizioneastrazioni+decomposizione

Page 15: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Poly: uso array - int[]Poly: uso array - int[]public class Poly{//overview: I Poly sono oggetti non modificabili per polinomi a coefficienti interi. Un Poly è un // valore co+c1x1+…+cnxn, per arbitrario n e ci intero possibilmente 0.

private int[] trms;

public Poly()//Effects: inizializza this al polinomio 0, i.e: n=0 & co=0.{trms = new int[0];}

public Poly(int c, int n) throws NegativeExponentException//Effects: se n<0 solleva l’eccezione, altrimenti inizializza this al polinomio cnxn.{if (n<0) throw new NegativeExponentException(“Poly:Poly” ); if(c==0) {trms = new int[0]; return;} trms = new int[n+1]; for(int j=0; j<n; j++) trms[j]=0; trms[n] = c;}

public Poly add(Poly q) throws NullPointerException//effects: se q==null solleva eccezione, altrimenti calcola this+q, i.e: polinomio a coefficienti// somma coefficienti corrispondenti{if (q == null) throw new NullPointerException(“Poly:Add” ); Poly min = min(q); Poly max = max(q); int dmin = min.degree(); int dmax = max.degree(); if (dmin == dmax) for (int j=dmax; j>=0; j--) if (coeff(j)+q.coeff(j) != 0) break; else dmax--; if (dmax == -1) return new Poly(); Poly r = new Poly (max.coeff(dmax), dmax); if (dmin > dmax) r.reset(r.coeff(dmax)+min.coeff(dmax), dmax); for (int j= 0; j<=dmin & j<dmax; j++) r.reset(coeff(j)+q.coeff(j),j); for(int j= dmin+1; j<dmax; j++) r.reset(coeff(j),j); return r;}

//***** ausiliari *******private Poly reset(int c, int i)//requires: 0<=j<=degree() //modifies: this//effects: modifica in c il coefficiente di grado j di this.{trms[j] = c;}…

Page 16: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Rappresentazione?Rappresentazione?

1.1. Stato:Stato:

• che relazione tra stato e valore rappresentato? che relazione tra stato e valore rappresentato?

2. 2. Metodi:Metodi:

• … …..

• Operano in accordo alla specifica: R+M+E ?

• … …

Necessità di una metodologiaNecessità di una metodologia

Page 17: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Una metodologia per Astrazioni di dati

1. Stato Concreto della rappresentazione

2. Funzione di Astrazione AF

3. Invariante di Rappresentazione I

4. Uso di AF ed I per l’implementazione dei metodi:• Preservare I

• Verificare AF

5. Definizione degli additional: toString, clone, equals

6. Verifica: – benevolent side effects – accessibilità della rappresentazione– adeguatezza

Page 18: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Astrazione di dati - 2Astrazione di dati - 2 I punti della metodologiaI punti della metodologia

• relazione tra valore astratto e stato concreto: AF, I relazione tra valore astratto e stato concreto: AF, I

• ragionare sulle astrazioni di dati:ragionare sulle astrazioni di dati:– preservare Ipreservare I

– verificare specifica con AFverificare specifica con AF

– correttezza: una tabellacorrettezza: una tabella

• metodi addizionali (i.e. ereditati): equals, clone, toStringmetodi addizionali (i.e. ereditati): equals, clone, toString

• proprietàproprietà– benevolent side effects benevolent side effects

– accessibilità della rappresntazioneaccessibilità della rappresntazione

– adeguatezzaadeguatezza

Page 19: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Relazione tra valore Relazione tra valore AAstratto e stato stratto e stato CConcreto: AFoncreto: AF

• AFAF: mapping C -> A: mapping C -> A• come uno stato concreto rappresenta un valore astratto• s C, AF(s) A• non iniettiva (in generale)

AFAF

public class IntStack{public class IntStack{//…modificabile…un IntStack è un valore [x1,…,xn], l'ultimo inserito è xn//ed xn è il primo accessibile. … …

private Vector els;private Vector els;// AF(s)=[x1,…,xn]: (s.els.size()==n) & (n>=0) &

& (0≤i<n)xi+1==s.els.get(i).intValue()CCAA

public class IntSet{//overview: gli IntSet sono oggetti modificabili per insiemi di interi. Un IntSet è un valore {x1,…,xn} per n arbitrari, distinti interi xi. … … private int[] els;private int[] els;// AF(s)={s.els[i] | 0≤i<s.els.length}

Page 20: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Relazione tra valore Relazione tra valore AAstratto e stato stratto e stato CConcreto: invariante Ioncreto: invariante I

• II: restrizioni su C : restrizioni su C • tutti i valori concreti rappresentano un valore astratto ?• AFAF parziale su C• I predicato:

• s C, AF(s)AF(s) A se e solo se I(s) A se e solo se I(s)

s.els={“ab”}s.els={“ab”}Questo vettore non può essere stato concreto di un valore per IntStack

public class IntStack{public class IntStack{//…modificabile…un IntStack è un valore [x1,…,xn], l'ultimo inserito è xn//ed xn è il primo accessibile. … …

private Vector els;private Vector els;// AF(s) = [x1,…,xn]: (s.els.size() == n) & (n >= 0) & // AF(s) = [x1,…,xn]: (s.els.size() == n) & (n >= 0) &

& (0≤i<n)xi == s.els.get(i).intValue()& (0≤i<n)xi == s.els.get(i).intValue()// I(s) = (s.els ≠ null) & (0≤i<n) s.els.get(i) instanceof Integer

Page 21: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Usiamo AF ed I per implementareUsiamo AF ed I per implementarepublic class IntSet{//overview: gli IntSet sono oggetti modificabili per insiemi di interi. //Un IntSet è un valore {x1,…,xn} per n arbitrari, distinti interi xi. … … private Vector els;private Vector els;// AF(s)={((Integer)s.els.get(i)).intValue() | 0≤i<s.els.size()}// I(s)=(s.els!=null)&(0≤i<j<s.els.size()) !((Integer)s.els.get(i)).equals(((Integer)s.els.get(j)))

public IntSet()//Effects: inizializza this all’insieme vuoto{els = new Vector();}

public void insert(int x)//modifies: this//effects: aggiunge x a this se non già presente, i.e: this_post=this+{x}{Integer y = new Integer(x); if (getIndex(y) < 0) els.add(y);}

Perché AF ci dice chel’insieme vuoto è elscon els.size()=0

els.add(y): Perché AF ci dice che se y è in els allora è in AF(this).getIndex(y): Perché I ci dice che se y è già in els allora non deve essere aggiunto

Page 22: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Relazione tra valore Relazione tra valore AAstratto e stato stratto e stato CConcreto: Implementiamo AFoncreto: Implementiamo AF

• AFAF: mapping C -> A: mapping C -> A• fornisce una rappresentazione esterna (output)fornisce una rappresentazione esterna (output)• implementa implementa toString ---- toString ---- in Java è un additionalin Java è un additional

public class IntStack{public class IntStack{… … private Vector els;private Vector els;// AF(s) = [x1,…,xn]: (s.els.size() == n) & (n >= 0) & (0≤i<n)xi == ((Integer)s.els.get(i)).intValue()……public String toString(){public String toString(){//Effects: overidden dell’additional toString per IntStack//Effects: overidden dell’additional toString per IntStack String R = “[“;String R = “[“; for(i=0;i<els.size();i++) {R=R+((Integer)els.get(i)).intValue(); if (i<els.size()-1) R=R+”,”;};for(i=0;i<els.size();i++) {R=R+((Integer)els.get(i)).intValue(); if (i<els.size()-1) R=R+”,”;}; return R+”]”;}return R+”]”;}

Page 23: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

implementiamo Iimplementiamo I

• II: invariante su C : invariante su C • fornisce un predicato su i “termini legali” per Cfornisce un predicato su i “termini legali” per C• implementa implementa repOkrepOk

public class IntStack{… private Vector els;// I(s) = (s.els ≠ null) & (0≤i<n)(s.els.get(i) instanceof Integer)…public boolean repOk(){//Effects: calcola true se e solo se I(this) if (els = null) return false; for (i=0;i<els.size();i++) {if !(s.els.get(i) instanceof Integer) return false;}; return true;}

Page 24: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Ragionare sulle astrazioni di dati:Ragionare sulle astrazioni di dati: preservare I preservare I

Implementazione Implementazione deve soddisfaredeve soddisfare data type inductiondata type induction::

1.1. costruttore costruttore c(T1 v1,…,Tn vn)c(T1 v1,…,Tn vn) n-ario della classe n-ario della classe AA: : • I(this) per ogni n-tupla di parametriI(this) per ogni n-tupla di parametri

assunto I(v1)&…&I(vn)assunto I(v1)&…&I(vn)

• produttore produttore p(T1 v1,…,Tn vn)p(T1 v1,…,Tn vn) della classe della classe AA::• I(p(v1,…,vn)) per ogni n-tupla di parametriI(p(v1,…,vn)) per ogni n-tupla di parametri

assunto I(v1)&…&I(vn)&I(this)assunto I(v1)&…&I(vn)&I(this)

• modificatore modificatore m(T1 v1,…,Tn vn)m(T1 v1,…,Tn vn) n-ario della classe n-ario della classe AA::• I(this_post) per ogni n-tupla di parametri I(this_post) per ogni n-tupla di parametri

assunto I(v1)&…&I(vn)&I(this)assunto I(v1)&…&I(vn)&I(this)

Page 25: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Preservare I: EsempioPreservare I: Esempio

public class IntStack{//…modificabile…un IntStack è un valore [x1,…,xn], l'ultimo inserito è xn…

private Vector els;// I(s) = (s.els ≠ null) & (0≤i<n=s.els.size()) s.els.get(i) instanceof Integer

public IntStack()//Effects: costruisce uno stack vuoto{els = new Vector();}…public void push(int i)//modifies: this//effects: inserisce i nella pila.{els.add(new Integer(i));}

els diventa new Vector, quindi: this.els!=null & els.size()==0this.els!=null & els.size()==0

1) I(this) per assunzione. Quindi:this.els!=null & this.els.get(i) instanceof Integer per tutti gli 0≤i< this.els.size()2) Il corpo è els.add(new Integer(i)) quindi:this_post.els differisce da this.els per new Integer(i),all’indice this_post.els.size, che è istanza di Integer rende this_post.els certamente non null.

Page 26: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Ragionare sulle astrazioni di dati:Ragionare sulle astrazioni di dati: verificare AF verificare AF

implementazione implementazione deve soddisfaredeve soddisfare specifiche: specifiche:

1.1. costruttore costruttore c(v1…vn)c(v1…vn) n-ario della classe n-ario della classe AA: : • AF(this_post) AF(this_post) c.E c.E

assunto c.R(v1)&…&c.R(vn)assunto c.R(v1)&…&c.R(vn)

• produttore produttore p(v1…vn)p(v1…vn) della classe della classe AA::1.1. AF(p(v1,…,vn)) AF(p(v1,…,vn)) p.E p.E

assunto p.R(v1)&…&p.R(vn)assunto p.R(v1)&…&p.R(vn)

• modificatore modificatore m(v1…vn)m(v1…vn) n-ario della classe n-ario della classe AA::1.1. AF(this_post) AF(this_post) m.E m.E assunto m.R(v1)&…&m.R(vn)assunto m.R(v1)&…&m.R(vn)

R = requiresE = effectsM = modifies

Page 27: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Verificare AF: esempioVerificare AF: esempio

public class IntStack{//…modificabile…un IntStack è un valore [x1,…,xn], l'ultimo inserito è xn…

private Vector els;// AF(s) = [x1,…,xn]: (s.els.size == n) & (n >= 0) & (0≤i<n)xi == s.els.get(i).intValue()public IntStack()//Effects: costruisce uno stack vuoto{els = new Vector();}…public void push(int i)//modifies: this//effects: inserisce i nella pila.{els.add(new Integer(i));}

els diventa new Vector, quindi: this.els!=null & els.size()==0this.els!=null & els.size()==0==> AF(this)=[]==> AF(this)=[]

els.add(v)==> this_post.els.get(j)=this.els.get(j) 0≤j<this_post.els.size()-1==> AF(this_post)=[x1,…,xn,v] se AF(this)=[x1,…,xn]

Page 28: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Correttezza: una tabella

Classe AClasse A Public class A{…}Public class A{…}

//O: …invariante sugli oggetti…//O: …invariante sugli oggetti…

RepRep

//AF(c)= …//AF(c)= …

//I(c)= …//I(c)= …

//costruttori//costruttori

A(param)//R,E:…{B}A(param)//R,E:…{B}

R(param), B => E(AF(this))R(param), B => E(AF(this))

B => I(this)B => I(this)

//modificatori//modificatori

Public void M(param)//R,M,E…{B}Public void M(param)//R,M,E…{B}

R(this,param), B => E(AF(this_post))R(this,param), B => E(AF(this_post))

I(this ), B => I(this_post) I(this ), B => I(this_post)

//produttori//produttori

Public A P(param)//R,E…{B}Public A P(param)//R,E…{B}

R(this,param), B => E(AF(P(param)))R(this,param), B => E(AF(P(param)))

I(this), B => I(P(param)) I(this), B => I(P(param))

//osservatori//osservatori

Public Type V(param)//R,E…{B}Public Type V(param)//R,E…{B}

R(this,param), B => E(AF(V(param)))R(this,param), B => E(AF(V(param)))

//privati//privati

private Type T(param)//R,M,E…{B}private Type T(param)//R,M,E…{B}

come modificatori se mod.come modificatori se mod.

= produttori se prod.= produttori se prod.

= osservatori se oss.= osservatori se oss.

Costrutti Specifica/Verifica

Page 29: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Metodi addizionali (i.e. ereditati): Metodi addizionali (i.e. ereditati): equalsequals, clone, toString, clone, toString

EqualsEquals = uguaglianza ridefinibile su oggetti = uguaglianza ridefinibile su oggetti• ==== esiste sui primitivi. Sugli oggetti opera by-reference esiste sui primitivi. Sugli oggetti opera by-reference

• behaviorally equivalentbehaviorally equivalent (indistinguibili w.r.t. applicazione dei metodi) (indistinguibili w.r.t. applicazione dei metodi)• definita sulla classe Object per i definita sulla classe Object per i mutablemutable

• modificabili: modificabili: operare by referenceoperare by reference• non-modificabili: non-modificabili: operare per equivalenza di statooperare per equivalenza di stato

• Contenuti in ObjectContenuti in Object

• Ereditati (come sono) o Overidden (ridefiniti)Ereditati (come sono) o Overidden (ridefiniti)

Page 30: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Esempio: EqualsEsempio: Equalspublic class Main {public class Main {//overview: contiene un main per il testing di equals//overview: contiene un main per il testing di equals// su string.// su string.

public static void main(String[] a){public static void main(String[] a){String s = "abc";String s = "abc";String r = "abc";String r = "abc";System.out.print("s == r calcola: ");System.out.print("s == r calcola: ");System.out.println(r==s);System.out.println(r==s);System.out.println("s.equals(r) calcola: " + s.equals(r));System.out.println("s.equals(r) calcola: " + s.equals(r));}}}}… false… true

public class Main2 {public class Main2 {//overview: contiene un main per il testing di equals su //overview: contiene un main per il testing di equals su // oggetti // oggetti modificabilimodificabili..

public static void main(String[] a) public static void main(String[] a) throws NullIntStackException{throws NullIntStackException{

IntStack S = new IntStack();IntStack S = new IntStack();S.push(3);S.push(3);S.push(4);S.push(4);IntStack R = new IntStack();IntStack R = new IntStack();R.push(3);R.push(3);R.push(4);R.push(4);IntStack T = R;IntStack T = R;System.out.print("R == S calcola: ");System.out.print("R == S calcola: ");System.out.println(R == S);System.out.println(R == S);System.out.println("R.equals(S) calcola: " + R.equals(S));System.out.println("R.equals(S) calcola: " + R.equals(S));System.out.println("R.equals(T) calcola: " + R.equals(T));System.out.println("R.equals(T) calcola: " + R.equals(T));}}}}… false… false… true

……private int top;private int top;private ImmutableIntStack pop;private ImmutableIntStack pop;……public boolean equals(Object S)public boolean equals(Object S)//effects: calcola true se e solo se this e S hanno stesso stato, //effects: calcola true se e solo se this e S hanno stesso stato, // i.e.: sono equals i componenti.// i.e.: sono equals i componenti.{ImmutableIntStack V = (ImmutableIntStack)S;{ImmutableIntStack V = (ImmutableIntStack)S; if (pop == null) return(V !=null && ((top ==V.top) & if (pop == null) return(V !=null && ((top ==V.top) & (V.pop == null));(V.pop == null)); if (V.pop == null) return false;if (V.pop == null) return false; return ((top == V.top) & (pop.equals(V.pop)));}return ((top == V.top) & (pop.equals(V.pop)));}

public class Main3 {public class Main3 {//overview: contiene un main per il testing di equals //overview: contiene un main per il testing di equals // su oggetti // su oggetti non-modificabilinon-modificabili..

public static void main(String[] a) public static void main(String[] a) throws NullIntStackException{throws NullIntStackException{

ImmutableIntStack S = new ImmutableIntStack(3);ImmutableIntStack S = new ImmutableIntStack(3);ImmutableIntStack R = new ImmutableIntStack(3);ImmutableIntStack R = new ImmutableIntStack(3);System.out.println("R.equals(S) calcola: " + R.equals(S));System.out.println("R.equals(S) calcola: " + R.equals(S));System.out.println("R == S calcola: " + R == S);System.out.println("R == S calcola: " + R == S);}}}}… true… false

Page 31: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Clone: mutable e immutable

CloneClone = copia di oggetto = copia di oggetto• definita sulla classe object per gli definita sulla classe object per gli immutableimmutable

• modificabili: modificabili: copiare lo stato con copia dei componenticopiare lo stato con copia dei componenti• non-modificabili: non-modificabili: copiare lo stato copiare lo stato

public class IntStack{public class IntStack{//.. modificabile..//.. modificabile..… … private Vector els;private Vector els;……

//additional: overriding di clone//additional: overriding di clonepublic Object clone()public Object clone()//effects: crea una copia "completa" ed indipendente//effects: crea una copia "completa" ed indipendente// di this.// di this.{IntStack C = new IntStack();{IntStack C = new IntStack(); for (int i=0;i<els.size();i++) C.els.add(i,els.get(i));for (int i=0;i<els.size();i++) C.els.add(i,els.get(i)); return C;return C; }}

public class IntSet{public class IntSet{//.. Non modificabile..//.. Non modificabile..… … private Vector els;private Vector els;……

//additional: overriding di clone --- //additional: overriding di clone --- inutileinutilepublic Object clone()public Object clone()//effects: crea una copia dello stato//effects: crea una copia dello stato{IntSet C = new IntSet();{IntSet C = new IntSet(); C.els = els;C.els = els; return C;return C; }}

Page 32: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Proprietà: benevolent s.e.

Quando AF non è iniettiva allora possiamo avere:Quando AF non è iniettiva allora possiamo avere:

• Side effects non previsti dalla specifica di un metodoSide effects non previsti dalla specifica di un metodo• Che mantengono IChe mantengono I• Soddisfano specifica del metodoSoddisfano specifica del metodo

Vantaggiosi in alcuni casi: Vantaggiosi in alcuni casi: • ad esempioad esempio: un metodo osservatore : un metodo osservatore maxmax ( (isInisIn) su IntSet ) su IntSet che calcola il massimo degli interi contenuti e modificache calcola il massimo degli interi contenuti e modifica

la rappresentazione interna (disposizione degli interila rappresentazione interna (disposizione degli interi nel vettore) per utilizzare un’algoritmo di ricerca chenel vettore) per utilizzare un’algoritmo di ricerca che prevede di cambiare la disposizione degli elementi via prevede di cambiare la disposizione degli elementi via via che sono visitati.via che sono visitati.

Page 33: Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.

Proprietà: Proprietà: + accesso della rappresentazione+ accesso della rappresentazione

++ adeguatezzaadeguatezza

Rappresentazione garantita da:Rappresentazione garantita da:

1)1) variabili componenti stato dichiarate variabili componenti stato dichiarate privateprivate

2)2) Metodi pubblici non hanno parametri che Metodi pubblici non hanno parametri che espongono componenti della rappresentazioneespongono componenti della rappresentazione

3) Metodi pubblici non calcolano valori che3) Metodi pubblici non calcolano valori cheespongono componenti della rappresentazioneespongono componenti della rappresentazione