Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Forelæsning 2.2 Tilstand og opførsel (repetition)

Lignende præsentationer


Præsentationer af emnet: "Forelæsning 2.2 Tilstand og opførsel (repetition)"— Præsentationens transcript:

1 Forelæsning 2.2 Tilstand og opførsel (repetition)
Iteration (gentagelser) og parametrisering Sætninger og udtryk Niveauer af programbeskrivelse Statisk versus dynamisk syn Afleveringsopgave 3.1: Skilled Turtle dIntProg, E14

2 Tilstand og opførsel (repetition)
Objekters tilstand er defineret ved et sæt af feltvariable alle objekter (af en given klasse) har de samme feltvariable ethvert objekt har sin egen tilstand (værdier af feltvariable) Opførsel objekters opførsel er defineret ved et sæt metoder alle objekter (af en given klasse) har de samme metoder dIntProg, E14

3 Klasser og objekter i BlueJ
Eksemplificér medDate-eksemplet i BlueJ dIntProg, E14

4 Tilstand og opførsel i BlueJ
dIntProg, E14

5 Tilstand og opførsel i Greenfoot
dIntProg, E14

6 Basale begreber Tilstand Opførsel Feltvariabel Type Konstruktør
Metodesignatur Metode Returtype Parameter Argument Accessor Mutator Tildeling dIntProg, E14

7 Objekternes tilstand Feltvariable Access modifier (private) Type Navn
dIntProg, E14

8 Objekternes opførsel Konstruktører Metoder dIntProg, E14

9 To slags metoder Accessor ? Mutator ! dIntProg, E14

10 Typer String int Person dIntProg, E14

11 Signaturer (4 elementer)
Access modifier (public) Returtype Kan være tom: void (mutator) Mangler ved konstruktører Navn Parametre Kan være tom: () dIntProg, E14

12 Iteration og parametrisering

13 Skildpadde (trækker blækspor)
(0,0) Position: (x,y) Vinkel: v Farve: color Pen status: up/down 270 World 0 (360) 180 90 (800,600) ... En turtels tilstand: - (position, vinkel, farve, penStatus) - starttilstand: ((x, y), 0, “black”, up) dIntProg, E14

14 Klassediagram Turtle SkilledTurtle Greenfoot UML … move(int d)
moveTo(int x, int y) turn(double a) turnTo(double a) penUp() penDown() erase() SkilledTurtle square(int length) spiral(...) ... Greenfoot UML dIntProg, E14

