Trinvis forfinelse Systematisk, gradvis udvikling af programmer.

Slides:



Advertisements
Lignende præsentationer
Hvordan programmerer man?? STREAM - en model. Programmører arbejder ofte i teams Hver programmør arbejder på sin del af en større helhed.
Advertisements

07 – Kort om OO Introduktion.
T1 – OPGAVE 14.2 LINETT & SABRINA Klasse Varer namespace Opgave_14._2 { class Varer { private string vare; private string farve; private double.
1 Rekursion og algoritmedesign. 2 Rekursion Rekursiv definition af X: X defineres i termer af sig selv. Rekursion er nyttig, når en generel version af.
Indledende Programmering Uge 2 - Efterår 2006 Selektioner og interaktion mellem objekter Susanne Brix Lindros.
KONCEPT Klasser og objekter En klasse beskriver et World ArrayList
1 Bevisteknikker. 2 Bevisteknikker (relevant både ved design og verifikation) Teorem: Der findes uendeligt mange primtal Bevis: Antag at der findes et.
GP 10, 7/ Grundlæggende programmering Efterår 2001 Forelæsning 10 onsdag 7/ kl. 9:15 – 12:00.
FEN IntroJava AAU1 Java grundelementer Variable og datatyper Sætninger og udtryk Metoder.
STREAM processen – Programmering i praksis
Forelæsning 3.1 Collections Javas for-each løkke
Opsamling Loops Klassedesign Immutable Lister shallowCopy() Projekt 2 FEN KbP/seminar3: Opsamling.
Interfaces – brug. Overblik Tidligere: –Interfaces Comparable gør det muligt at bruge Collections metoderne –min, max, sort, … –Algoritmemønstre Find.
Delphi og C++ Builder C++ Builder. C++ Historie Sproget blev designet for AT&T af danskeren Bjarne Stoustrup En objektorienteret videreudvikling.
Lektion 7 Læsestof: Kopier fra Caranno
FEN KbP/seminar2: design11 Kontraktbaseret programmering Seminar 2 Klassedesign – grundprincipper Eksempler: Stack Dictionary.
1 Design, analyse og verifikation. 2 Design Bevisteknikker Design ved hjælp at matematisk induktion Analyse O-notation Logaritmer Binær søgning Verifikation.
Comparable Students German Students Composite Pattern State Pattern Observer Pattern Collections Interfaces Abstrakte klasser Design Patterns.
8 RÅD VEDRØRENDE GOD PROGRAMMERING Effective (brown) Java.
FEN IntroJava AAU1 Klasser og objekter Grundbegreber Student-Course.
Forelæsning 2.2 Tilstand og opførsel (repetition)
Fundamentale sprogbegreber
Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence s; int i; int j; Sequence s; String s; int i; int j;
Repetition af dIntProg v/ Morten D. Bech. Tour de force Variabler Løkker Comparable ImErKo-reglen Eksamenssæt dIntProg, E13.
9. Interfaces. 2 Nordjyllands Erhvervakademi Objectives “Good class design starts with good application design — how many classes, do they relate.
Forelæsning 7.1 – repetition
Begreber og Redskaber 4. Plan for idag Om metoder, parametre, returværdier Et par ord om objekt-orientering Håndkøring af programmer.
Begreber og Redskaber 3. Plan for idag Om metoder, parametre, returværdier Overblik over klasser,objekter,nedarvning Et par ord om objekt-orientering.
Trinvis forfinelse vha. STREAM Systematisk, gradvis udvikling af programmer.
I o p o DAIMI, AU, November 1999Programkonstruktion I9E.1 Konstruktion og brug af klasser – en stak og en HP-regnemaskine push pop.
Fundamentale sprogbegreber Sætninger og udtryk Niveauer af programbeskrivelse (statisk versus dynamisk syn)
Introduktion til programmering Repetition - ArrayList.
Checklister Comparable og Comparator. dIntProg, E08Checklister.2 Checkliste for Comparable Antagelse –vi har en liste med elementer af typen T: List lst;
Klasser og objekter. dIntProg, E08Klasser og objekter.2 Grundbegreber Klasser og objekter –beskrivelse –oprettelse Attributter og metoder –tilstand –opførsel.
DAIMIIntroducerende objektorienteret programmering3B.1 Definition af klasser Klasseskelet, metoder, et eksempel: dato.
 Henrik B. Christensen, 1999Introducerende objektorienteret programmering8B.1 Interfaces En ren kontrakt.
DAIMIIntroducerende objektorienteret programmeringkd.1 Definition af klasser Klasseskelet, metoder, et eksempel: dato.
 Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.1 Programmering med interfaces – en stak og en HP-regnemaskine push pop.
DAIMIProgrammering af Store Systemer1 Concurrency i Java – Samarbejdende tråde.
Klassehierarkier Specialisering vha. subklasser. dIntProg, E05Klassehierarkier.2 Oversigt Eksempler på specialisering –Aktør, Koreograf, Skuespiller,
Indledende Programmering Uge 6 - Efterår 2006
Interfaces Afkobling af programkomponenter (eksempel: Comparable)
Objektorienteret analyse og design Ó Bennedsen 2001 Design - part Programmering og systemudvikling Lektion 7 Design - part 2.
I o p o DAIMI, AU, December 1999Introducerende objektorienteret programmering14A.1 Del, løs og kombinér.
Programmering med interfaces Separering af specifikation, anvendelse og implementation.
Grafik Modeller, objekter og opførsel. dIntProg, F08Grafik.2 Nye begreber Repetition (iteration) –gentagelse af opførsel Parametrisering –generalisering.
Klasser og objekter – grundbegreber.  Michael E. Caspersen, 2001Introducerende objektorienteret programmeringKlasser og objekter.2 Klasser og objekter.
Programmering med interfaces – en stak og en HP-regnemaskine push pop.
 Jens Bennedsen 2001Multimedie programmering4.1 Definition af begreber Interface, implements, klasse.
DAIMIIntroducerende objektorienteret programmering4A.1 Kontrakter og Design Kontraktbaseret design, JavaDoc dokumentation,
 Jens Bennedsen 2001Multimedie programmering3B.1 Specifikationer Betingelser, specifikationer og JavaDoc.
 Jens Bennedsen 2001Multimedie programmering3A.1 Definition af klasser Klasseskelet, metoder, et eksempel: dato.
Klasser og objekter. dIntProg, F08Klasser og objekter.2 Grundbegreber Klasser og objekter –beskrivelse –oprettelse Attributter og metoder –tilstand –opførsel.
I o p o DAIMI, AU, November 1999Introducerende objektorienteret programmering9D.1 Del, løs og kombinér.
Programmering med interfaces – en stak og en HP-regnemaskine push pop.
Del, løs og kombinér Et algoritmemønster.
Eksamen Praktisk prøve.
Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence s; int i; int j; Sequence s; String s; int i; int j;
Forelæsning Uge 2 – Torsdag Java syntax og style guide Sætninger –Simple sætninger (assignment, interne og eksterne metodekald) –Sammensatte sætninger.
Forelæsning Uge 4 – Torsdag
Forelæsning Uge 4 – Torsdag
Forelæsning Uge 2 – Torsdag
Forelæsning Uge 2 – Mandag
Klasser og objekter (Afsnit i manualen).
Dokumentation.
Dokumentation.
Dokumentation.
Quiz – Uge 4 – torsdag – første time
Parametrisering En kort introduktion.
Forelæsning Uge 4 – Torsdag
Præsentationens transcript:

Trinvis forfinelse Systematisk, gradvis udvikling af programmer

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

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)

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

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

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

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.

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

Eksempel: Date Mañana Princippet

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()

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

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...

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; }

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; }

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

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

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)

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)

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

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

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() { // 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.

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

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

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; }... }

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

dIntProg, F08Trinvis forfinelse.26 Edgar Alle Poe Top down design of the poem The Raven (1845) – Essay The Philosophy of Composition (1846) –