opsamling

17
Opsamling Loops Klassedesign Immutable Lister shallowCopy() Projekt 2 FEN 2013-05-18 1 KbP/seminar3: Opsamling

Upload: mechelle-george

Post on 31-Dec-2015

22 views

Category:

Documents


3 download

DESCRIPTION

Opsamling. Loops Klassedesign Immutable Lister shallowCopy() Projekt 2. Loops:. Heltalsdivision Øvelse 3. {Q} S 0 do {P} B  S od {R}. Vi står med Q og R, og skal skrive en løkke: Vi skal udvikle: invarianten P vagten B “programmerne” S 0 og S Beviset er vores guide: - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Opsamling

Opsamling

Loops

Klassedesign

Immutable Lister

shallowCopy()

Projekt 2

FEN 2013-05-18 1KbP/seminar3: Opsamling

Page 2: Opsamling

FEN 2013-05-18 KbP/seminar3: Opsamling 2

Vi står med Q og R, og skal skrive en løkke:Vi skal udvikle:• invarianten P• vagten B• “programmerne” S0 og S

Beviset er vores guide:

Checklisten giver os:• Find P og B ud fra: P B R• Find initiering, så P etableres ({Q} S0 {P})• Find et termineringsudtryk og sætninger, så der tages skridt mod

terminering. • Hermed brydes invarianten måske, i så fald findes sætninger som

genetablerer invarianten: {P B} S {P}

{Q}

S0

do {P}

BS

od

{R}

Checklisten:1. {Q} S0 {P} (initiering)2. {P B} S {P} (bevarelse af invariant)3. terminering af løkken (t: nedadtil begrænset - termineringsfunktion)4. P B R (korrekthed)

• Heltalsdivision• Øvelse 3Loops:

Page 3: Opsamling

De seks principper:

1. Adskil forespørgsler og kommandoer

2. Adskil basale forespørgsler fra afledte

3. Specificer postbetingelser for de afledte forespørgsler vha. de basale

4. Specificer kommandoers postbetingelser gennem deres effekt på de basale forespørgsler

5. Specificer prebetingelser på alle operationer

6. Specificer invariante egenskaber i en klasseinvariant

Kun de basale forespørgsler er afhængige af datarepræsentationen

Konstruktører skal etablere

klasseinvarianten

Implementerende klasser skal specificere en

repræsentationsinvariant

Programmér mod et interface

FEN 2013-05-18 3KbP/seminar3: Opsamling

Page 4: Opsamling

Immutable listerpublic interface ImmutableList { // Basic queries public boolean isEmpty();

public Object head();

public ImmutableList tail();

// Derived queries public int size(); public ImmutableList precededBy(Object o); public boolean equals(ImmutableList l);

public Object item(int i);

public ImmutableList sublist(int from, int to);}

Grundlæggende forespørgsler

Opbygger listen ved at elementer ind foran den

eksisterende (evt. tomme) liste

FEN 2013-05-18 4KbP/seminar3: Opsamling

Page 5: Opsamling

Specifikationenpublic 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() = aA.tail() = (b, c, d)

Bemærk, rekursion

FEN 2013-05-18 5KbP/seminar3: Opsamling

Page 6: Opsamling

/*@ 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);

/*@ 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);

A= ()A.precededBy(a) = (a)A.precededBy(b) = (b, a)…

Bemærk, rekursion

Bemærk, rekursion

Bemærk, rekursionFEN 2013-05-18 6KbP/seminar3: Opsamling

Page 7: Opsamling

FEN 2013-05-18 KbP/seminar3: Opsamling 7

Brug af immutable listeri 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

Page 8: Opsamling

FEN 2013-05-18 KbP/seminar3: Opsamling 8

// 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

Page 9: Opsamling

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

FEN 2013-05-18 9KbP/seminar3: Opsamling

Page 10: Opsamling

Deque

public interface Deque {

public void insertFirst(Object e);

public void insertLast(Object e);

public Object removeFirst();

public Object removeLast();

public boolean isEmpty();

}

FEN 2013-05-18 10KbP/seminar3: Opsamling

Page 11: Opsamling

public interface Deque { // Basic queries int size(); Object get(int i);

// Derived queries Deque shallowCopy(); Object first(); Object last(); boolean isEmpty();

// Commands void insertFirst(Object e); void removeFirst(); void insertLast(Object e); void removeLast();}

Princip 1 og 2:

1. Adskil forespørgsler og kommandoer

2. Adskil basale forespørgsler fra afledte

removeFirst() og removeLast() returnerer ikke noget.

Forespørgsler first() og last() er tilføjet.

get(-) og shallowCopy() af hensyn til specifikation.

FEN 2013-05-18 11KbP/seminar3: Opsamling

Page 12: Opsamling

public interface Deque { // Basic queries int size(); Object get(int i);

// Derived queries //post uændret størrelse //post return skal være lig this Deque shallowCopy(); //post return skal være første element Object first(); //post return skal være sidste element Object last(); //post return skal være sand for size()==0 boolean isEmpty();}

Princip 3:Specificer postbetingelser for de afledte forespørgsler vha. de basale

FEN 2013-05-18 12KbP/seminar3: Opsamling

Page 13: Opsamling

public interface Deque { // Basic queries int size(); Object get(int i);

// Commands

//post size() er blevet 1 større //post e er indsat først //post resten af køen er rykket 1 plads bagud void insertFirst(Object e);

void removeFirst();

void insertLast(Object e);

void removeLast();}

Princip 4:Specificer kommandoers postbetingelser gennem deres effekt på de basale forespørgsler

FEN 2013-05-18 13KbP/seminar3: Opsamling

Page 14: Opsamling

Princip 5 og 6:

Specificer prebetingelser på alle operationer

Specificer invariante egenskaber i en klasseinvariant

//invariant size()>=0

public interface Deque {

//pre size større end 0 Object first();

//pre size større end 0 Object last(); // Commands //pre size større end 0 void removeFirst();

//pre size større end 0 void removeLast();}

I Java/JMLFEN 2013-05-18 14KbP/seminar3: Opsamling

Page 15: Opsamling

Implementering

public class LinkedDeque implements Deque {

private DNode front, back;

private int size;

Repræsentationsinvariant er vigtig!

Skal udtale sig om front, back og size

I Java/JML

FEN 2013-05-18 15KbP/seminar3: Opsamling

Page 16: Opsamling

Programmer mod et interface!public class ArrayDeque implements Deque{ /*@ private invariant repr!=null && size() == repr.size(); @*/

private ArrayList repr;

/*@ ensures size()==0; @*/ public ArrayDeque(){ repr= new ArrayList(); }

// Basic queries

public int size(){ return repr.size(); }

public Object get(int i){ return repr.get(i); } //----

Ny datarepræsentation ==Ny

repræsentationsinvariant

FEN 2013-05-18 16KbP/seminar3: Opsamling

Page 17: Opsamling

// Derived queries

public Deque shallowCopy(){

ArrayDeque copy= new ArrayDeque();

for(int i= 0; i<repr.size();i++)

copy.insertLast(repr.get(i));

return copy;

}

public Object first(){

return repr.get(0);

}

public Object last(){

return repr.get(size()-1);

}

public boolean isEmpty(){

return size()==0;

}

// Commands

public void insertFirst(Object e){

repr.add(0, e);

}

public void removeFirst(){

repr.remove(0);

}

public void insertLast(Object e){

repr.add(e);

}

public void removeLast(){

repr.remove(size()-1);

}

}

FEN 2013-05-18 17KbP/seminar3: Opsamling