Utvecklingsmetodik kursupplägg

Version 2.3 - 2012-10-24.

Disposition av undervisningstillfällen

Vecka 1, tisdag

Lektionsinnehåll:

Vecka 1, torsdag

Förbered:

Lektionsinnehåll:

Vecka 2, tisdag

Förbered:

Lektionsinnehåll:

Vecka 2, torsdag

Förbered:

Lektionsinnehåll:

Vecka 3, tisdag

Förbered:

Lektionsinnehåll:

Vecka 3, torsdag (halvdag förmiddag)

Förbered:

Lektionsinnehåll:

Vecka 3, fredag (halvdag förmiddag)

Lektionsinnehåll:

Vecka 4, tisdag

Förbered:

Lektionsinnehåll:

Vecka 4, torsdag

Lektionsinnehåll:

Mer objektorientering

http://windwards.net/~quest/TIJ-3rd-edition-html.zip

http://windwards.net/~quest/TIJ-3rd-edition-code.zip

Läsanvisningar till Thinking in Java

Boken gör många jämförelser med andra språk. Detta är sällan relevant för oss och kan betraktas som överkurs.

Boken har många övningar. De är ofta summariskt beskrivna. Undvik att fastna på en uppgift vare eller gräva ned dig för mycket. Exempelvis 7.6 säger "In the base class, provide methods that are common to all Rodents" vilket är lätt att tolka för ambitiöst. Gå istället vidare.

Chapter 1: Introduction to Objects

Extensivt. Motsvarar grovt kapitel 7 (Better Living in Objectville) och är tämligen pratigt. Innehållet är viktigt, men många har svårt att ta till sig den här typen av teoretisk text. Lägg inte för mycket tid här.

Chapter 2: Everything is an Object

Intensivt. Delar överlappar tidigare kurser, men mycket är nog nytt, så hoppa inte för långt fram om du tycker att du redan behärskar det du läser.

Viktiga övningar: 2, 5, 7, 8, 10.

Chapter 3: Controlling Program Flow

Extensivt. Det mesta av detta kapitel har täckts av tidigare kurs och det är mitt intryck att ni behärskar de grundläggande operatorerna, villkors- och iterationssatserna. Läs efter individuell behållning.

Chapter 4: Initialization & Cleanup

Intensivt. Långt men viktigt kapitel. Stycket "Cleanup: finalization and garbage collection" är överkurs i den här kursen och kan läsas extensivt eller hoppas över. Stycket om flerdimensionella arrayer kan läsas extensivt. Viktigt att göra övningar i kapitel 4.

Viktiga övningar: 1-5, 8-10, 14-18.

Chapter 5: Hiding the Implementation

Viktigt, men pratigt kapitel. Stycket “Creating unique package names kan hoppas över.”

Viktiga övningar: 5-8, 10.

Chapter 6: Reusing Classes

Intensivt. Dessa kapitel beskriver grunderna i objektorientering a la Java. Viktigt att göra åtminstone några av övningarna.

Chapter 7: Polymorphism

Intensivt, utom stycket "Abstract classes and methods" som kan läsas extensivt.

Viktiga övningar: 1-5, 8-9, 11-13 (strunta i gnagarna)

Chapter 8: Interfaces & Inner Classes

Intensivt till "Initializing fields in interfaces." Skumma delen om inre klasser; medan de är praktiska, finns det nästan inget tillfälle där man måste använda inre klasser. Viktigt att göra övningarna (om interface) här.

Viktiga övnignar: många övningar, men viktiga, gör så många du orkar.


Introduktion till testdriven utveckling

Den första och viktigaste metoden för ett disciplinerat förhållningssätt till programmering är testdriven programmering.

Kapitel 1 ur boken The Art of Unit Testing sammanfattar mycket bra vad ett enhetstest är:

http://manning.com/osherove2/AUT2e_meap_ch01.pdf

Övningar

T1. Ditt första enhetstest

En kort tutorial som hjälper dig att komma igång med enhetstestning under Eclipse:

http://www.vogella.com/articles/JUnit/article.html

Följ introduktionen till och med 3.4. Resten är överkurs. Tutorialen är för förra versionen av Eclipse, så skärmbilderna kommer inte att stämma exakt.

T2. Implementera en miniräknare

Nedan finner du en testsvit till en miniräknare. Implementera de tomma klasserna så att alla enhetstest passerar.

