Download præsentationen
Præsentation er lastning. Vent venligst
Offentliggjort afLudvig Eskildsen Redigeret for ca. et år siden
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
Lignende præsentationer
© 2024 SlidePlayer.dk Inc.
All rights reserved.