PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra...
Transcript of PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra...
1PR22017-2018
PROGRAMMAZIONE28.Astrazionisuida=:implementazionedi=pididatoastraCinJava
AbstractDataType
• Uninsiemedivalori• Uninsiemedioperazionichepossonoessereapplicateinmodouniformeaivalori
• NONècara<erizzatodallarappresentazionedeida>o Larappresentazionedeida>èprivata,senzaeffe<osulcodicecheu>lizzail>podidato
o Larappresentazionedeida>èmodificabilenelcasodiADTmutabili
2PR22017-2018
SpecificareunADT
• LaspecificadiunADTèuncontra<ochedefinisceo valori,operazioniinterminidinome,parametri>po,effe<oosservabile
• Separa&onofconcernso Proge<azioneerealizzazionedelADTo Proge<azioneapplicazionecheu>lizzaADT
3PR22017-2018
SpecificheconJavadoc
• Javadoc:nonesisteunanotazioneformale,masolouninsiemediconvenzioni
• Javadoc:leprincipaliconvenzionio Segnatura(>po)deimetodio Descrizionetestualedelcomportamentoa<eso(astrazionesulcomportamento)
o DalladocumentazionediJavao @param:descrip>onofwhatgetspassedino @return:descrip>onofwhatgetsreturnedo @throws:excep>onsthatmayoccur
4PR22017-2018
Esempio:String.contains
publicbooleancontains(CharSequences)Returnstrueifandonlyifthisstringcontainsthespecifiedsequenceofcharvalues.
Parameters:s-thesequencetosearchfor
Returns:trueifthisstringcontainss,falseotherwise
Throws:NullPointerExcep=on
Since:1.5
5PR22017-2018
Ilnostroformatodellaspecifica
public class NuovoTipo { // OVERVIEW: Gli oggetti di tipo NuovoTipo // sono collezioni modificabili di ...
// costruttori public NuovoTipo()
// EFFECTS: ...
// metodi // specifiche degli altri metodi}
6 PR22017-2018
Alterna>vaequivalente
• Lapre-condizionedelmetodo:dichiaraivincolichedevonovalereprimadellainvocazionedelmetodo(seivincolinonsonosodddisfaTallorailcontra<ononvale)– @requires:l’obbligodelcliente
• Lapost-condizionedelmetodo:dichiaraqualisonoleproprietàchedevonovalerealterminedell’esecuzionedelmetodo(nell’ipotesichelapre-condizionesiavalida)– @modifies:descrivelaportatadellemodificheeffe<uatedurante
l’esecuzione.Sololeen>tàdescri<enellaclausola“modifies”sonoeffeTvamentemodificate
– @throws: leeccezionichepossonoesseresollevate(comeJavadoc)– @effects: proprietàchevalgonosullostatomodificato– @return:ilvalorechevieneres>tuito(comeJavadoc)
7PR22017-2018
Esempio(conVector)
int change(Vector vec, Object oldelt, Object newelt)@requires v, oldelt e newelt sono valori non-null
oldelt appartiene a vec
@modifies vec@effects la prima occorrenza del valore oldelt in
vec viene modificata con il valore newelt & gli altri elementi di vec non sono modificati
@returns l’indice della posizione in vec che
conteneva il valore oldelt e che oracontiene il valore newelt
8PR22017-2018
Osservazione
• Supponiamocheilclientedell’astrazioneinvochiilmetodomachelepre-condizionidelmetodononsianoverificate.Ilcodicedelmetodoèliberodifarequalunquecosadatochenonèvincolatodallapre-condizioneo Èopportunogenerareunfallimentopiu<ostochegeneraredeicomportamen>misteriosi
9PR22017-2018
IntSet
public class IntSet { // OVERVIEW: un IntSet è un insieme modificabile // di interi di dimensione qualunque // costruttore public IntSet( )
// EFFECTS: inizializza this all’insieme vuoto // metodi public void insert(int x)
// EFFECTS: aggiunge x a this public void remove (int x)
// EFFECTS: toglie x da this public boolean isIn(int x)
// EFFECTS: se x appartiene a this ritorna true, // altrimenti false ...}
10 PR22017-2018
IntSet
public class IntSet { ... // metodi ... public int size( )
// EFFECTS: ritorna la cardinalità di this public int choose( ) throws EmptyException
// EFFECTS: se this è vuoto, solleva // EmptyException, altrimenti ritorna un // elemento qualunque contenuto in this}
11 PR22017-2018
Esempidiuso
myIntSet=newIntSet();:IfmyIntSet.IsIn(50)thenSystem.out.println(…)//Usocorre@o:myIntSet=50;//Usononcorre@o
12PR22017-2018
Specificheeimplementazioni
SupponiamocheImplsiaunapossibileimplementazionedellaspecificadell’astrazioneSImplsodddisfaSse
o ognicomportamentodiImplèuncomportamentopermessodallaspecificaS
o “icomportamen>diImplsonounso<oinsiemedeicomportamen>specifica>daS”
SeImplnonsoddisfaS,alloraImploppureSnonsono“correT”o pragma>camenteèmegliocambiarel’implementazionechelaspecifica
13PR22017-2018
Specifiche
• Potremmoavereduespecifichedifferen>dellostessaastrazione
• Magarivorremmoancheconfrontarle!!
14PR22017-2018
Esempio
int find(int[ ] a, int value) { for (int i = 0; i < a.length; i++) if (a[i] == value) return i; return -1; }
• SpecificaAo requires:valueèunvalorememorizzatonell’arrayao return:indiceitalechea[i]=value
• SpecificaBo requires:valueèunvalorememorizzatonell’arrayao return:ilpiùpiccoloindiceitalechea[i]=value
• SpecificaCo return:l’indiceitalechea[i]=value,oppure-1nelcasoincuivaluenon
siamemorizzatonell’arraya
15PR22017-2018
Valutazione
• Unaspecifica“forte”– difficiledasoddisfare(maggiorenumerodivincolisull’implementazione)
– faciledausare(ilclientedell’astrazionepuòfaremaggioriassunzionisulcomportamento)
• Unaspecifica“debole”– faciledaverificare(faciledaimplementare,moltoimplementazionilapossonosoddisfare)
– difficiledausareperilminornumerodiassunzioni
16PR22017-2018
Unavisioneformale
• Unaspecificaèunaformulalogicao S1èpiùfortediS2seS1implicaS2
• LoavetevistoformalmenteaLPPo trasformatelaspecificainunaformulalogicaepoiverificatel’implicazione(S1⇒S2)
17PR22017-2018
Astrazionisuida>:implementazione
• Sceltafondamentaleèquelladellarappresentazione– comeivaloridel>poastra<osonoimplementa>interminidialtri>pi• >piprimi>viogiàimplementa>• nuovi>piastraTchefacilitanol’implementazionedelnostro
– tali>pivengonospecifica>– metodologia:iterazionedelprocessodidecomposizionebasatosuastrazioni
– lasceltadevetenercontodellapossibilitàdiimplementareinmodoefficienteicostru<orieglialtrimetodi
• Poivienel’implementazionedicostru<oriemetodi
18PR22017-2018
Larappresentazione
• Ilinguaggicheperme<onoladefinizionedi>pididatoastraThannomeccanismimoltodiversitraloroperdefinirecomeo ivaloridelnuovo>posonoimplementa>interminidivaloridialtri>pi
• InJava,glioggeTdelnuovo>posonosemplicementecollezionidivaloridialtri>pio definite(nellaimplementazionedellaclasse)dauninsiemedivariabilidiistanzaprivate! accessibilisolodaicostru<oriedaimetodidellaclasse
19PR22017-2018
Definireun>poinJava
• Uninsiemedivariabilidiistanza(devonoesseredell’ogge<oenondellaclasse)o private:devonoessereaccessibilisolodaicostru<oriedaimetodidellaclasse
• Ivaloriesplici>chesivedonosonosoloquellicostrui>daicostru<orio piùomenoicasibasediunadefinizionericorsiva
• Glialtrivalorisonoeventualmentecalcola>daimetodio rimanenascostal’eventualestru<uraricorsiva
20PR22017-2018
Usi“correT”delleclassiinJava
• Nelladefinizionediastrazionisuida>o leclassicontengonoessenzialmentemetodidiistanzaevariabilidiistanzaprivate! eventualivariabilista>chepossonoservire(maè“sporco”!)peravereinformazionecondivisafraoggeTdiversi
! eventualimetodista>cinonpossonocomunquevederel’ogge<oeservonosoloamanipolarelevariabilista>che
21PR22017-2018
I>pirecordinJava
• Javanonhaunmeccanismoprimi>voperdefinire>pirecord(lestructdiC)o maèfacilissimodefinirlio ancheseconunadeviazionedaidiscorsimetodologicicheabbiamofa<o! larappresentazionenonènascosta(nonc’èastrazione!)! noncisonometodi! difa<ononc’èunaspecificaseparatadall’implementazione
22PR22017-2018
Un>porecord
class Pair {// OVERVIEW: un tipo record
int coeff, exp; // costruttore Pair(int c, int n) {
// EFFECTS: inizializza il “record” con i // valori di c ed n coeff = c; exp = n;
}}
• Larappresentazionenonènascosta– dopoavercreatoun’istanzasiaccedonodire<amentei“campidelrecord”
• Lavisibilitàdellaclasseedelcostru<oreèristre<aalpackageincuifigura• Noncisonometodidiversidalcostru<ore
23PR22017-2018
ImplementazionediIntSet
public class IntSet {// OVERVIEW: un IntSet è un insieme modificabile
// di interi di dimensione qualunque private Vector els; // la rappresentazione // costruttore public IntSet( ) {
// EFFECTS: inizializza this all’insieme vuoto els = new Vector( );
}...
}
• UninsiemediinterièrappresentatodaunVector– piùada<odell’array,perchéhadimensionevariabile
• Glielemen>diunVectorsonodi>poObject– nonpossiamomemorizzarcivaloridi>point(usiamoInteger!)
24PR22017-2018
ImplementazionediIntSet
public void insert(int x) { // EFFECTS: aggiunge x a this
Integer y = new Integer(x); if (getIndex(y) < 0) els.add(y); } private int getIndex(Integer x) {
// EFFECTS: se x occorre in this ritorna la // posizione in cui si trova, altrimenti -1 for (int i = 0; i < els.size( ); i++) if (x.equals(els.get(i))) return i; return -1; }
• Nonabbiamooccorrenzemul>pledielemen>– sisemplifical’implementazionediremove
• IlmetodoprivatoausiliariogetIndexritornaunvalorespecialeenonsollevaeccezioni– vabeneperchéèprivato
• Notarel’usodelmetodoequalssuInteger25
ImplementazionediIntSet
public void remove(int x) { // EFFECTS: toglie x da this
int i = getIndex(new Integer(x)); if (i < 0) return; els.set(i, els.lastElement( )); els.remove(els.size( ) - 1);
}public boolean isIn(int x) { // EFFECTS: se x appartiene a this ritorna
// true, altrimenti false return (getIndex(new Integer(x)) >= 0);
}
• Nellarimozione,sel’elementoèpresente,ciscrivosopral’ul>mocorrenteedeliminol’ul>moelemento
26PR22017-2018
ImplementazionediIntSet
public int size( ) { // EFFECTS: ritorna la cardinalità di this return els.size();
}public int choose( ) throws EmptyException {
// EFFECTS: se this è vuoto, solleva // EmptyException, altrimenti ritorna un // elemento qualunque contenuto in this if (els.size() == 0) throw new EmptyException(“IntSet.choose”); return ((Integer) els.lastElement()).intValue();
}
• AncheselastElementpotessesollevareun’eccezione,inquestocasononpuòsuccedere.Comemai?
27PR22017-2018