FEN 2013-05-01KbP/seminar2: design11 Kontraktbaseret programmering Seminar 2 Klassedesign – grundprincipper Eksempler: Stack Dictionary.

Slides:



Advertisements
Lignende præsentationer
Velkommen til Softwarekonstruktion
Advertisements

FEN KbP/seminar3: subcontracts1 Kontraktbaseret programmering Seminar 3 Kontrakter og arv Underleverandørsyn Substitutionsprincippet Guarded.
07 – Kort om OO Introduktion.
KONCEPT Klasser og objekter En klasse beskriver et World ArrayList
Hvordan man skriver koden.
FEN KbP/seminar3: frameRules1 Frame rules Indramning - Omgivelser Frame rules specificerer, hvad der ikke ændres.
Objektorienteret programmering
Begreber og Redskaber 9. Plan for idag I dag: Datastrukturer Tabeller Lister, mængder, maps, grafer Hægtede lister.
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)
Forelæsning 3.1 Collections Javas for-each løkke
Opsamling Loops Klassedesign Immutable Lister shallowCopy() Projekt 2 FEN KbP/seminar3: Opsamling.
Lektion 7 Læsestof: Kopier fra Caranno
Fundamentale datastrukturer
Mønstre En lille introduktion. Singleton Tilgå et objekt igennem klassereference i stedet for objektreference.  Overflødiggør referencer til objektet.
FEN KbP/seminar 1: Specifikationer/Notationen Q 1 Kontraktbaseret programmering: Seminar 1 Om specifikationer Algoritmenotationen Q.
Objekter og klasser Rasmus D. Lehrmann DM
1 Fundamentale datastrukturer. 2 Definitioner: abstrakt datatype, datastruktur Elementære datastrukturer og abstrakte datatyper: arrays, stakke, køer,
1 Fundamentale datastrukturer. 2 Definitioner: abstrakt datatype, datastruktur Elementære datastrukturer og abstrakte datatyper : arrays, stakke, køer,
Repetition: Introduktion til OOP med C# og .NET
Paradigmer i Programmering 2. Sammensatte typer Tupler og lister Programmering med rekursion Programmering med pipe-lines Programmering med polymorfe.
Comparable Students German Students Composite Pattern State Pattern Observer Pattern Collections Interfaces Abstrakte klasser Design Patterns.
FEN KbP/seminar2: design21 Kontraktbaseret programmering Seminar 2 Klassedesign: Immutable lister Queue Shallowcopy og alkvantoren.
8 RÅD VEDRØRENDE GOD PROGRAMMERING Effective (brown) Java.
FEN IntroJava AAU1 Klasser og objekter Grundbegreber Student-Course.
1 Implementering af fundamentale datastrukturer. 2 Stakke og køer Array-repræsentation Liste-repræsentation Hægtede lister Træer Terminologi Traversering.
FEN IntroJava AAU1 Endnu mere om Klasser og Objekter Mange til mange relationer Student-Course v3.
KF04 GRAY Item 2, 12, 22, 32, 42, 52. Consider a builder when faced with many constructor parameters Item 2.
03 – Udtryk og metoder. 2 NOEA2009Java-kursus – Udtryk og metoder Udtryk i Java Java har standard udtrykene… Værditildeling Subrutiner og funktionskald.
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.
9. Interfaces. 2 Nordjyllands Erhvervakademi Objectives “Good class design starts with good application design — how many classes, do they relate.
Begreber og Redskaber 11. Plan for idag Lidt afrunding: Collections Framework i Java Noget om oversættere og sprog Evaluering Sidste gang øvelser før.
Forelæsning 7.1 – repetition
Deadlock Definition deadlock (baglås) er en tilstand som en mængde af processer kan være i en mængde processer er i deadlock hvis alle processerne står.
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.
Begreber og Redskaber 3. Plan for idag Om metoder, parametre, returværdier Overblik over klasser,objekter,nedarvning Et par ord om objekt-orientering.
I o p o DAIMI, AU, November 1999Programkonstruktion I9E.1 Konstruktion og brug af klasser – en stak og en HP-regnemaskine push pop.
 Jens Bennedsen 2002Objektorienteret systemudvikling GRASP mønstre Basale ansvarsplaceringsregler.