https://bitbucket.org/quest/calculator-tests

T3. Implementera en validator

Dosan som läser ditt kort på spårvagnen kallas en validator. Nedan finner du en testsvit för en enkel validator. Implementera de tomma klasserna så att alla enhetstest passerar.

https://bitbucket.org/quest/pt-validator-tests

Tips: låt dig inte förvirras av att Storage.store() tar en parameter “credit”; denna behövs inte förrän i T4.

T4. Förbättra validatorn

Ett problem med biljettsystem som kräver “utcheckning” är att folk glömmer att checka ut. Förbättra validatorn från T3 så att den kommer ihåg innestående fordringar och i stället debiterar kortet nästa gång resenären stiger ombord (första meddelandet i displayen ska informera om detta).

Validator.endStation() anropas när föraren loggar ut från fordonet när turen avslutats. Då har alla passagerare lämnat fordonet.

Försök så långt som möjligt att skriva testen före implementationen.

T5. Skriv enhetstester

Nedan finner du en serie enkla klasser. Skriv enhetstester för relevanta delar av dessa klasser. Notera att klasserna innehåller detaljerade instruktioner och tips.

https://bitbucket.org/quest/unittesting-exercises

T6. Testsvit för addressboken

Nedan finner du en enkel addressbok som fungerar med inmatning på kommandoraden. Skriv en testsvit för denna. I sitt nuvarande skick kan den vara svår att skriva enhetstester för. Det ingår därför i övningen att modifiera produktionskoden så att den går att testa ordentligt. Var försiktig, så att du inte ändrar dess beteende.

https://bitbucket.org/quest/addressbork-src

Om du hellre vill, kan du istället välja att skriva en testsvit för din egen eller någon medstudents addressbok för examinationen i föregående kurs.

Introduktion till versionshantering

Först, några artiklar som introducerar konceptet versionshantering:

http://guides.beanstalkapp.com/version-control/intro-to-version-control.html

http://betterexplained.com/articles/a-visual-guide-to-version-control/

Kursen kommer att använda versionshanteringsverktyget Mercurial. Mercurial är modernt och låter oss öva på alla versionshanteringens arbetsmoment.

Installera Mercurial

Eclipse

Det går att få Mercurial-integration i Eclipse.

Windows

TortoiseHg rekommenderas. Försäkra dig om att du kryssar i Shell Extensions under installationen. TortoiseHg kan även användas som kommandoradsklient. Se tutorial i V1.

MacOSX

Installationspaket för kommandoradsklienten för MacOSX. För grafiskt gränssnitt kan man använda MacHg.

Linux

På en Ubuntu eller Fedora-installation bör både kommandoradsklienten Mercurial och TortoiseHg gå att installera via den vanliga pakethanteraren.

Läsanvisning till “Mercurial: The Definitive Guide”

Vår huvudkälla till visdom om Mercurial är boken “Mercurial: The Definitive Guide.” Den återfinns i sin helhet här:

http://hgbook.red-bean.com/read/

Boken är omfattande och delar av den täcker ämnen mer avancerade än vi behöver för denna kurs. Följ anvisningarna nedan när du läser boken.

Chapter 1. How did we get here?

Läs extensivt och insup terminologin. Jämförelser med andra verktyg är i första hand för den intresserade.

Chapter 2. A tour of Mercurial: the basics

Centralt kapitel. Försök göra övningarna själv. Läraren kommer att hålla en introduktion.

Chapter 3. A tour of Mercurial: merging work

Centralt kapitel, men svårt koncept. Att “merga” är ganska vanligt, men det kan vara svårt att relatera till. Experimentera gärna. Läraren kommer hålla en introduktion.

Chapter 4. Behind the scenes

Frivilligt: ingen behöver veta hur en bensinmotor fungerar för att kunna köra bil. Den främsta behållningen av kapitlet är som beskrivning av designen av välgjord mjukvara.

Chapter 5. Mercurial in daily use

Centralt kapitel. Försök följa med övningarna. Referera till detta kapitel när du versionshanterar dina uppgifter under kursen.

Chapter 6-8

Avancerad funktionalitet som vi kommer att återkomma till i senare kurser när våra mjukvaruprojekt blir större.

Chapter 9. Finding and fixing mistakes

Läs extensivt. När du utvecklar och inser att du vill ångra något du gjort i ditt arkiv, återkom till detta kapitel och läs om hur du backar ur ändringar du gjort.

