Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Trinvis forfinelse Systematisk, gradvis udvikling af programmer.

Lignende præsentationer


Præsentationer af emnet: "Trinvis forfinelse Systematisk, gradvis udvikling af programmer."— Præsentationens transcript:

1 Trinvis forfinelse Systematisk, gradvis udvikling af programmer

2 dIntProg, F08Trinvis forfinelse.2 Oversigt Eksempel på udvikling af et program –forfinelse af en klasse (Date) Proces –systematisk fremgangsmåde Teknikker –separation of concerns –nedbrydning i løst koblede delproblemer –mañana-princippet

3 dIntProg, F08Trinvis forfinelse.3 Proces, overordnet Gør det simpleste du kan der bringer dig videre –Udgangspunkt i klassemodel –En klasse ad gangen (tag altid det simpleste først) –Sørg for hele tiden at have en ”tilfreds” compiler –Sørg hele tiden for at det du har lavet virker (lad fremdriften drives af og afspejles i resultatet fra et testprogram)

4 dIntProg, F08Trinvis forfinelse.4 Proces for implementation af en klasse Step 1 –ignorer repræsentation (feltvariabler) –opret stubbe for de specificerede metoder –tomme metoder eller returnering af standardværdi for returtypen Step 2 –lav testprogram (hvis det ikke er givet som en del af opgaven) Step 3 –overvej alternative repræsentationer af tilstanden –lav en REM (Repræsentations-Evaluerings-Matrice) –vælg efter hvad der er simplest at implementere Step 4 –erklær feltvariabler med roller (klasseinvariant) Step 5 –implementer methoderne

5 dIntProg, F08Trinvis forfinelse.5 3. Overvej alternative repræsentationer Find alternative repræsentationer –tænk på så mange som muligt; mindst ot (R 1,..., R n, n ≥ 2) Lav en REM baseret på implementationsbesvær Vælg efter hvad der er simplest at implementere –ikke efter indbildte krav (som f.eks. effektivitet) Simpelhed af implementering R1R1...RnRn metode 1 Challenging...Trivial... metode n Easy...Average Qualifiers: Trivial, Easy, Average, Challenging, Hard

6 dIntProg, F08Trinvis forfinelse.6 5. Implementer metoder WHILE en metode er ufærdig: vælg en ufærdig metode; implementer metoden Opgaven implementer metoden er selv en iteration: WHILE ikke færdig: forbedr metoden; test Vælg metoderne i rækkefølge efter hvad der er simplest

7 dIntProg, F08Trinvis forfinelse.7 Programmeringsprincip... Mañana Princippet Opmuntrer til –”separation of concerns” –mange små metoder Når du ønsker du havde en bestemt hjælpemetode, skriv da din kode som om du havde den. Implementer den senere.

8 dIntProg, F08Trinvis forfinelse.8... og (nogle) regler Special Case –hvis du har brug for kode til håndtering af et specialtilfælde, skriv da denne kode i en separat metode Nested Loop –lav aldrig nestede løkker; lav istedet en separat metode og lad repetenden i den første løkke være et kald af denne metode Code Duplication –hvis du skriver det samme kodesegment mere end en gang, flyt da segmentet ud i en separat metode Hard Problem –hvis du har brug for en løsning på et problem som du ikke umiddelbart kan løse, lav da en separat metode til løsning af problemet Heavy Functionality –hvis en sekvens af sætninger eller et udtryk bliver for omfattende eller kompliceret, flyt da dette (eller dele heraf) ud i en separat metode

9 Eksempel: Date Mañana Princippet

10 dIntProg, F08Trinvis forfinelse.10 Date (step 1) class Date { /** Advance the date to the next day */ public void setToNextDate() {} /** = a rep. of this date in the format yyyy-mm-dd */ public String toString() { return null; } } Date setToNextDate() String toString()

11 dIntProg, F08Trinvis forfinelse.11 Date (step 2) ?

12 dIntProg, F08Trinvis forfinelse.12 Date (step 3) Simpelhed of implementering R1R1 R2R2 setToNextDateChallengingTrivial toStringTrivialHard R 1 : Brug tre heltalsvariabler: day, month, and year R 2 : Brug en heltalsvariabel: antal dage siden...