DAIMIIntroducerende objektorienteret programmering4B.1 Typer og tilstand i Java Typer, tilstand, erklæring, variable, primitive datatyper, reference- og.
 Jens Bennedsen 2002Objektorienteret systemudvikling Design -> kode Mapning af et klassediagram til kode.
Klasser og objekter. dIntProg, E08Klasser og objekter.2 Grundbegreber Klasser og objekter –beskrivelse –oprettelse Attributter og metoder –tilstand –opførsel.
 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.
DAIMIIntroducerende objektorienteret programmering4B.1 Grundlæggende og Reference Typer i Java Typer, tilstand, erklæring, reference- og værdi semantik,
Trinvis forfinelse Systematisk, gradvis udvikling af programmer.
DAIMIProgrammering af Store Systemer1 Concurrency i Java – Samarbejdende tråde.
Klassehierarkier Specialisering vha. subklasser. dIntProg, E05Klassehierarkier.2 Oversigt Eksempler på specialisering –Aktør, Koreograf, Skuespiller,
Indledende Programmering Uge 6 - Efterår 2006
Interfaces Afkobling af programkomponenter (eksempel: Comparable)
Objektorienteret analyse og design Ó Bennedsen 2001 Design - part Programmering og systemudvikling Lektion 7 Design - part 2.
Programmering med interfaces Separering af specifikation, anvendelse og implementation.
DAIMIIntroducerende objektorienteret programmering4A.1 Kontrakter og Design Kontraktbaseret design, JavaDoc dokumentation.
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.
Collectionklasser Klassifikation og anvendelse. dIntProg, F08Collectionklasser.2 Samlinger af objekter Objektreferencer –for at holde fast i et objekt.
 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.
Klasser og objekter. dIntProg, F08Klasser og objekter.2 Grundbegreber Klasser og objekter –beskrivelse –oprettelse Attributter og metoder –tilstand –opførsel.
I o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.1 Sweep-algoritmer Programmering med invarianter og uden kaniner.
DAIMIIntroducerende Objektorienteret Programmering8B.1 Interfaces En ren kontrakt.
Programmering med interfaces – en stak og en HP-regnemaskine push pop.
Containerklasser – klassifikation og brug.  Michael E. Caspersen, 2003IOOPContainerklasser.2 Mange objekter Containerklasser –antag at man skal repræsentere.
Algoritmer og Datastrukturer 1 Amortiseret Analyse [CLRS, kapitel 17]
Klasser og objekter (Afsnit i manualen).
Algoritmer og Datastrukturer 1 Amortiseret Analyse [CLRS, kapitel 17]
Parametrisering En kort introduktion.
Præsentationens transcript:

FEN KbP/seminar2: design11 Kontraktbaseret programmering Seminar 2 Klassedesign – grundprincipper Eksempler: Stack Dictionary

FEN KbP/seminar2: design12 De seks grundprincipper: 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. Tilføj repræsentationsinvariant i implementerende klasser

FEN KbP/seminar2: design13 Stakke --Eiffel: Stack[G] Grundlæggende operationer: –count:INTEGER –is_empty:BOOLEAN –intialize –push(g: G) –pop(out g: G) //Java < 1.5 Stack // of Object Stack // fra 1.5 Grundlæggende operationer: –int count() –boolean isEmpty() –Stack() //constructor –void push(Object o) –Object pop()

FEN KbP/seminar2: design14 1: Adskil forespørgsler og kommandoer Postbetingelse på push(Object e): e = = Hvordan udtrykkes dette? e = = pop() dur ikke. Stakken ændres af pop() Vi har brug for at kunne forespørge uden at ændre. (pop gør egentlig to ting: returnerer topelementet og fjerner det)

FEN KbP/seminar2: design15 I stedet top() og remove(): Object top() – returnerer topelementet. Stakken er uændret. (top kaldes item i Eiffel) void remove() – fjerner elementet. Returnerer ikke noget. Forespørgsler returnerer noget, men ændrer ikke objektets tilstand Kommandoer returnerer ikke noget, men kan (gør det som regel) ændre objektets tilstand.

FEN KbP/seminar2: design16 2:Adskil basale forespørgsler fra afledte forespørgsler isEmpty kan udtrykkes vha. count –Postbetingelse på isEmpty: ensures \result == 3:For hver afledt forespørgsel udtryk postbetingelsen ved basale forespørgsler Basale forespørgsler tilgår datarepræsentationen direkte isEmpty() bliver en afledt forespørgsel

