Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

FEN 2013-05-01KbP/seminar2: design21 Kontraktbaseret programmering Seminar 2 Klassedesign: Immutable lister Queue Shallowcopy og alkvantoren.

Lignende præsentationer


Præsentationer af emnet: "FEN 2013-05-01KbP/seminar2: design21 Kontraktbaseret programmering Seminar 2 Klassedesign: Immutable lister Queue Shallowcopy og alkvantoren."— Præsentationens transcript:

1 FEN 2013-05-01KbP/seminar2: design21 Kontraktbaseret programmering Seminar 2 Klassedesign: Immutable lister Queue Shallowcopy og alkvantoren

2 FEN 2013-05-01KbP/seminar2: design22 Immutable (uforanderlige) lister Hvis man ikke har kvantorer, så kan immutable lister anvendes i specifikationer, som skal udtale sige om egenskaber ved mange elementer Immutable lister ligner lister i LISP (og andre funktionssprog som fx F#) Er specielt designet til at anvendes i udtryk (en specifikation er et logisk udtryk) Er rekursive i natur, specifikation og implementation Vi kan udtale os om mængder af elementer ved rekursive listeudtryk Immutable datastrukturer anvendes intensivt i funktionelle sprog (fx F#) og parallelle systemer

3 FEN 2013-05-01KbP/seminar2: design23 List-interfacet (Bemærk: ingen kommandoer) public interface ImmutableList { // Basic queries public /*@ pure @*/ boolean isEmpty(); public /*@ pure @*/ Object head(); public /*@ pure @*/ ImmutableList tail(); // Derived queries public /*@ pure @*/ int size(); public /*@ pure @*/ ImmutableList precededBy(Object o); public /*@ pure @*/ boolean equals(ImmutableList l); public /*@ pure @*/ Object item(int i); public /*@ pure @*/ ImmutableList sublist(int from, int to); } Opbygger listen ved at sætte elementer ind foran den eksisterende (evt. tomme) liste og returnere en ny liste med o indsat forrest.

4 FEN 2013-05-01KbP/seminar2: design24 Specifikationen public interface ImmutableList { // Basic queries public /*@ pure @*/ boolean isEmpty(); /*@ requires !isEmpty(); @*/ public /*@ pure @*/ Object head(); /*@ requires !isEmpty(); @*/ public /*@ pure @*/ ImmutableList tail(); // Derived queries /*@ ensures isEmpty() ==> (\result==0); @ ensures (!isEmpty()) ==> (\result == 1+tail().size()); @*/ public /*@ pure @*/ int size(); A= (a, b, c, d) A.head() = a A.tail() = (b, c, d) Bemærk, rekursion

5 FEN 2013-05-01KbP/seminar2: design25 /*@ ensures !(\result).isEmpty(); @ ensures (\result).tail() == this; @ ensures (\result).head() == o; @*/ public /*@ pure @*/ ImmutableList precededBy(Object o); /*@ requires l != null; @ ensures (l.isEmpty() != isEmpty()) ==> !(\result); @ ensures (!isEmpty()) ==> (\result == (l.head()==head() && @ l.tail().equals(tail()))); @*/ public /*@ pure @*/ boolean equals(ImmutableList l); /*@ requires 0<=i && i<size(); @ ensures (i==0) ==> (\result==head()); @ ensures (i>0) ==> (\result==tail().item(i-1)); @*/ public /*@ pure @*/ Object item(int i); A= () A.precededBy(a) = (a) A.precededBy(b) = (b, a) … Bemærk, rekursion

6 FEN 2013-05-01KbP/seminar2: design26 /*@ requires 0<=from && from<=to && to<=size(); @ ensures (\result).isEmpty()==(to==from); @ ensures (from!=to) ==> ((\result).head()==item(from)); @ ensures (from!=to) ==> ((\result).tail().equals(sublist(from+1,to))); @*/ public /*@ pure @*/ ImmutableList sublist(int from, int to); Bemærk, rekursion implementation demo

7 FEN 2013-05-01KbP/seminar2: design27 Brug af immutable lister i specifikation: Queue public interface Queue2 { /*@ invariant size()>=0; @*/ // Basic queries public ImmutableList items(); // Derived queries /*@ ensures \result == items().size(); @*/ public /*@ pure @*/ int size(); /*@ ensures \result==items().isEmpty(); @*/ public /*@ pure @*/ boolean isEmpty(); /*@ requires size()>0; @ ensures \result==items().head(); @*/ public /*@ pure @*/ Object head(); Returnerer en liste med køens elementer items() anvendes ved specifikation af de øvrige operationer Burde være ”pure”, men det acceptere JML ikke umiddelbart

8 FEN 2013-05-01KbP/seminar2: design28 // Commands /*@ ensures size()==\old(size())+1; @ ensures items().item(size()-1)==o; @*/ public void put(Object o); /*@ requires size()>0; @ ensures size()==\old(size())-1; @ ensures \old(items()).tail().equals(items()); @*/ public void remove(); } Operationer på ImmutableList anvendes

9 FEN 2013-05-01KbP/seminar2: design29 Diskussion Omkostninger: –Alle disse ekstra lister, som traverseres - og det endda rekursivt - må give et enormt overhead i tids- og pladsforbrug! –Ja, men: Check af postbetingelser afslører fejl i klassens implementation og er vigtig ved udvikling og debuging. Check af prebetingelser afslører fejl hos klienten og er vigtig, når klassen anvendes. Sørg for at prebetingelser kan checkes effektivt! (Fx en count-attribut). Indkapsling: –Bryder items() ikke med indkapsling af køen? –Nej, jf. diskussionen i forbindelse med Stack Det ville være noget andet, hvis vi kunne fjerne eller indsætte midt i køen

10 FEN 2013-05-01KbP/seminar2: design210 Et design med kvantorer Hvis kvantorer understøttes, så kan immutable lister undværes. Vi har stadig behov for at kunne udtale os om mange elementer både før og efter udførelsen af en operation Dette kan gøres ved at tage en shallow copy af strukturen inden operationen udføres En shallow copy er en kopi af strukturen, men med de samme elementer:

11 FEN 2013-05-01KbP/seminar2: design211 Specifikation af shallowCopy() /*@ ensures \result.size()==size(); @ ensures (\forall int i; 0<=i && i<=size()-1; @ (\result.get(i)==get(i))); @*/ public Queue shallowCopy(); Bemærk, ’==’ Dvs. samme objektreference skal returneres af kopien som af originalen

12 FEN 2013-05-01KbP/seminar2: design212 Specifikation af Queue vha. kvantorer og shallowCopy() public interface Queue { /*@ invariant size()>=0; @*/ // Basic queries public /*@ pure @*/ int size(); /*@ requires 0<=i && i<size(); @*/ public /*@ pure @*/ Object get(int i); // Derived queries /*@ requires size()>0; @ ensures \result == get(0); @*/ public /*@ pure @*/ Object head(); /*@ ensures \result == (size()==0); @*/ public /*@ pure @*/ boolean isEmpty(); /*@ ensures \result.size()==size(); @ ensures (\forall int i; 0<=i && i<=size()-1; (\result.get(i)==get(i))); @*/ public Queue shallowCopy(); Burde være ”pure”, men det acceptere JML ikke umiddelbart

13 FEN 2013-05-01KbP/seminar2: design213 // Commands /*@ ensures size()==\old(size())+1; @ ensures get(size()-1)==o; @*/ public void put(Object o); /*@ requires size()>=1; @ ensures size()==\old(size())-1; @ ensures (\forall int i; 0<=i && i<=size()-2; @ \old(shallowCopy()).get(i+1) == get(i)); @*/ public void remove(); Her benyttes en kopi taget inden remove() udføres. Specifikationen udtrykker, at alle elementer er rykket en plads længere frem i køen Behøver vi shallowCopy(), eller kunne vi bare skrive \old(get(i+1)) == get(i) ? (Afhænger af impl. af \old(-))


Download ppt "FEN 2013-05-01KbP/seminar2: design21 Kontraktbaseret programmering Seminar 2 Klassedesign: Immutable lister Queue Shallowcopy og alkvantoren."

Lignende præsentationer


Annoncer fra Google