PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra...

27
1 PR2 2017-2018 PROGRAMMAZIONE 2 8. Astrazioni sui da=: implementazione di =pi di dato astraC in Java

Transcript of PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra...

Page 1: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

1PR22017-2018

PROGRAMMAZIONE28.Astrazionisuida=:implementazionedi=pididatoastraCinJava

Page 2: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

AbstractDataType

•  Uninsiemedivalori•  Uninsiemedioperazionichepossonoessereapplicateinmodouniformeaivalori

•  NONècara<erizzatodallarappresentazionedeida>o  Larappresentazionedeida>èprivata,senzaeffe<osulcodicecheu>lizzail>podidato

o  Larappresentazionedeida>èmodificabilenelcasodiADTmutabili

2PR22017-2018

Page 3: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

SpecificareunADT

•  LaspecificadiunADTèuncontra<ochedefinisceo  valori,operazioniinterminidinome,parametri>po,effe<oosservabile

•  Separa&onofconcernso  Proge<azioneerealizzazionedelADTo  Proge<azioneapplicazionecheu>lizzaADT

3PR22017-2018

Page 4: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

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

Page 5: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

Esempio:String.contains

publicbooleancontains(CharSequences)Returnstrueifandonlyifthisstringcontainsthespecifiedsequenceofcharvalues.

Parameters:s-thesequencetosearchfor

Returns:trueifthisstringcontainss,falseotherwise

Throws:NullPointerExcep=on

Since:1.5

5PR22017-2018

Page 6: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

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

Page 7: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

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

Page 8: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

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

Page 9: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

Osservazione

•  Supponiamocheilclientedell’astrazioneinvochiilmetodomachelepre-condizionidelmetodononsianoverificate.Ilcodicedelmetodoèliberodifarequalunquecosadatochenonèvincolatodallapre-condizioneo  Èopportunogenerareunfallimentopiu<ostochegeneraredeicomportamen>misteriosi

9PR22017-2018

Page 10: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

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

Page 11: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

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

Page 12: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

Esempidiuso

myIntSet=newIntSet();:IfmyIntSet.IsIn(50)thenSystem.out.println(…)//Usocorre@o:myIntSet=50;//Usononcorre@o

12PR22017-2018

Page 13: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

Specificheeimplementazioni

SupponiamocheImplsiaunapossibileimplementazionedellaspecificadell’astrazioneSImplsodddisfaSse

o  ognicomportamentodiImplèuncomportamentopermessodallaspecificaS

o  “icomportamen>diImplsonounso<oinsiemedeicomportamen>specifica>daS”

SeImplnonsoddisfaS,alloraImploppureSnonsono“correT”o  pragma>camenteèmegliocambiarel’implementazionechelaspecifica

13PR22017-2018

Page 14: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

Specifiche

•  Potremmoavereduespecifichedifferen>dellostessaastrazione

•  Magarivorremmoancheconfrontarle!!

14PR22017-2018

Page 15: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

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

Page 16: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

Valutazione

•  Unaspecifica“forte”–  difficiledasoddisfare(maggiorenumerodivincolisull’implementazione)

–  faciledausare(ilclientedell’astrazionepuòfaremaggioriassunzionisulcomportamento)

•  Unaspecifica“debole”–  faciledaverificare(faciledaimplementare,moltoimplementazionilapossonosoddisfare)

–  difficiledausareperilminornumerodiassunzioni

16PR22017-2018

Page 17: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

Unavisioneformale

•  Unaspecificaèunaformulalogicao  S1èpiùfortediS2seS1implicaS2

•  LoavetevistoformalmenteaLPPo  trasformatelaspecificainunaformulalogicaepoiverificatel’implicazione(S1⇒S2)

17PR22017-2018

Page 18: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

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

Page 19: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

Larappresentazione

•  Ilinguaggicheperme<onoladefinizionedi>pididatoastraThannomeccanismimoltodiversitraloroperdefinirecomeo  ivaloridelnuovo>posonoimplementa>interminidivaloridialtri>pi

•  InJava,glioggeTdelnuovo>posonosemplicementecollezionidivaloridialtri>pio  definite(nellaimplementazionedellaclasse)dauninsiemedivariabilidiistanzaprivate! accessibilisolodaicostru<oriedaimetodidellaclasse

19PR22017-2018

Page 20: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

Definireun>poinJava

•  Uninsiemedivariabilidiistanza(devonoesseredell’ogge<oenondellaclasse)o  private:devonoessereaccessibilisolodaicostru<oriedaimetodidellaclasse

•  Ivaloriesplici>chesivedonosonosoloquellicostrui>daicostru<orio  piùomenoicasibasediunadefinizionericorsiva

•  Glialtrivalorisonoeventualmentecalcola>daimetodio  rimanenascostal’eventualestru<uraricorsiva

20PR22017-2018

Page 21: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

Usi“correT”delleclassiinJava

•  Nelladefinizionediastrazionisuida>o  leclassicontengonoessenzialmentemetodidiistanzaevariabilidiistanzaprivate! eventualivariabilista>chepossonoservire(maè“sporco”!)peravereinformazionecondivisafraoggeTdiversi

! eventualimetodista>cinonpossonocomunquevederel’ogge<oeservonosoloamanipolarelevariabilista>che

21PR22017-2018

Page 22: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

I>pirecordinJava

•  Javanonhaunmeccanismoprimi>voperdefinire>pirecord(lestructdiC)o maèfacilissimodefinirlio  ancheseconunadeviazionedaidiscorsimetodologicicheabbiamofa<o! larappresentazionenonènascosta(nonc’èastrazione!)! noncisonometodi! difa<ononc’èunaspecificaseparatadall’implementazione

22PR22017-2018

Page 23: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

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

Page 24: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

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

Page 25: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

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

Page 26: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

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

Page 27: PROGRAMMAZIONE 2 8. Astrazioni sui da ...pages.di.unipi.it/gadducci/PR2-17/PR2-17-008.pdfdato astra hanno meccanismi molto diversi tra loro per definire come o i valori del nuovo

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