160 likes | 269 Views
Iteration og parametrisering. Modeller, objekter og opførsel. Nye begreber. Repetition (iteration) gentagelse af opførsel Parametrisering generalisering af kode. Model. Position : (x,y) Vinkel : v Farve : color Pen status : up/down. (0,0). 270. World. 0 (360). 180. 90.
E N D
Iteration og parametrisering Modeller, objekter og opførsel
Nye begreber • Repetition (iteration) • gentagelse af opførsel • Parametrisering • generalisering af kode
Model • Position: (x,y) • Vinkel: v • Farve: color • Pen status: up/down (0,0) 270 World 0 (360) 180 90 (800,600) ... En turtels tilstand: - (position, vinkel, farve, bredde, ...) - starttilstand: ((x, y), 0, “black”, up)
Model Turtle … move(int d) moveTo(int x, int y) turn(double a) turnTo(double a) penUp() penDown() erase() SkilledTurtle … square(int length) spiral(...) ...
SkilledTurtle public class SkilledTurtle extends Turtle { public void square100() { move(100); turn(90); move(100); turn(90); move(100); turn(90); move(100); turn(90); } ... }
Gentagelser //tegn en firkant move(100); turn(90); move(100); turn(90); move(100); turn(90); move(100); turn(90); //tegn en tolvkant ... (suk!) //tegn en firkant for ( int i= 0; i<4; i++ ) { move(100); turn(90); } //tegn en tolvkant for ( int i= 0; i<12; i++ ) { move(100); turn(30); } Syntax for for-løkker findes i manualen (afsnit 6.2.3)
Tegneprogram med løkke public class SkilledTurtle extends Turtle { public void square100() { for ( int i= 0; i<4; i++ ) { move(100); turn(90); } } ... }
Øvelse 1 • Hvordan tegner man en ligesidet trekant? • Hvordan tegner man en cirkel?
Parametrisering (specifikation) Det ville være smartere at lave en metode der kan tegne kvadrater af vilkårlig størrelse. public class SkilledTurtle extends Turtle { /** tegner et kvadrat med sidelængde length */ public void square(int length) { } } ?
Parametrisering (implementation) Det ville være smartere at lave en metode der kan tegne kvadrater af 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 Parametrisering (implementation) Det ville være smartere at lave en metode der kan tegne kvadrater af 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); } } }
Øvelse 2 Skriv en metode der tegner en polygon. Lad antal sider og sidelængden være parametre til metoden. public class SkilledTurtle extends Turtle { ... /** * tegner en d-kant med sidelængde length */ public void polygon(int d, int length) { ... } }
Øvelse 3 Benyt metoden polygon til at konstruere metoder der kan tegne et kvadrat henholdsvis en ligesidet trekant. class SkilledTurtle extends Turtle{ ... public void polygon(int d, int length) { ... } /** tegner et kvadrat med sidelængde length */ public void square(int length) { ... } /** tegner en ligesidet trekant med * sidelængde length */ public void triangle(int length) { ... } }
Pointer (1) • Det kan betale sig at lave gode generelle operationer som kan genbruges i mange situationer. • Parametrisering er nøglen til at lave generelle operationer. • Det er svært at ‘opfinde’ de gode generelle operationer (konkret generelt), men opsøg dem!
Pointer (2) • Når man skal benytte en metode er det vigtigt med forståelse af hvad operationen gør. • Når man skal programmere en metode, skal man tage stilling til hvordan denne skal realiseres (implementeres).
Pointer (3) • Typisk er man både anvender og implementør af en metode, men det er vigtigt at skelne skarpt mellem de to syn. • Når man anvender en metode skal man ikke tænke på hvordan denne er realiseret. • Når man implementerer en metode skal man ikke tænke på hvad denne skal bruges til. • Efterlevelse af dette enkle princip er en af nøglerne til at kunne lave gode programmer.