582334 TDD-ohjelmointimenetelmä ja koodin suunnittelu (5 op), syksy 2009
582334 TDD programming technique and designing code (5 cr), autumn 2009

Kurssiesittely Luennot Harjoitukset

Harjoitus 1: Tetris #1 (totuttelu). Duplikaation havaitseminen.

Johdanto Tetris-harjoitustyöhön

Pariohjelmointi on hyvä tapa oppia toisilta ohjelmoijilta ja kokemuksien mukaan se soveltuu hyvin myös TDD:n opetteluun. Esimerkiksi ensin TDD:n suhteen kokeneempi kirjoittaa yhden testitapauksen ja hänen parinsa kirjoittaa testin läpäisevän koodin. Näppäimistöä pallotellaan parin kesken ja flow pysyy päällä. Kokeneempi voi neuvoa pariaan refaktoroimaan ja kirjoittamaan hyviä testejä. Kun parista molemmat ovat yhtä taitavia, niin yhdessä he pystyvät tukemaan toisiaan ja kirjoittamaan parempaa koodia kuin yksinään.

Valitettavasti tämän kurssin vetäjillä ei ole riittävän monta persoonallisuutta, jotta pystyisimme pariohjelmoimaan teidän kaikkien kanssa. Tämän vuoksi olemme valmistaneet Tetris-aiheisen harjoitystyön, jossa testitapaukset on annettu valmiina (mutta pois kommentoituna). Tehtävänänne on kirjoittaa koodia, joka läpäisee annetut testit yksi testitapaus kerrallaan. Kun ensimmäinen testi menee läpi, niin ota seuraava testitapaus esiin kommenttien alta ja kirjoita sen läpäisevä koodi (mutta ei yhtään enempää kuin vaaditaan testien läpäisyyn - muista TDD:n kolme sääntöä). Refaktoroi koodia paremmaksi aina, kun testit menevät läpi, jotta seuraavien muutosten tekeminen olisi helpompaa.

Tetris-harjoitustyön testitapaukset tätä ja tulevia harjoitusviikkoja varten voit imeä tästä: tdd-tetris-tutorial.zip

Tai jos käytät Gitiä, niin voit kloonata sen GitHubista: orfjackal/tdd-tetris-tutorial, "tutorial" branch.

Tetris-harjoitustyön vaiheet on numeroitu "Tetris #1", "Tetris #2" jne. Tällä tarkoitetaan toteutuksen olevan niin pitkällä, että seuraavassa listassa olevat testiluokat menevät kyseiseen numeroon asti läpi:

  1. FallingBlocksTest
  2. RotatingPiecesOfBlocksTest
  3. RotatingTetrominoesTest
  4. FallingPiecesTest
  5. MovingAFallingPieceTest
  6. RotatingAFallingPieceTest
  7. Vielä lisää toiminnallisuutta - täsmentyy myöhemmissä harjoituksissa.

Testit läpäisevä koodi on tarkoitettu kirjoitettavaksi juuri yllä mainitussa järjestyksessä, koska myöhemmät testit pohjautuvat aiempien testien määrittelemään toiminnallisuuteen.

Kotitehtävät

max 6 pistettä

  1. Varmista että kehitysympäristösi toimii laitoksen ATK-luokassa. Asennusohjeita on täällä. Sinun pitää pystyä avaamaan yllä mainittu Tetris-harjoitustyö kehitysympäristössäsi ja ajamaan sen JUnit-testit. Suositeltavia kehitysympäristöjä ovat NetBeans, Eclipse ja IntelliJ IDEA (kaupallinen). Sinun pitää asentaa Maven ja varmistaa, että pystyt ajamaan Tetris-harjoitustyön testit komennolla mvn test ja buildaamaan sen komennolla mvn clean package. Jos jotkin testit eivät mene läpi, niin buildauksen saa silti tehtyä komennolla mvn clean package -DskipTests=true. Tämä luo target-kansioon ZIP-tiedoston, jossa on projektin lähdekoodit.

    1 piste: Pystyt ajamaan Tetris-harjoitustyön testit Mavenilla harjoitusryhmäsi käyttämässä tietokoneluokassa.

  2. Havaitse duplikaatiota (code duplication) tästä funktiosta ja mieti miten sitä voisi parantaa. Tulosta kyseinen funktio paperille ja merkitse siitä kynällä kaikki koodi, jonka havaitset toistavan itseään tämän funktion sisällä. Mieti miten voisit vähentää tätä duplikaatiota. Jos jonkin duplikaation pystyy korvaamaan kutsulla uuteen funktioon, niin mikä olisi tämän funktion nimi? (Tässä tehtävässä ei tarvitse ryhtyä muuttamaan itse koodia.)

    P.S. Tämä funktio on peräisin Gun-Tactyx -tekoälyohjelmointipelistä ja on yksi funktioista, joita robottien tekoälyskriptit voivat kutsua (koko tiedosto on täällä).

    1 piste: Löydetty yksi esimerkki duplikoidusta koodista.
    2 pistettä: Löydetty kaksi tai useampi esimerkkiä duplikoidusta koodista.

  3. Tetris #1: Toteuta FallingBlocksTest läpäisevä koodi käyttäen TDD:tä. Testitapaukset on annettu valmiiksi, joten sinun tarvitsee vain poistaa kommentit niistä yksi kerrallaan, sitä mukaa kuin saat kirjoitettua testit läpäisevää tuotantokoodia.

    Kannattaa lukea seuraavat artikkelit TDD:stä, jotta tietäisit TDD:n idean ja osaisit tehdä näiden harjoitusten seuraavan tehtävän. Samat asiat käydään läpi kurssin ensimmäisellä luonnolla, mutta jos haluat aloittaa tehtävien teon hyvissä ajoin tai et pääse luennolle, niin näillä pääset alkuun. Muussa tapauksessa voit kerrata luentojen asiat näistä.

    http://www.butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd
    http://www.butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata (linkki PPT-esitykseen on sivun alussa)
    http://www.agiledata.org/essays/tdd.html (luvut 4 ja 5 voit hypätä yli)
    http://agileinaflash.blogspot.com/2009/03/unclebobs-three-rules-of-tdd.html
    http://agileinaflash.blogspot.com/2009/02/red-green-refactor.html
    http://agileinaflash.blogspot.com/2009/02/first.html

    1 piste: Luokan FallingBlocksTest 10 testistä 3 menee läpi.
    2 pistettä: Luokan FallingBlocksTest 10 testistä 6 menee läpi.
    3 pistettä: Luokan FallingBlocksTest 10 testistä 10 menee läpi.

Harjoitustilaisuudessa varmistetaan, että kehitysympäristö toimii kaikilla, keskustellaan duplikaatiosta ja parikoodataan Tetris #2 lähtien.


Viimeksi muokattu 01.12.2010 21:04 Copyright © 2009 Esko Luontola