FEN 2013-05-19KbP/seminar3: subcontracts1 Kontraktbaseret programmering Seminar 3 Kontrakter og arv Underleverandørsyn Substitutionsprincippet Guarded.

Slides:



Advertisements
Lignende præsentationer
Mapning af 1 til mange forbindelser
Advertisements

Mapning af klasser til relationer
Illustration fra Kort om kræft figur 4.1.
07 – Kort om OO Introduktion.
KONCEPT Klasser og objekter En klasse beskriver et World ArrayList
Object-Orienteret Programmering og Design. 2 Nordjyllands Erhvervakademi – 2009 Indhold “Classes, objects and object-oriented programming (OOP) play a.
// Semaphore.java package semaphore; public class Semaphore { int resources = 1; // Constructors Semaphore() {} Semaphore(int i) { resources = i; } synchronized.
Selve objektet versus referencen til objektet Nedarvning
Objektorienteret programmering
08 – Mere OO Indkapsling Arv og polymorfi (OOP’s 3 hovedprincipper)
Mapning af 1 til mange forbindelser
FEN Diskret matematik/Seminar 3 - proofs 1 Beviser Et bevis er en argumentation, som overbeviser om, at en påstand er sand, påstanden kaldes.
FEN Diskret matematik/Seminar 11 Diplomuddannelsen i Softwarekonstruktion (Master-brobygning) Fagpakke: Formelle modeller for programmering Diskret.
FEN KbP/seminar3: frameRules1 Frame rules Indramning - Omgivelser Frame rules specificerer, hvad der ikke ændres.
Induktion og rekursion
Objektorienteret programmering
FEN KbP/seminar2: LoopsReview1 Kontraktbaseret programmering Seminar 2 Udvikling af løkker: Checklisten for løkker “Hånd-i-hånd” udvikling.
FEN NOEA/IT Programmeringsteknologi 1 Arv og polymorfi Substitutionsprincippet Abstrakte klasser Design Patterns (Composite)
GP 9, 10/ Grundlæggende programmering Forår 2002 Forelæsning 9 onsdag 10/ kl. 9:15 – 12:00.
Opsamling Loops Klassedesign Immutable Lister shallowCopy() Projekt 2 FEN KbP/seminar3: Opsamling.
18. Strategisk analyse af interne forhold
FEN Sprog1 Lidt om sprog Definition: Et sprog over et endeligt alfabet  (sigma) er en mængde af strenge dannet af tegn fra . Eksempel: Lad.
Eksamen 20 minutters mundtlig prøve, inklusiv ca. 5 minutter til votering. Prøven bedømmes efter 7-trinsskalaenskalaen. Der ikke forberedelsestid. I kan.
Fundamentale datastrukturer
GP 8, 24/ Grundlæggende programmering Efterår 2001 Forelæsning 8 onsdag 24/ kl. 9:15 – 12:00.
FEN KbP/seminar2: design11 Kontraktbaseret programmering Seminar 2 Klassedesign – grundprincipper Eksempler: Stack Dictionary.
FEN KbP/seminar 1: Specifikationer/Notationen Q 1 Kontraktbaseret programmering: Seminar 1 Om specifikationer Algoritmenotationen Q.
FEN KbP/seminar1: ProgUdsagn1 Kontraktbaseret programmering Seminar 1 Programudsagn og programbeviser.
Comparable Students German Students Composite Pattern State Pattern Observer Pattern Collections Interfaces Abstrakte klasser Design Patterns.
Begreber og Redskaber 7. Plan for idag Rekursive underprogrammer Rekursive datastrukturer Rekursion vs iteration Rekursivt: Flette sortering.
FEN KbP/seminar2: design21 Kontraktbaseret programmering Seminar 2 Klassedesign: Immutable lister Queue Shallowcopy og alkvantoren.
FEN IntroJava AAU1 Klasser og objekter Grundbegreber Student-Course.
FEN IntroJava AAU1 Grafik – Crayon-objekter.
NOEA/IT FEN - Databaser/modellering 1 Datamodellering Den udvidede (enhanced) E/R-model (EE/R- modellen) Begreber Diagrammering Omformning til.
FEN IntroJava AAU1 Endnu mere om Klasser og Objekter Mange til mange relationer Student-Course v3.
Længste plateau En klassisk problemstilling (Gries, 1981) - og her i Java!!! Denne opgave drejer sig om at bestemme længden af det længste plateau i en.
Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence s; int i; int j; Sequence s; String s; int i; int j;
Repetition af dIntProg v/ Morten D. Bech. Tour de force Variabler Løkker Comparable ImErKo-reglen Eksamenssæt dIntProg, E13.
9. Interfaces. 2 Nordjyllands Erhvervakademi Objectives “Good class design starts with good application design — how many classes, do they relate.
FEN NOEA - Nordjyllands Erhvervsakademi1 Objektorienteret programmering Indkapsling Arv og polymorfi (OOP’s 3 hovedprincipper)
Identitet vs lighed. Spørgsmål Hvad udskriver run metoden? 1.”Ens!” 2.”Forskellige!” 3.Ved ikke public class Driver{ public static void run(){ String.
Effective Java Blå gruppe. Item 18: Interfaces frem for abstrakte klasser Kan implementeres i klasser der ikke nedarver Eksisterende klasser kan nemt.
Begreber og Redskaber 4. Plan for idag Om metoder, parametre, returværdier Et par ord om objekt-orientering Håndkøring af programmer.
I o p o DAIMI, AU, November 1999Programkonstruktion I9E.1 Konstruktion og brug af klasser – en stak og en HP-regnemaskine push pop.
 Bærbak & Caspersen, 2000Introducerende objektorienteret programmering1.1 Turtlemaskinen Arkitektur, instruktionssæt og eksempler.
DAIMIIntroducerende Objektorienteret Programmering1 Polymorfi og nedarvning Motivation for arv og “mange former”
Objektorienteret programmering – begrebsmodellering
 1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.1 Polymorfi og nedarvning Motivation for arv og “mange former”
 Jens Bennedsen 2001Multimedie programmering10A.1 Polymorfi og nedarvning Motivation for arv og “mange former”
 Henrik B. Christensen, 1999Introducerende objektorienteret programmering8B.1 Interfaces En ren kontrakt.
 Jens Bennedsen, 2003Introducerende objektorienteret programmeringinterfaces.1 Interfaces En ren kontrakt.
 Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.1 Programmering med interfaces – en stak og en HP-regnemaskine push pop.
Klassehierarkier Specialisering vha. subklasser. dIntProg, E05Klassehierarkier.2 Oversigt Eksempler på specialisering –Aktør, Koreograf, Skuespiller,
Polymorfi Abstrakte klasser, substitutionsprincippet, statisk og dynamisk type.
 Jens Bennedsen 2001Multimedie programmering13.1 Lingo Objectorienteret Lingo.
Programmering med interfaces Separering af specifikation, anvendelse og implementation.
DAIMIIntroducerende objektorienteret programmering4A.1 Kontrakter og Design Kontraktbaseret design, JavaDoc dokumentation.
DAIMIIntroducerende Objektorienteret Programmering8A.1 Polymorfi og nedarvning Motivation for arv og “mange former”
Klasser og objekter – grundbegreber.  Michael E. Caspersen, 2001Introducerende objektorienteret programmeringKlasser og objekter.2 Klasser og objekter.
Programmering med interfaces – en stak og en HP-regnemaskine push pop.
 Jens Bennedsen 2001Multimedie programmering10B.1 Interfaces En ren kontrakt.
 Jens Bennedsen 2001Multimedie programmering4.1 Definition af begreber Interface, implements, klasse.
DAIMIIntroducerende objektorienteret programmering4A.1 Kontrakter og Design Kontraktbaseret design, JavaDoc dokumentation,
 Jens Bennedsen 2001Multimedie programmering3B.1 Specifikationer Betingelser, specifikationer og JavaDoc.
DAIMIIntroducerende objektorienteret programmering1 Et lille banksystem Modellering beskrevet ved et UML klassediagram.
DAIMIIntroducerende Objektorienteret Programmering8B.1 Interfaces En ren kontrakt.
Quiz – Uge 3 – mandag – første time
Arbejdsmarkedsportalen
Quiz – Uge 3 – mandag – første time
Quiz – Uge 3 – mandag – første time
Præsentationens transcript:

FEN KbP/seminar3: subcontracts1 Kontraktbaseret programmering Seminar 3 Kontrakter og arv Underleverandørsyn Substitutionsprincippet Guarded postcondition

FEN KbP/seminar3: subcontracts2 Underleverandørsyn •Kontraktmæssigt kan en subklasse betragtes som en underleverandør: –Superklassen har indgået en kontrakt med en klient –Superklassen overdrager kontrakten til en underleverandør –Subklassen tager superklassen plads og skal i forhold til klienter opfylde samme kontrakt

FEN KbP/seminar3: subcontracts3 Fig. 6.1 i DbC. Figur fjernet pga. Copyright

FEN KbP/seminar3: subcontracts4 Kontrakt class Courier{ //INVARIANT: forsikring >= 100,000 public void deliver(…); //PREpakkevægt <= 5 kg //POSTleveringstid<= 3 timer }

FEN KbP/seminar3: subcontracts5 Arv og polymorfi •Princip: –I OOPLs kan objekter af en subklasse anvendes, hvor der forventes en forekomst af superklassen –Alt arves – også specifikation, dvs. subklassen overtager forfaderens kontrakt. –Hvis der ændres i kontrakten, så skal substitutionsprincippet overholdes. (”Underleverandør” eller ”subcontractor”)

FEN KbP/seminar3: subcontracts6 Substitutionsprincippet (Babara Liskov, OOPSLA ’87) Man skal altid kunne substituere en forekomst af en afledt klasse ind, hvor der ventes en forekomst af baseklassen. (”Behavioral subtyping”)

FEN KbP/seminar3: subcontracts7 Ændring af kontrakter •Substitutionsprincippet: –Arvingen skal mindst overholde forfaderens kontrakt, dvs. •prebetingelser må ikke strammes •postbetingelser må ikke afsvækkes –Hvis der ændres i kontrakten, så skal substitutionsprincippet overholdes.

FEN KbP/seminar3: subcontracts8 Ny kontrakt //Ny kontrakt: class DifferentCourier extends Courier{ //INVARIANT: forsikring>= 200,000 public void deliver(…); //PREpakkevægt <= 8 kg //POSTleveringstid<= 2 timer } Kan klienter leve med denne kontrakt i stedet for den oprindelige? //Oprindelig kontrakt: class Courier{ //INVARIANT: forsikring >= 100,000 public void deliver(…); //PREpakkevægt <= 5 kg //POSTleveringstid<= 3 timer }

FEN KbP/seminar3: subcontracts9 Substitutionsprincippet class A { //INVARIANT I public void pip(){}; //PRE p //POST q }; p  p’ dvs. hvis A.pip()’s PRE er opfyldt, så er B.pip()’s det også q’  qdvs. resultatet af B.pip() opfylder mindst samme betingelser som resultatet af A.pip() I´  I hvis den nye invariant er opfyldt, så er den gamle også class B extends A { //INVARIANT I’ public void pip(){}; //PRE p’ //POST q’ };

FEN KbP/seminar3: subcontracts10 Eksempel: public class Shape{ private int x,y; // figurens position private Colour color; //figurens farve //øvrige attributter public void MoveTo(int newX, int newY){ //PRE: 0 <= newX <= maxX AND 0 <= newY <= maxY, // hvor maxX og maxY angiver vinduets maksimum // POST: x'=newX AND y'=newY } public virtual float Area(){ //PRE: none //POST: Area'= figurens areal med 4 betydende cifre // beregnet efter en eller anden tilnærmet metode} } }//end Shape public class Circle: Shape{ private int r; //radius - x, y //og color arves public override float Area(){ } //øvrige operationer - MoveTo() arves }//end circle Hvad må vi gøre med Area()? Hvad må vi gøre med MoveTo()?

FEN KbP/seminar3: subcontracts11 Dictionary: public interface Dictionary { invariant // Basic queries public int count(); ensures (count()==0) ==> public boolean has(Object key); requires public Object valueFor(Object key); // Derived queries ensures \result == public boolean isEmpty(); // Commands requires ensures ensures ensures public void put(Object key, Object value); requires ensures ensures public void remove(Object key); }

FEN KbP/seminar3: subcontracts12 Designvalg requires ensures ensures ensures public void put(Object key, Object value); Hvad hvis vi tillader, at key er der i forvejen? Dvs. svækker prebetingelsen? Denne del af postbetingelsen holder i så fald ikke længere!

FEN KbP/seminar3: subcontracts13 Guarded postconditions requires ensures ensures (!\old(has(key))) ==> ensures (!\old(has(key))) ==> public void put(Object key, Object value); •Guarded postcondition ændrer ikke klassens specifikation. Det er kun forberedelse på omdefinering i en subklasse. Jf. keyword virtual i C#, som kun muliggør override i en evt. kommende subklasse. Post-betingelsen er bevogtet (guarded) af den tilsvarende prebetingelse Dictionary2

FEN KbP/seminar3: subcontracts14 Designregel •For at understøtte redefinering af metoder i subklasser bør alle postbetingelser beskyttes af deres tilsvarende prebetingelse •Ex: void pip() //PREq //POSTr -- bør være q  r

FEN KbP/seminar3: subcontracts15 Guarded postcondition muliggør fx: class A { public void pip(){}; //PRE p //POST p  q }; class B extends A { public void pip(){}; //PRE p’ //POST p  q //POST p’  q’ }; Prebetingelsen kan afsvækkes Hvis den gamle prebetingelse er opfyldt, så holder den gamle postbetingelse også Ny postbetingelse svarende til den nye prebetingelse kan tilføjes

FEN KbP/seminar3: subcontracts16 Dictionary2: public interface Dictionary2 { invariant // Basic queries public int count(); ensures (count()==0) ==> public boolean has(Object key); requires public Object valueFor(Object key); // Derived queries ensures \result == public boolean isEmpty(); requires ensures ensures (!\old(has(key))) ==> ensures (!\old(has(key))) ==> public void put(Object key, Object value); requires ensures ensures (\old(has(key))) ==> public void remove(Object key); Post-betingelserne er bevogtet (guarded) af den tilsvarende prebetingelse

FEN KbP/seminar3: subcontracts17 Redefinering af Dictionary2 •Vi vil gerne lave et nyt dictionary (RelaxedDictionary2), hvor det bl.a. er muligt: –at kalde put med en key, som allerede er i dictionary’et. I så fald skal put gøre ingenting –at kalde remove med en key, som ikke er dictionary’et. I så fald gør remove ingenting

FEN KbP/seminar3: subcontracts18 Subklassen public interface RelaxedDictionary2 extends Dictionary2 { requires ensures \old(has(key)) ensures \old(has(key)) ==> public void put(Object key, Object value); Den arvede prebetingelse OR’es på: !has(key) OR has(key)  true Den arvede post-betingelse AND’es på: !\old(has(key)) ==> valueFor(key)==value AND \old(has(key)) ==> valueFor(key)==\old(valueFor(key)) Nødvendig i JML, når en arving udvider en spec requires ensures !\old(has(key)) ==> public void remove(Object key); }

FEN KbP/seminar3: subcontracts19 Øvelse •Definér kontrakten på Queue med guarded postconditions •Skriv et interface RelaxedQueue med kontrakt, som extend'er Queue og omdefinerer head(), så: 1.det er lovligt at forsøge at udtage et element fra en tom kø, 2.resultatet bliver null, og 3.køen ikke ændres herved. RelaxedQueue

FEN KbP/seminar3: subcontracts20 Specifikation af Queue public interface Queue { invariant // Basic queries public int size(); requires 0<=i && public Object get(int i); // Derived queries requires ensures \result == public Object head(); ensures \result == public boolean isEmpty(); ensures ensures (\forall int i; 0<=i && public Queue shallowCopy(); // Commands ensures ensures public void put(Object o); requires ensures ensures (\forall int i; 0<=i && \old(shallowCopy()).get(i+1) == public void remove(); }

Code Contracts •I Code Contracts er det ike muligt at ændre pre-betingelser (endnu). •Argumentet er, at det ikke er nyttigt (sic!) •Men så undgår man problemer med type co-varians  FEN KbP/seminar3: subcontracts21