Övningar

V1. Introduktion till Mercurial

Studenten gör en tutorial för att bekanta sig med TortoiseHg och kommandoradsverktyget. För grafiska klienter, följande tutorial:

http://tortoisehg.bitbucket.org/manual/2.4/quick.html

Om du väljer denna tutorial, se till att göra den både med det grafiska gränssnittet och med “thg.” De flesta exemplen i Mercurial-boken använder kommandoradsgränssnitt, så det hjälper om du är bekant med det.

För den som föredrar att göra tutorial med kommandoradsklient, se:

http://mercurial.aragost.com/kick-start/en/

I denna tutorial, fokusera på kapitlen Basic Mercurial, Task Based Development och Remote Repositories.

V2. Fyll i loggmeddelandena

Läraren tillhandahåller ett arkiv med successiva ändringar i en HTML-fil, men helt utan loggmeddelanden och studenterna skriver loggmeddelanden utifrån de ändringar som gjorts. Övningen går framför allt ut på att förstå diff.

https://bitbucket.org/quest/mercurial-diff-exercise

Beskriv i stora drag vad som sker vid varje version på ett sätt som gör det lätt att hitta rätt senare.

V3. Bidrag till Mercurial-boken

Källan till Mercurial-boken är tillgänglig som ett Mercurial-arkiv på:

https://bitbucket.org/bos/hgbook

Klona boken till din dator, repetera de viktiga kapitlen och förtydliga minst två ställen i den engelska texten som du tycker är svåra att förstå. Det finns massor av information i Mercurials wiki som kan hjälpa förståelsen.

Boken är skriven i docbook-format. Se dig om i de olika filerna för att se hur man formulerar sig i DocBook XML.

Vidare läsning i “Head first Java”

Den programmering vi kommer att träffa på under kursen täcks åtminstone delvis av kursboken för föregående kurs. Här kommer några tips om vilka delar som är relevanta att läsa (eller repetera).

Kapitel 4: How Objects Behave

Kapitlet beskriver begrepp som ligger till grund för mycket av den kod vi ska producera. Om du känner dig osäker på något av begreppen häri, bör kapitlet repeteras.

Kapitel 8: Serious Polymorphism

Medan kursen inte kommer att beröra abstrakta klasser eller polymorfism nämnvärt, kommer vi att arbeta mycket med interface. Denna del av kapitel 8 bör studeras ingående.

Kapitel 10: Numbers Matter

Studera gärna kapitlet i anslutning till kalkylator-övningen. Beroende på vald implementation, kan till exempel styckena om autoboxing och decimaltal kan komma väl till pass.

Kapitel 11: Risky Behaviour

Både tester och implementation kommer att innehålla felhantering. Kapitlet bör studeras ingående.

Kapitel 16: Data Structures

Set, mappar och listor är våra viktigaste datatyper. Flera av uppgifterna i denna kurs kräver grundläggande förståelse för dessa, så kapitel 16 bör studeras ingående.

Föreläsningar om Java

Flyttal och decimaltal

Den senare delen av T2 kräver att vi hanterar decimaler. Det finns två fundamentalt olika sätt att göra detta. En kort introduktion.

Annoteringar och introspektion

Med @Test träffar vi vår första annotering. Annoteringar blir allt mer populära, särskilt i de stora bean-ramverken. För att förstå annoteringar måste vi också förstå begreppet introspektion.

Kalendrar, tidszoner och sommartid

Programmerare kan förefalla timida varelser. Då har man inte sett dem när sommartidsomställning kommer på tal. Härmed en introduktion till en av de största felkällorna i ett typiskt komplext informationssystem.

Spridda föreläsningar

När for-looparna snurrar lika mycket i skallen som i datorn tar vi paus med en översiktsföreläsning.

Kursens plats i programmet

Var står vi efter två introduktionskurser? Vart går vi härnäst?

http://prezi.com/lb0lzxgssrjk/utvecklingsmetodik/

Begreppsapparaten

En introduktion till begrepp som behövs för att kunna tala om mjukvara.

Krav - programmerarens indata

Begreppet krav är mycket centralt i all systemutveckling. Mediespelarprojektet innehåller en lista med krav. Dessa blir en utgångspunkt i denna introduktion till kravställning.