FEN KbP/seminar2: design17 Stakkens interface public interface Stack { // Basic queries: public int count(); public Object itemAt(int i); // Derived queries: public boolean isEmpty(); public Object item(); // Commands: public void put(Object e); public void remove(); } Af hensyn til specifikationen er det nødvendigt at have en metode, så man kan tale om alle stakkens elementer Bemærk: item() definerer en logisk rækkefølge mellem elementerne – ikke en fysisk: Vi skal altid kunne returnere sidst ankomne element, så der må være en eller anden logisk orden mellem elementerne svarende til deres ”ankomsttid”.

FEN KbP/seminar2: design18 4:Specificer kommandoer ved deres effekt på basale forespørgsler. 5:Formulér prebetingelser for hver forespørgsel og kommando.

FEN KbP/seminar2: design19 public interface Stack { public invariant // Basic queries public int count(); requires 0<=i && public Object itemAt(int i); // Derived queries ensures \result == public boolean isEmpty(); requires ensures \result == public Object item(); // Commands ensures ensures public void put(Object e); requires ensures public void remove(); } typeinvariant

FEN KbP/seminar2: design110 Klasseinvariant (typeinvariant og repræsentationsinvariant) Udtrykker egenskaber, som ikke ændrer sig i hele objektets levetid For stakkens vedkommende: count() >= 0 Der skal argumenteres for, at klasseinvarianten faktisk er en invariant, dvs. at ingen operation efterlader den falsk: –Objektet skal oprettes i en tilstand, som tilfredsstiller invarianten, dvs. den bliver en del af postbetingelsen på konstruktøren –Kun put og remove har postbetingelser, som siger, at count er ændret: put forøger count remove trækker 1 fra count, men prebetingelser garanterer, at remove kun kaldes med count>=1

FEN KbP/seminar2: design111 Klasseinvarianter Bør udtrykke egenskaber, som går på tværs af operationer Må gerne være redundant i forhold til operationernes specifikationer Bliver en del af både pre- og postbetingelse på alle operationer Skal etableres ved objektoprettelse

FEN KbP/seminar2: design112 Implementation public class LinkedStack implements Stack { private invariant private int count; private Node top; ensures public LinkedStack() { top = null; count = 0; } Repræsentations- invariant Specifikation arves fra interfacet Constructor skal etablere invarianten

FEN KbP/seminar2: design113 public int count() { return count; } public Object itemAt(int i) { Node n = top; while (i<count()-1) { n = n.next; i = i+1; } return n.element; } public boolean isEmpty() { return count==0; } public Object item() { return top.element; } public void put(Object e) { top = new Node(e,top); count = count+1; } public void remove() { top.element = null; top = top.next; count = count-1; } Specifikation er arvet fra interfacet

FEN KbP/seminar2: design114 Object itemAt(int i) Er denne metode ikke et brud med indkapslingen og stakprincippet? Bør den i så fald ikke være private? Nej, en klient kan nemt selv konstruere Object clientItemAt(int i) vha.count, item, remove og put Øvelse: gør det! Løsning1.ppt

FEN KbP/seminar2: design115 Afprøvning af Stack public class StackMain { public static void main(String[] args) { Stack s= new LinkedStack(); for(int i= 0; i<10; i++) s.put(new Integer(i)); System.out.println(s.item()); for(int i= 0; i<10; i++) System.out.println(s.itemAt(i)); } System.out.println(s.itemAt(11)); Hvad sker der her?

FEN KbP/seminar2: design116 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 Programmer mod et interface. Specificer en typeinvariant

FEN KbP/seminar2: design117 A side: Programmér altid mod interfaces ArrayList l = new ArrayList(); List l = new ArrayList(); List l = ListFactory.createList(); class ListFactory{//FactoryMethod public static List createList(){ return new ArrayList(); } }

FEN KbP/seminar2: design118 Dictionary: (Map – værdibaseret container, lagrer par af (key, value)) 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/seminar2: design119 Designvalg requires ensures ensures ensures public void put(Object key, Object value); Må key være null? Hvad hvis vi tillader, at key er der i forvejen? ensures (count()==0) ==> public boolean has(Object key); requires ensures ensures public void remove(Object key); Hvad hvis vi tillader, at key ikke findes?