15 SkilledTurtle public class SkilledTurtle extends Turtle {
public void square100() { move(100); turn(90); } ... dIntProg, E14

16 Gentagelser Syntax for for-løkker findes i munualen (afsnit 6.2.3)
//tegn en firekant move(100); turn(90); //tegn en firekant for ( int i= 0; i<4; i++ ) { move(100); turn(90); } //tegn en tolvkant ... (suk!) //tegn en tolvkant for ( int i= 0; i<12; i++ ) { move(100); turn(30); } Syntax for for-løkker findes i munualen (afsnit 6.2.3) Hvordan tegner man en cirkel? dIntProg, E14

17 Metode: kvadrat med længde 100
public class SkilledTurtle extends Turtle { ... /** tegner et kvadrat med sidelængde 100 */ public void square100() { for ( int i= 0; i<4; i++ ) { move(100); turn(90); } Længden 100 er indsat direkte i metoden I stedet kunne vi angive længden ved hjælp af en parameter Det ville være smartere at lave en metode der kan tegne kvadrater af vilkårlig størrelse. dIntProg, E14

18 Metode: kvadrat med vilkårlig størrelse
public class SkilledTurtle extends Turtle { ... /** tegner et kvadrat med sidelængde length */ public void square(int length) { for ( int i= 0; i<4; i++ ) { move(length); turn(90); } Parameter Argument Det ville være smartere at lave en metode der kan tegne ligesidede figurer med et vilkårligt antal sider dIntProg, E14

19 Metode: polygon med vilkårligt antal sider
public class SkilledTurtle extends Turtle { ... /** tegner en d-kant med sidelængde length */ public void polygon(int d, int length) { for ( int i= 0; i<d; i++ ) { move(length); turn(360/d); } dIntProg, E14

20 Generel metode  specifikke metoder
Vi kan benytte den generelle metode polygon til at konstruere mere specifikke metoder, der kan tegne kvadrater og cirkler. class SkilledTurtle extends Turtle{ ... /** tegner en d-kant med sidelængde length public void polygon(int d, int length) { } /** tegner et kvadrat med sidelængde length */ public void square(int length) { polygon(4,length); /** tegner en cirkel med en given radius */ public void circle(int radius) { polygon(360,calcLength(radius)); dIntProg, E14

21 Pointe 1: Vær så generel som muligt
Det kan betale sig at lave gode generelle operationer, som kan genbruges i mange situationer. Parametrisering er nøglen hertil. Det er svært at ‘opfinde’ de gode generelle operationer (konkret  generelt), men opsøg dem! dIntProg, E14

22 Pointe 2: Specifikation / implementation
Når man skal benytte en metode, er det vigtigt at forstå hvad operationen gør. Når man skal implementere en metode, skal man tage stilling til hvordan den skal gøre det dIntProg, E14

23 Pointe 3: Princippet gælder også for jer
Typisk er I både anvender og implementør af en metode, men det er vigtigt at skelne skarpt mellem de to syn. Når I anvender en metode skal I ikke tænke på hvordan den er realiseret. Når I implementerer en metode skal I ikke tænke på hvad den skal anvendes. Dette enkle princip er en af nøglerne til god programmering. dIntProg, E14

24 Sætninger og udtryk

25 Simple sætninger Assignment v= exp; x= x + 1;
udregn værdien af udtrykket på højresiden og tildel denne værdi til variablen på venstresiden v= exp; x= x + 1; x= 3 * w.getLeavesEaten(); Internt metodekald (samme objekt) method(…); move(100); turn(90); Eksternt metodekald (andet objekt) object-reference.method(…); w.eatLeaf(); c.moveTo(200,300); dIntProg, E14

26 Interne metodekald w: Wombat public class Wombat extends Actor {
private boolean foundLeaf() { ... } private void eatLeaf() { ...; leavesEaten= leavesEaten + 1; public void act() { if ( foundLeaf() ) { eatLeaf(); ... w: Wombat act() foundLeaf() eatLeaf() dIntProg, E14

27 Interne metodekald (this)
public class Wombat extends Actor { private boolean foundLeaf() { ... } private void eatLeaf() { ...; leavesEaten= leavesEaten + 1; public void act() { if (this.foundLeaf() ) { this.eatLeaf(); ... w: Wombat act() foundLeaf() eatLeaf() dIntProg, E14 27

28 Eksterne metodekald public class AnimalTrainer{ SkilledTurtle t; ...
a: AnimalTrainer t: SkilledTurtle public class AnimalTrainer{ SkilledTurtle t; ... public void doShow() { t.square(50); t.square(100); t.boxes(10); } doShow() square(50) square(200) boxes(20) Tegn sekvensdiagram på tavlen dIntProg, E14

29 Sammensatte sætninger
Blok (sekvens) { S1 S2 … Sn } Selektion (valg) if ( B ) S1 if ( B ) S1 else S2 Iteration (repetition) for ( exp1; exp2; exp3) S while ( B ) S dIntProg, E14

30 Eksempler på blokke (sekvens)
public void setTime(int hour, int minute) { hours.setValue(hour); minutes.setValue(minute); updateDisplay(); } public ClockDisplay(int hour, int minute) { hours= new NumberDisplay(24); minutes= new NumberDisplay(60); setTime(hour,minute); } dIntProg, E14

31 Eksempel på selektion (valg)
public void timeTick() { minutes.increment(); if ( minutes.getValue() == 0 ) { // it just rolled over! hours.increment(); } updateDisplay(); dIntProg, E14

32 Eksempel på selektion (valg mellem to)
public String getDisplayValue() { if ( value < 10 ) { return "0" + value; } else { return "" + value; Kunne denne del undværes? Nej. Vi ville få en typekonflikt dIntProg, E14

33 Eksempel på indlejret selektion
public void act() { if( foundLeaf() ) { eatLeaf(); } else if( canMove() ) { move(); else { turnLeft(); dIntProg, E14 33

34 Samme kode uden indrykning
public void act() { if( foundLeaf() ) { eatLeaf(); } else if( canMove() ) { move(); else { turnLeft(); Demo dIntProg, E14 34

35 Eksempler på iteration (repetition)
for ( int i= 0; i<4; i++ ) { c.move(length); c.turn(90); } int i= 0; while ( i<4 ) { c.move(length); c.turn(90); i++; } dIntProg, E14

36 Eksempler på iteration (repetition)
for ( int i= 0; i<60; i++ ) { c.timeTick(); } int i= 0; while ( i<60 ) { c.timeTick(); i++; } dIntProg, E14

37 Udtryk bruges forskellige steder
Højresiden af assignment skal have sammenlignelig type med variablen på venstresiden Argumenter til metodekald skal have sammenlignelig type med parametrene Betingelser i selektions- og iterationssætninger boolesk udtryk (sandhedsværdi: true eller false) initialiserings- og optællingsudtryk i for-sætning dIntProg, E14

38 Udvalgte operatorer Aritmetiske operatorer + - * / % ...
Logiske operatorer Relationelle operatorer Objektkonstruktionsudtryk + - * / % ... Overloadede operatorer Operatorpræcedens (14 niveauer) Brug parenteser hvis I er i tvivl (eller søg efter: ”java operator precedence”) && || ! ... == != < > <= >= new Class type (parameters) dIntProg, E14

39 Niveauer af programbeskrivelse Statisk versus dynamisk syn

40 Statisk versus dynamisk syn
Klassediagram (specifikation) hvad JavaDoc (specifikation) Java-kode (implementation) hvordan Objektdiagram objektrelationer (referencer) Sekvensdiagram Objektinteraktion (metodekald) Statisk struktur rum for hvad der generelt kan ske Dynamik scenarie for hvad der vil ske i en konkret situation dIntProg, E14

41 Eksempel: Clock-display i BlueJ
dIntProg, E14

42 Klassediagram (BlueJ vs. UML)
TestDriver run() 1 ClockDisplay NumberDisplay int getValue() String getDisplayValue() void setValue(int val) void increment() timeTick() setTime(int h, int m) getTime() void updateDisplay() 2 dIntProg, E14

43 JavaDOC dIntProg, E14

44 Java-kode dIntProg, E14

45 Objektdiagram :ClockDisplay hours minutes displayString :NumberDisplay
24 :NumberDisplay limit value “00:00” 60 :NumberDisplay limit value public ClockDisplay() { hours= new NumberDisplay(24); minutes= new NumberDisplay(60); updateDisplay(); } public NumberDisplay(int rollOverLimit) { limit= rollOverLimit; value= 0; } dIntProg, E14

46 Sekvensdiagram timeTick
minutes :NumberDisplay hours :NumberDisplay 23:00 22:59 :ClockDisplay timeTick() increment() getValue() increment() updateDisplay() getDisplayValue() getDisplayValue() public void timeTick() { minutes.increment(); if(minutes.getValue() == 0) { hours.increment(); } updateDisplay(); private void updateDisplay() { displayString = hours.getDisplayValue() + ":” + minutes.getDisplayValue(); }

47 Oversigt Sætninger Udtryk Niveauer af programbeskrivelse
simple sætninger (assignment, interne og eksterne metodekald) sammensatte sætninger (blok, selektion, iteration) (afsnit 6 i manualen) Udtryk operatorer præcedens regler og parenteser Niveauer af programbeskrivelse Statisk: klassediagram, JavaDoc, Java-kode Dynamisk: objektdiagram, sekvensdiagram dIntProg, E14

48 Afleveringsopgave 3.1: SkilledTurtle
World I Greenfoot skal der laves en underklasse til klassen Turtle med metoder til at tegne en række forskellige avancerede tegninger, i stil med nedenstående:


Download ppt "Forelæsning 2.2 Tilstand og opførsel (repetition)"

Lignende præsentationer


Annoncer fra Google