FEN KbP/seminar3: frameRules1 Frame rules Indramning - Omgivelser Frame rules specificerer, hvad der ikke ændres
FEN KbP/seminar3: frameRules2 Specifikationer - notation Summering: |[N: int ; b: array [0..N) of int ; s: int ; s : [N 0, s = ( i | 0 i < N : b[i])] ; ]| Omgivelser Ramme Precond. Postcond Implicit frame rules: Kun variable nævnt i rammen ændres af algoritmen
FEN KbP/seminar3: frameRules3 Frame rules - Indramning Hidtil har vi specificeret kommandoer ved at specificere, hvad der ændres. Det har været underforstået, at det er det eneste, som ændres. En fuldstændig specifikation bør også fortælle, hvad der ikke ændres. Dette kaldes en frame rule.
FEN KbP/seminar3: frameRules4 Queue Hvad med resten af køen? // Commands ensures ensures public void put(Object o); requires ensures ensures (\forall int i; 0<=i && \old(shallowCopy()).get(i+1) == public void remove();
FEN KbP/seminar3: frameRules5 Queue Her er en (delvis) frame rule med shallowCopy() // Commands ensures ensures ensures (\forall int i; 0<=i && \old(shallowCopy()).get(i) == public void put(Object o);
FEN KbP/seminar3: frameRules6 shallowCopy() vs. deepCopy() Vores frame rule skal udtrykke, at –alle elementer i køen inden put(-) skal stå på samme plads efter, og –elementerne skal være uændrede Det sidste kan ikke gøres med shallowCopy() deepCopy() skal implementeres
FEN KbP/seminar3: frameRules7 Queue2 – Immutable lister ensures ensures public void put(Object o); Resten af køen skal være uændret??? Vi skal udtrykke, at sublisten fra 0 til \old(size())-1 skal være lig med listen fra 0 til size()-1
FEN KbP/seminar3: frameRules8 ImmutableList requires l != ensures (l.isEmpty() != isEmpty()) ==> ensures (!isEmpty()) ==> (\result == (l.head()==head() public boolean equals(ImmutableList l); requires 0<=from && from<=to && ensures ensures (from!=to) ==> ensures (from!=to) public ImmutableList sublist(int from, int to); equals() og sublist(-) må kunne bruges?
FEN KbP/seminar3: frameRules9 Sublisten fra 0 til \old(size())-1 skal være lig med listen fra 0 til size()-1 ensures ensures ensures items().sublist(0, public void put(Object o);
FEN KbP/seminar3: frameRules10 Men… public boolean equals(ImmutableList l) { boolean result; if (l.isEmpty()!=isEmpty()) { result = false; } else if (isEmpty()) { result = true; } else { result = l.head() == head && l.tail().equals(tail); } return result; } Checker kun på referencer!
FEN KbP/seminar3: frameRules11 Kan det betale sig? Ifølge DbC: nogen gange: –Hvis klientprogrammører laver fejl, som tyder på en misforstået opfattelse af, hvad en operation gør, så kan eksplicitte frame rules være en hjælp. –Hav den konvention, at alle ændringer skal være eksplicit nævnt i postconditions. –Ved review og lignende: husk at checke mod (både implicitte og eksplicitte) frame rules.
FEN KbP/seminar3: frameRules12 Øvelser… Frame rule for Queue.remove() Frame rules for Stack …men ikke i dag