Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

 Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.1 Programmering med interfaces – en stak og en HP-regnemaskine push pop.

Lignende præsentationer


Præsentationer af emnet: " Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.1 Programmering med interfaces – en stak og en HP-regnemaskine push pop."— Præsentationens transcript:

1  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.1 Programmering med interfaces – en stak og en HP-regnemaskine push pop

2  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.2 Den onde class Bad { public static void main(String[] args) { int x = 0; Node h = null; Node p = null; read(x); while ( x!=0 ) { p = new Node(); p.v = x; p.next = h; h = p; read(x); } while ( h!=null ) { p = h; h = p.next; x = p.v; write(x); } } } Hvad gør dette program?

3  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.3 Den gode class Good { public static void main(String[] args) { int x = 0; Stack s = new LinkedStack(); read(x); while ( x!=0 ) { s.push(x); read(x); } while ( !s.isEmpty() ) { x = s.pop(); write(x); } Hvad gør dette program?

4  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.4 Hvorfor er den onde ond og den gode god? class Good { public static void main(String[] a) { int x = 0; Stack s = new LinkedStack(); read(x); while ( x!=0 ) { s.push(x); read(x); } while ( !s.isEmpty() ) { x = s.pop(); write(x); } Kommentarer? class Bad { public static void main(String[] a) { int x = 0; Node h = null; Node p = null; read(x); while ( x!=0 ) { p = new Node(); p.v = x; p.next = h; h = p; read(x); } while ( h!=null ) { p = h; h = p.next; x = p.v; write(x); } } }

5  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.5 Abstraktionsniveauer I de to programmer kan vi identificere (mindst) fire forskellige abstraktionsniveauer. I “den onde” er disse fire niveauer totalt sammenblandet. I “den gode” er disse niveauer klart separeret. Generelt skal vi stræbe efter at designe pro- grammer hvor abstraktionsniveauerne er klart separeret og dermed lette at identificere. Kun herved kan vi håbe på at kunne konstruere vedligeholdelsesvenlige, pålidelige og effektive programmer. application stack linked list “pointers”

6  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.6 Men hvad er en stak? class Good { public static void main (String[] args) { int x = 0; Stack s = new LinkedStack(); read(x); while ( x!=0 ) { s.push(x); read(x); } while ( !s.isEmpty() ) { x = s.pop(); write(x); } interface Stack { public boolean isEmpty(); // post: isEmpty == 'the stack is empty' public boolean isFull(); // post: isFull == 'the stack is full' public void push(int e); // pre: not isFull // post: e is placed on top of the stack public int pop(); // pre: not isEmpty // post: pop == 'the top element' // and the top element is // removed from the stack }

7  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.7 En HP-regnemaskine Indtastning Display 11  11 4  4 - 7 3  3 4  4 5  5 * 20 + 23 * 161

8  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.8 Rullestakken inde bag scenen Indtastning Display 11  11 4  4 - 7 3  3 4  4 5  5 * 20 + 23 * 161 54375437 display

9  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.9 Regneudtryk  Prefix-udtryk  Infix-udtryk  Postfix-udtryk  Eks. 1 Eks. 2  +3*45 *+345  3+4*5 (3+4)*5  345*+ 34+5*

10  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.10 Evaluering af postfixudtryk  Infix-udtryk  Postfix-udtryk  3+4*5  345*+ Indtastning 3  3 4  4 5  5 * 20 + 23

11  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.11 Hvad sker der bag scenen? 3 4 3 5 4 3 20 3 23 push 4push 5push 3pop b pop a push a*b pop b pop a push a+b

12  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.12 Algoritme for regnemaskine for alle tegn t i udtryk { hvis ( t er et tal ) push(t) ellers { int b = pop tal af stakken; int a = pop tal af stakken; vælg ( hvis t er ) { ‘+’: push a+b; ‘-’: push a-b; ‘*’: push a*b; ‘-’: push a/b; } 20 3 23 pop b pop a push a+b 3 4 5 * +

13  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.13 Regnemaskine i Java public int evaluate (String exp, Stack s) { // pre: exp er et lovligt postfixudtryk for (int i = 0; i { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.dk/16/4998706/slides/slide_13.jpg", "name": " Michael E.", "description": "Caspersen, 2000Introducerende objektorienteret programmering6A.13 Regnemaskine i Java public int evaluate (String exp, Stack s) { // pre: exp er et lovligt postfixudtryk for (int i = 0; i

14  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.14 A stack implementation class LinkedStack implements Stack { protected Node sp; public LinkedStack() { sp = null; } public boolean isEmpty() { return sp==null; } public boolean isFull() { return false; } public void push(int e) { Node p = new Node(); p.v = e; p.next = sp; sp = p; } public int pop() { int res = sp.v; sp = sp.next; return res; } 13 9 7  sp Stack s = new LinkedStack() s.push(13); s.push(9); s.push(7); Repræsentationsinvariant:

15  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.15 Specifikationen er en kontrakt  Kontraktperspektivet to parter gensidige fordele gensidige forpligtigelser Skal opfylde start-betingelse Skal opfylde slut-betingelse Kan antage slut-betingelse Kan antage start-betingelse ForpligtigelserFordele Klient Udbyder Service

16  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.16 Specifikation som logisk brandmur class Calculator { public eval(Stack s) {... b= s.pop(); a= s.pop(); s.push(a+b);... } class LinkedStack implements Stack { protected Node sp; public LinkedStack() { sp= null; } public boolean isEmpty() { return sp==null; } public boolean isFull() { return false; } public void push(int e) { Node p= new Node(); p.v= e; p.next= sp; sp= p; } public int pop() { int res= sp.v; sp= sp.next; return res; } interface Stack { public boolean isEmpty(); // post: isEmpty // == 'the stack is empty' public boolean isFull(); // post: isFull // == 'the stack is full' public void push(int e); // pre: not isFull // post: e is placed on top of // the stack public int pop(); // pre: not isEmpty // post: pop == 'the top element' // and the top element is // removed from the stack } ApplikationSpecificationImplementation

17  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.17 Alternativ implementation af stack class ArrayStack implements Stack { // Class constant final private static int MAX = 100; // Instance variables private int items []; private int sp; // Constructor public ArrayStack() { items = new int[MAX]; MISSING CODE } // Methods public boolean isEmpty() { MISSING CODE } public boolean isFull() { MISSING CODE } public void push(int e) { MISSING CODE } public int pop() { MISSING CODE } } sp 0 Max items Repræsentationsinvariant:

18  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.18 Alternativ 2 class SequenceStack implements Stack { // Instance variables private Sequence items; // Constructor public SequenceStack() { MISSING CODE } // Methods public boolean isEmpty() { MISSING CODE } public boolean isFull() { MISSING CODE } public void push(int e) { MISSING CODE } public int pop() { MISSING CODE } } 0 items Repræsentationsinvariant: top items.size()

19  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.19 Repræsentationsinvarianten konstruktør rep-inv true metode Bemærk: inde i en metode er repræsentationsinvarianten ikke nødvendigvis opfyldt, men før og efter hver metode gælder den.

20  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.20 Polymorfi  En variabel er kvalificeret med en type, men variablen kan referere til et objekt af en anden type.  Dog skal objektets reelle type være en subtype af den kvalificerende type.  Der er to måder at lave subtyper på i Java implementer et interface udvid en klasse.  Klasseudvidelser (subklasser) skal vi se på i kommende lektioner. class Calculator { public eval(Stack s) {... b = s.pop(); a = s.pop(); s.push(a+b);... } class Engineer { Calculator c = new Calculator(); public calculate() {... c.eval(new LinkedStack()); c.eval(new ArrayStack()); } Qualifier

21  Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.21 Plug-and-play push pop ArrayStack Der kan monteres både en LinkedStack og en ArrayStack (og alle mulige andre slags stakke man måtte finde på fremover!), fordi regnemaskinen er programmeret i forhold til det generelle Stack-interface. push pop LinkedStack


Download ppt " Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.1 Programmering med interfaces – en stak og en HP-regnemaskine push pop."

Lignende præsentationer


Annoncer fra Google