13 dIntProg, F08Trinvis forfinelse.13 Date (step 4) class Date { private int day, // 1  day  daysInMonth month, // 1  month  12 year; /** Advance the date to the next day */ public void setToNextDate() {} /** = a rep. of this date in the format yyyy-mm-dd */ public String toString() { return null; }

14 dIntProg, F08Trinvis forfinelse.14 Date (step 5.1) class Date { private int day, // 1  day  daysInMonth month, // 1  month  12 year; /** Advance the date to the next day */ public void setToNextDate() {} /** = a rep. of this date in the format yyyy-mm-dd */ public String toString() { return year + “-” + month + “-” + days; }

15 dIntProg, F08Trinvis forfinelse.15 Date (step 5.2.1) class Date { private int day, // 1  day  daysInMonth month, // 1  month  12 year; /** Advance the date to the next day */ public void setToNextDate() { day= day + 1; }... } Bryder betingelsen i rollen hvis day er daysInMonth Mañana Principppet: Special Case reglen

16 dIntProg, F08Trinvis forfinelse.16 Date (step 5.2.2) class Date { private int day, // 1  day  daysInMonth month, // 1  month  12 year; /** Advance the date to the next day */ public void setToNextDate() { day= day + 1; checkDayOverflow(); } /** Handle special case where day > daysInMonth */ private void checkDayOverflow() {}... } Mañana Princippet: Special Case reglen

17 dIntProg, F08Trinvis forfinelse.17 Date (step 5.3.1) class Date { private int day, // 1  day  daysInMonth month, // 1  month  12 year;... /** Handle special case where day > daysInMonth */ private void checkDayOverflow() { if ( day > 30 ) { day= 1; month= month + 1; }... } Antagelse: 30 dage i hver måned Bryder betingelsen i rollen hvis month er 12 Mañana Princippet: Special Case reglen (igen)

18 dIntProg, F08Trinvis forfinelse.18 Date (step 5.3.2) class Date { private int day, // 1  day  daysInMonth month, // 1  month  12 year;... /** Handle special case where day > daysInMonth */ private void checkDayOverflow() { if ( day > 30 ) { day= 1; month= month + 1; checkMonthOverflow(); } } /** Handle special case where month > 12 */ private void checkMonthOverflow() {}... } Mañana Princippet: Special Case reglen (igen)

19 dIntProg, F08Trinvis forfinelse.19 Date (step 5.4.1) class Date { private int day, // 1  day  daysInMonth month, // 1  month  12 year;... /** Handle special case where month > 12 */ private void checkMonthOverflow() { if ( month > 12 ) { month= 1; year= year + 1; }... } Det var det! Bortset fra antagelsen om 30 dage i hver måned, så er vi færdige. Mañana Princippet: Hard Problem reglen

20 dIntProg, F08Trinvis forfinelse.20 Date (step 5.3.3) class Date { private int day, // 1  day  daysInMonth month, // 1  month  12 year;... /** Handle special case where day > daysInMonth */ private void checkDayOverflow() { if ( day > daysInMonth() ) { day= 1; month= month + 1; } } /** = the number of days in the current month */ private int daysInMonth() { return 30; }... } Mañana Princippet: Hard Problem reglen

21 dIntProg, F08Trinvis forfinelse.21 Date (step 5.5.1) class Date { private int day, // 1  day  daysInMonth month, // 1  month  12 year;... /** = the number of days in the current month */ private int daysInMonth() { // 1 2 12 int[] daysInMonth= [0, 31, 28,..., 31]; int res= daysInMonth[month]; return res; }... } Mañana Princippet: Special Case reglen Bortset fra skudårsproble- matikken, er vi nu færdige.

22 dIntProg, F08Trinvis forfinelse.22 Date (step 5.5.2) class Date { private int day, // 1  day  daysInMonth month, // 1  month  12 year;... /** = the number of days in the current month */ private int daysInMonth() { int[] daysInMonth= [0, 31, 28,..., 31]; int res= daysInMonth[month]; if ( month==2 and isLeapYear() ) { res= res + 1; } return res; } /** = the current year is a leap year */ private boolean isLeapYear() {return false; }... } Mañana Princippet: Special Case reglen

23 dIntProg, F08Trinvis forfinelse.23 Date (step 5.6.1) class Date { private int day, // 1  day  daysInMonth month, // 1  month  12 year;... /** = the current year is a leap year */ private boolean isLeapYear() { return (divides(4, year) && !divides(100, year)) || divides(400, year); } /** = x divides y */ private boolean divides(int x, int y) { return false; }... } Mañana Princippet: Heavy Functionality reglen

24 dIntProg, F08Trinvis forfinelse.24 Date (step 5.7.1) class Date { private int day, // 1  day  daysInMonth month, // 1  month  12 year;... /** = x divides y */ private boolean divides(int x, int y) { return y % x == 0; }... }

25 dIntProg, F08Trinvis forfinelse.25 Programmeringsteknikker Separation of concerns –nedbryd i delproblemer –fokuser på et forhold ad gangen –opdel problemstillingen så de enkelte dele er uafhængige (løs kobling) Mañana-princippet –Special Case –Nested Loop –Code Duplication –Hard Problem –Heavy Functionality

26 dIntProg, F08Trinvis forfinelse.26 Edgar Alle Poe Top down design of the poem The Raven (1845) –www.eapoe.org/works/poems/ravenj.htm Essay The Philosophy of Composition (1846) –www.eapoe.org/works/essays/philcomp.htm


Download ppt "Trinvis forfinelse Systematisk, gradvis udvikling af programmer."

Lignende præsentationer


Annoncer fra Google