http://blog.thingsdesigner.com/uploads/id/tree_swing_development_requirements.jpg

Principen lean

Hur lite krävs för att lösa ett problem och varför är det så viktigt att undvika overkill?

Teamet - programmerarens vardag

Den mesta systemutveckling sker i grupp. Vad betyder det i praktiken?

Programmeringens estetik

Källkod är naturligt språk med vilket vi kommunicerar med andra utvecklare, både samtida och framtida. Vad betyder detta för oss som utvecklare?


Skapa en mediaspelare

Grupper om 4-5 studenter ska implementera en enkel mediaspelare. Projektet ska träna arbete i team, enhetstestning och versionshantering.

Teamet ska leverera ett Mercurial-arkiv med en enkel mediaspelare. Det går bra med en zip-fil som bilaga, en Bitbucket-URL eller motsvarande. Denna mejlas senast torsdag 1/11 12:00 till javautvecklare@quest.windwards.net.

Fokus i denna övning är att producera bakändan till en mediaspelare som möter kraven nedan. Jag rekommenderar starkt att teamet också implementerar ett gränssnitt av något slag (till exempel konsoll eller Swing); det blir annars svårt för teamet att vara säkert på att mjukvaran verkligen fungerar enligt förväntan. Gränssnittet ingår inte i bedömningen.

Enkelt ramverk

Här gives ett enkelt ramverk som hjälper teamet att komma igång. Det finns inget krav att använda detta ramverk. Det går också bra att ändra på det efter behov.

https://bitbucket.org/quest/mediaplayer-framework

Ramverket innehåller hjälpklasser som gör det lite enklare att skriva enhetstester för spelarlogiken.

Bedömningskriterier

Projektets inlämnade arkiv kommer att bedömas på, i fallande prioritetsordning:

Godkänt: 15 p, Väl godkänt 20 p.

Rekommendationer

Några praktiska tips som hjälper er få poäng:

Om teamet blir inspirerat och vill lägga till mer funktionalitet än den som motsvarar kraven nedan, gör det i ett parallellt arkiv, så att du har ett slimmat arkiv ni kan skicka till läraren.

Efter avslutat projekt kommer ett kort seminarium där vi tittar på de olika implementationerna. Syftet är att öva på att beskriva, läsa och förstå källkod.

Kravspecifikation för mediespelare

Varje krav motsvarar grovt sett en metod som kan användas av ett gränssnitt. Om frågor uppstår om kraven, be om komplettering av läraren per mejl eller vid handledningstillfälle.

MP-1: Ta emot en lista av låtar att spela

MP-2: Presentera lista av låtar att spela

Ger gränssnittet en lista tillbaka i den ordning låtarna har/kommer att spelas.

MP-3: Presentera aktiv låt

Används av ett gränssnitt för att efterfråga aktiv låt.

MP-4: Callback när aktiv låt ändras

Gränssnittet ska kunna ge mediaspelaren en referens till ett objekt som implementerar en lämplig metod som mediaspelaren anropar med låten varje gång en ny låt blir aktiv.

MP-5: Starta, stoppa spelning

Metoder med vilka gränssnittet kan starta respektive avbryta spelning av låt som tidigare satts som aktiv. Multipla anrop har ingen vidare effekt. Det krävs inte att spelning automatiskt fortsätter till nästa låt (se MP-9).

MP-6: Stega en låt framåt, bakåt

MP-7: Sätt aktiv låt

Användaren går till en specifik låt, till exempel genom att klicka i ett grafiskt gränssnitt.

MP-8: Spela i slumpvis ordning

MP-9: Fortsätt automatiskt spela nästa låt

Så fort en låt har spelat färdigt, ska nästa låt sättas aktiv och påbörjas så länge det finns låtar i listan.

JavaFX och Applet

javafx ingår i J2SE från och med 1.7.0-07. För tidigare version måste javafx installeras separat. Ramverksprojektet innehåller därför en andra version av API:et som heter net.windwards.mediaplayer.appletimpl som bygger på java.applet.AudioClip, som kan användas om du måste utveckla på en dator där det är svårt att få javafx att fungera. Kom bara ihåg att AudioClip inte kan användas för att lösa MP-9.

För att ladda ned separat JavaFX:

http://www.oracle.com/technetwork/java/javafx/downloads/index.html

Revisionshistorik

v2.3

v2.2

v2.1

v2.0

v1.1

v1.0