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
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
Klasser og objekter i BlueJ Eksemplificér medDate-eksemplet i BlueJ dIntProg, E14
Tilstand og opførsel i BlueJ dIntProg, E14
Tilstand og opførsel i Greenfoot dIntProg, E14
Basale begreber Tilstand Opførsel Feltvariabel Type Konstruktør Metodesignatur Metode Returtype Parameter Argument Accessor Mutator Tildeling dIntProg, E14
Objekternes tilstand Feltvariable Access modifier (private) Type Navn dIntProg, E14
Objekternes opførsel Konstruktører Metoder dIntProg, E14
To slags metoder Accessor ? Mutator ! dIntProg, E14
Typer String int Person dIntProg, E14
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
Iteration og parametrisering
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
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
SkilledTurtle public class SkilledTurtle extends Turtle { public void square100() { move(100); turn(90); } ... dIntProg, E14
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
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
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
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
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
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
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
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
Sætninger og udtryk
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
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
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
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
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
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
Eksempel på selektion (valg) public void timeTick() { minutes.increment(); if ( minutes.getValue() == 0 ) { // it just rolled over! hours.increment(); } updateDisplay(); dIntProg, E14
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
Eksempel på indlejret selektion public void act() { if( foundLeaf() ) { eatLeaf(); } else if( canMove() ) { move(); else { turnLeft(); dIntProg, E14 33
Samme kode uden indrykning public void act() { if( foundLeaf() ) { eatLeaf(); } else if( canMove() ) { move(); else { turnLeft(); Demo dIntProg, E14 34
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
Eksempler på iteration (repetition) for ( int i= 0; i<60; i++ ) { c.timeTick(); } int i= 0; while ( i<60 ) { c.timeTick(); i++; } dIntProg, E14
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
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
Niveauer af programbeskrivelse Statisk versus dynamisk syn
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
Eksempel: Clock-display i BlueJ dIntProg, E14
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
JavaDOC dIntProg, E14
Java-kode dIntProg, E14
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
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(); }
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
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: