Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avIngegerd Jonasson
1
Metodik för problemlösning Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael Kölling Fredric Ragnar fredric.ragnar@hgo.sefredric.ragnar@hgo.se Telefon 0498-299948 Andreas Hedrén andreas.hedren@hgo.seandreas.hedren@hgo.se Telefon 0498-299954 Föreläsning Mañana
2
2 Idag S.T.R.E.A.M. & ”The Manãna Principle” Idéer om utveckling från Kölling & Caspersen (OOPSLA’06 October 22–26, 2006, Portland, Oregon, USA. ACM 1-59593- 491-X/06/0010)
3
Ett recept för systemutveckling - S.T.R.E.A.M. Stubs Tests Representation Evaluation Attributes Methods
4
Stubs - Skelettkod Börja med att skapa skeletten för klasserna. Detta steg har föregåtts av analys och design. Fyll klassen med standard-konstruktor Lägg in metod-signaturer, men ingen implementation
5
Tests – Tester Koda tester för att testa klasserna som har definierats i kodskelett
6
Representation Finns det alternativa lösningar för algoritmer Finns det alternativa sätt att visa datat
7
Evaluation Utvärdera de olika varianterna av lösningar och välj den som ger minst implementations-arbete eller komplexitet
8
Attributes Lägg till fält (medlemsvariabler) i klasserna
9
Methods Fyll kodskelettet med implementationer
10
Exempel – Klassen Date Specifikation: Interfacet DateInterface Tänk på interface som bilnyckel och ratt när man kör bil. Hur sedan motorn fungerar och förbränning av bensin är något dolt under motorhuven och själva implementationen. Vi kommer att prata mer om interface längre fram ;) Interface DateInterface { /** * Advance the date to the next day */ public void setToNextDate(); /** * Return a string representation of this date in * the format yyyy-mm-dd */ public String toString(); }
11
Stubs – Skelettkod till klassen Date public class Date1 implements DateInterface { /** * Advance the date to the next day */ public void setToNextDate() { } /** * Return a string representation of this date in * the format yyyy-mm-dd */ public String toString() { return ””; }
12
Tests – Testa den nya klassen... /** * Test method for {@link se.hgo.oopmj2.Date1#setToNextDate()}. */ public void testSetToNextDate() { fail("Not yet implemented"); // TODO } /** * Test method for {@link se.hgo.oopmj2.Date1#toString()}. */ public void testToString() { fail("Not yet implemented"); // TODO }...
13
Representation – Alternativa lösningar Datum kan uttryckas på olika sätt. R1: Uttrycka datum med tre heltal för dag, månad och år R2: Uttrycka datum med utgångspunkt från ett start-datum, exempelvis 0001-01-01
14
Evaluation – Utvärdering av alternativa lösningar Utifrån de alternativa lösningarna görs en utvärdering hur mycket implementations-arbete de olika lösningarna medför Skala: ”Trivial” – ”Challenging” – ”Hard” IMPL. EFFORTR1R2 setToNextDate()ChallengingTrivial toString()TrivialHard
15
Attributes – Fält (Medlemsvariabler)... // Member variables private int mDay;// 1 <= day <= daysInMonth private int mMonth;// 1 <= month <= 12 private int mYear; // Constructor public Date1() { mDay = 1; mMonth = 1; mYear = 2001; }...
16
Methods – Implementera metoder Fylla klassen med beteende Nyttja ”The Mañana Principle”
17
”The Mañana Principle” ”When – during implementation of a method – you wish you had a certain support method, write your code as if you had it. Implement it later.” En variation av stegvis förbättring av kod. När man stöter på ett ställe i koden där man önskar man hade en metod – anropa den metoden. När man implementerat den aktuella metoden går man till Mañana-metoden och fortsätter med den. Fast man väntar inte till nästa dag ;)
18
När behöver man använda Mañana-principen? Specialfall: Om man behöver hantera ett specialfall i koden så hanteras detta i en separat metod Nästlade loopar: Om har man en nästlad loop så flyttar man ut den inre loopen i en separat metod Kod-duplicering: Om samma kod-segment dyker upp på flera ställen så läggs den i en separat metod Svårlöst problem: Om ett komplext problem dyker upp som behöver lösning, men som det inte finns en omedelbar lösning till flytta ut den i en separat metod Omständiga problem: Om en sats blir lång eller komplicerad så flyttas den in i en separat metod
19
Methods – Implementera metoder - Startpunkt... /* (non-Javadoc) * @see se.hgo.oopmj2.DateInterface#setToNextDate() */ public void setToNextDate() { mDay = mDay + 1; } /** * Return a string representation of this date in * the format yyyy-mm-dd */ public String toString() { return mYear + "-" + mMonth + "-" + mDay; }...
20
Methods – Kontroll av antalet dagar /* (non-Javadoc) * @see se.hgo.oopmj2.DateInterface#setToNextDate() */ public void setToNextDate() { mDay = mDay + 1; checkDayOverflow(); // Mañana }
21
Methods – Ny månad /** * Check for special case where day > daysInMonth; * in that case, set day to 1 and add 1 to the month */ private void checkDayOverflow() { if(mDay > 30) { mDay = 1; mMonth = mMonth + 1; }
22
Methods – Nytt år /** * Check for special case where day > daysInMonth; * in that case, set day to 1 and add 1 to the month */ private void checkDayOverflow() { if(mDay > 30) { mDay = 1; mMonth = mMonth + 1; checkMonthOverflow(); // Mañana }
23
Methods - Månadskontrollen /** * Check for special case where day > daysInMonth; * in that case, set day to 1 and add 1 to the month */ private void checkDayOverflow() { if(mDay > daysInMonth()) { mDay = 1; mMonth = mMonth + 1; checkMonthOverflow(); }
24
Methods – Dagar i månaden /** * Return the number of days in the current month */ private int daysInMonth() { int[] daysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int result = daysInMonth[mMonth -1]; return result; }
25
Methods - Skottår /** * Return the number of days in the current month */ private int daysInMonth() { int[] daysInMonth = {31, 28, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30}; int result = daysInMonth[mMonth -1]; // Special case: February in a leap year if( mMonth == 2 && isLeapYear()) { result = result + 1; } return result; }
26
Methods – De sista Mañana-metoderna /** * Return true if the current year is a leap year */ private boolean isLeapYear() { return (divides(4, mYear) && !divides(100, mYear)) || divides(400, mYear); } /** * Return true if a divides b */ private boolean divides(int a, int b) { return b % a == 0; }
27
Summering Det är viktigt att fundera över alternativa lösningar Testa funktionaliteten Identifiera svåra delar i koden och tänk att du har en metod som löser den Bryt ner stora problem i flera mindre delar
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.