582334 TDD-ohjelmointimenetelmä ja koodin suunnittelu (5 op), syksy 2009
582334 TDD programming technique and designing code (5 cr), autumn 2009
Luennot
HUOM! Tämä luentoaikataulu on vasta alustava suunnitelma. Luentojen sisältö ja lähdemateriaali tarkentuu myöhemmin.
Harjoituksen 1 tehtävänanto jaetaan
Luento 1: ???
- (<H1) TDD/BDD, motivaatio, johdanto, miten, Simplest Thing, YAGNI
Luento 2: ???
- code quality
- http://www.infoq.com/presentations/10-Ways-to-Better-Code-Neal-Ford (PDF) [V] (composed method, TDD, static analysis, good citizenship (singleton), YAGNI, top 10 corporate code smells, question authority, SLAP (single level of abstraction principle), polyglot programming, every nuance, anti-objects)
Harjoituksen 2 tehtävänanto jaetaan
Luento 3: ???
- (<H3) functions
- Clean Code, chapter 3
- (<H3) comments
- Clean Code, chapter 4
- (<H3) formatting
- Clean Code, chapter 5
Luento 4: ???
- (<H5) objects and data structures
- Clean Code, chapter 6
- error handling
- Clean Code, chapter 7
- boundaries
- Clean Code, chapter 8
Harjoituksen 3 tehtävänanto jaetaan
Luento 5: ???
Luento 6: ???
Harjoituksen 4 tehtävänanto jaetaan
Luento 7: ???
Luento 8: ???
- Coding Dojo: aiheena ??? (esim. game of life + acceptance testing?)
Harjoituksen 5 tehtävänanto jaetaan
Luento 9: ???
Luento 10: ???
- Coding Dojo: aiheena ??? (esim. eight queens puzzle + GUI?)
Harjoituksen 6 tehtävänanto jaetaan
Luento 11: ???
Luento 12: ???
Kurssikoe
Harjoitukset
Ohjelmointiharjoitukset saa tehdä parikoodauksena, ellei sitä ole erikseen kielletty. Jos kaksi henkilöä (mutta ei useampi) on yhdessä ohjelmoinut harjoitusviikolla vaaditun toiminnallisuuden, niin molemmat saavat siitä pisteet. Harjoitustöiden viikottainen toiminnallisuus on kumulatiivista, mutta on sallittua käyttää pohjana edellisviikon harjoituksista peräisin olevaa toisen henkilön koodia, jossa ei vielä ole tämän viikon harjoituksissa vaadittua toiminnallisuutta.
HUOM! Tämä harjoitusaikataulu on vasta alustava suunnitelma. Harjoitusten sisältö tarkentuu myöhemmin.
Tetris-harjoitustyön testitapaukset ovat GitHubissa. Olisi mukavaa saada niistä palautetta ennen kurssin alkua joltakulta, joka ei ole aiemmin käyttänyt TDD:tä... Palautetta voi lähettää sähköpostiini esko.luontola ÄT cs.helsinki.fi.
Lähdekoodit saa noudettua komennolla git clone git://github.com/orfjackal/tdd-tetris-tutorial.git
(tutorial branch). Ohjeita Gitin käyttämiseen saa mm. virallisilta sivuilta, GitHubista ja Git Readystä. Lähdekoodit ovat valmiiksi Maven-projektina, joten niiden testit saa ajettua komennolla mvn test
ja projektin saa zipattua komennolla mvn clean package
(tuotokset tallentuvat /target
-kansioon).
Harjoitus 1: Tetris #1 (totuttelu). Duplikaation havaitseminen.
Kotitehtävä:
- Lue annetut artikkelit ??? TDD:stä
- Tetris #1: toteuta
FallingBlocksTest
läpäisevä koodi.
- Havaitse duplikaatiota annetusta funktiosta ??? ja mieti miten sitä voisi parantaa (ehkä D:\DEVEL\GunTactyx\src\Apocalyx\dev\src\_GunTactyx\gtsim.cpp:1100-1352, aim-funktio)
- Varmista että kehitysympäristösi toimii ATK-luokassa.
Harjoitustilaisuudessa:
- Varmistetaan että kehitysympäristö toimii kaikilla.
- Parikoodataan Tetris #2 lähtien.
Harjoitus 2: Tetris #2-3 (algoritmien synty, refaktorointi). Muuttujien nimeäminen.
Kotitehtävä:
- Tetris #2-3: toteuta
RotatingPiecesOfBlocksTest
ja RotatingTetrominoesTest
läpäisevä koodi.
- Refaktoroi annettua luokkaa ??? siten, että sen muuttujilla ja metodeilla on paremmat nimet (Clean Code luku 2 tai Meaningful Names).
Harjoitustilaisuudessa:
- Parikoodataan Tetris #4 ja tehdään sen alussa vaatima refaktorointi. Jos menee liian helposti, niin refaktoroi myös koodausparin versio.
Harjoitus 3: Tetris #4-6 (omat testit). Funktion refaktorointi.
Kotitehtävä:
- Tetris #4-6: toteuta
FallingPiecesTest
, MovingAFallingPieceTest
ja RotatingAFallingPieceTest
, sekä ne läpäisevä koodi. Kirjoita tarvittavat testit itse.
- Refaktoroi annettua funktiota/luokkaa ??? siten, että sen luettavuus on mahdollisimman hyvä (Clean Code luvut 3-5).
Harjoitustilaisuudessa:
- Parikoodataan Tetrikseen toinen palikanpyörityslogiikka. Korvataan aiempi algoritminen pyöritys kovakoodatulla pyörityksellä, joka seuraa TGM:n pyörityssääntöjä. Poista kaikki turha koodi. (???: muutetaanko omaa vai vierasta koodia?)
Harjoitus 4: Tetris #7 (mock objects). HT2 #1 (ensimmäiset askeleet).
Kotitehtävä:
- Tetris #7: toteuta täysien rivien poistaminen ja pisteiden lasku. Käytä testeissä EasyMock-kirjastoa (pisteidenlaskija vastaanottaa tapahtumia poistetuista riveistä).
- HT2 #1: toteuta pyydettyyn ??? toiminnallisuuteen asti. Tee tämä yksin, älä parikoodaa, jotta kokisit ensimmäisten askeleiden tekemisen itse.
- HT2 aihe: osoitekirja ???
Harjoitustilaisuudessa:
Vaihdetaan omia koodeja jonkun toisen kanssa. Parikoodataan HT2 eteenpäin, käyttäen vierasta koodia. ???
Harjoitus 5: HT2 #2 (GUI testing). Luokkarakenteen refaktorointi.
Kotitehtävä:
- HT2 #2: toteuta pyydettyyn ??? toiminnallisuuteen asti (testattava GUI:n toimintalogiikka ja toteutettava GUI ohuena kerroksena sen päälle).
- Refaktoroi annettua luokkaa ??? siten, että jaat sen useaan osaan.
Harjoitustilaisuudessa:
- Vaihdetaan omia koodeja jonkun toisen kanssa. Muutetaan vierasta HT2:ta, esim. toteutetaan autosave. ???
- Tutustutaan seuraavissa harjoituksissa muutettavaan legacy-koodiin.
Harjoitus 6: Legacy Code. SOLID Principles.
Kotitehtävä:
- Kirjoita testejä annetulle ??? legacy-koodille (esim. jokin ohtu-projekti? koodirivilaskurin irrottaminen Sorsastus 0.6:sta?), niin että siihen olisi helpompi toteuttaa tietty ??? toiminto. (Pointti: on vaikeampaa kirjoittaa testejä jälkikäteen ja vieraan koodin muuttaminen ilman testejä on vaikeaa.)
- Lue kaikkien SOLID-periaatteiden artikkelit. Miten kukin niistä vaikuttaa ohjelman rakenteeseen? Mitä ongelmia niiden laiminlyönti voi aiheuttaa?
- Käy antamassa kurssipalautetta.
Harjoitustilaisuudessa: