TIEP111 Ohjelmointi 2 (kesä 2006)
Harjoitustyöohje

Kuten huomaatte, tämä on käytännössä sama ohje, jota kurssilla on viime aikoina käytetty. Seuraavaksi tarkistan tekniset harkanpalautusohjeet kesää varten. Tuskin niissäkään on kovin paljon muutosta edellisiin. Haluan pitää henkilökohtaisen ohjaustuokion ainakin vaiheen 4 kohdalla (tietorakennesuunnitelma) ja sitten kun alkaa olla valmista. Lisäksi SUOSITTELEN käyntiä AINA, kun on yhtään jotakin epäselvyyksiä. Aikoja tulee olemaan varattavissa aina ennen ja jälkeen luentojen sekä maanantai-iltapäivisin. Muistuttaisin, että harkkaa voi työstää myös perjantaisissa pääteohjauksissa. -- Paavo.

Mikä harjoitustyö on?

Harjoitustyö ei ole työnäyte!

Harjoitustyö on oppimistilaisuus, jossa opiskelija yrittää omaamansa tiedon pohjalta tehdä jotakin. Tätä yritystä näytetään työn ohjaajalle, joka sitten tutkii mikä työssä on oikein ja mikä väärin, huonosti tai kömpelösti toteutettu. Näin jo opiskelun alkuvaiheessa päästään korjaamaan vääriä tottumuksia, joita jälkeenpäin piintyneinä tapoina voi olla mahdoton muuttaa.

Tämän takia harjoitustyötä pitää käydä esittämässä ohjaajille riittävän usein. Punakynämerkintä ei ole häpeä, vaan osoitus siitä, mitä pitäisi pohtia uudelleen (ja osoitus siitä, että ohjaaja on kiinnostunut opiskelijan työstä!).

Kirjoita heti oikealla tyylillä! Kun kirjoitat harjoitustyötä, käytä heti oikeaoppista sisennystä, muuttujien nimien valintaa yms. On liian aikaa vievää ensin kirjoittaa jonkinlainen sotku ja työn loppuvaiheessa käyttää 10 tuntia tyylin muuttamiseen. Kun oikean tyylin oppii, on sillä aivan yhtä nopea kirjoittaa kuin suttutyylilläkin.

Harjoitustyö on hyvä tehdä ryhmätyönä. Ryhmäläisillä voi olla kaikilla joko sama aihe jota he tekevät yhdessä tai sitten kullakin oma aihe, jota yhdessä voidaan työstää. Esimerkiksi yhden tekemät aliohjelmat kelpaavat muillekin, yksi ymmärtää ja selostaa muille. Kaikki voivat testata toistensa suunnitelmia ristiin.

Erillisissä töissä on se etu, että jonkin ryhmäläisen lopettaessa voidaan työ saattaa yksin loppuun.

Aihe keksitään itse

Opiskelijan kannalta on tietysti motivoivampaa valita itse aiheensa, josta haluaa tehdä ohjelman. Aihe voi olla esimerkiksi opettajilla jokin opetusohjelma, urheilijoilla jokin pistelasku tai päiväkirja, koti-isillä reseptivarasto jne.

Ehdotettua aihetta voidaan sitten ohjaajien kanssa muokata vastaamaan tasoltaan kurssin vaatimuksia.

Tavoitteena on ensin saada itseä miellyttävä aihe, jonka käyttötarpeen, toiminnan ja hyödyllisyyden ymmärtää. Tämän jälkeen aihe kiinnitetään ja ruvetaan harjoittelemaan ohjelman suunnittelua ja ohjelmointia tähän aiheeseen.

Vaatimukset

Harjoitustyössä pitäisi saada harjoiteltua seuraavat asiat:

Siis aihe tulisi valita siten, että siinä käsiteltävä aineisto pitäisi ohjelman käyttökertojen välillä tallettaa tiedostoon. Aineiston tarpeen pitäisi olla niin suuri, ettei sille välttämättä osata sanoa ennakolta tarkkaa ylärajaa. Tyypillisiä tällaisia ohjelmia ovat erilaiset rekisteriohjelmat, esim. mallina oleva kerhon jäsenrekisteri.

Mitä pitää pohtia harjoitustyötä tehdessä

Ohjelman helppokäyttöisyys ja loogisuus

Ohjelman tulisi olla sellainen, että sitä osaa käyttää kuka tahansa. Ammattimaisempaan käyttöön tehty ohjelma voi sisältää vähemmän ohjeita kuin yleiseen käyttöön tehty ohjelma.

Kuka käyttää ohjelmaa

Harjoitustyön tehtävän määritys on varsin epämääräinen. Jotta aiheesta saa järkevän, kannattaa ennen muuta jäsentämistä pohtia sitä, missä vastaavalla ohjelmalla olisi käyttöä.

Esimerkiksi olkoon tehtävänä tehdä ohjelma, jolla voidaan tutkia elokuvateatterin kävijöiden ikä ja sukupuolijakaumaa.

Missä tällaisella ohjelmalla olisi käyttöä? Tietysti elokuvateatterin johto voisi tämän perusteella valita mitä teatterissa kannattaa esittää ja milloin näytöksiä pidetään.

Mistä tiedot saadaan? Tiedot voitaisiin saada suoraan ovelta kävijöiden mennessä teatteriin. Mikro olisi ovella ja jokainen kävijä näppäilisi kysytyt tiedot koneeseen. Tällöin tämän osan ohjelmasta tulisi olla todella idioottivarman. Kun kaikki ovat menneet sisälle, kävisi teatterin johto jollakin salasanalla lopettamassa syötön ja ottaisi tarvitsemansa analyysin sekä tallettaisi tulokset tiedostoon myöhempää käyttöä varten! Tulevaisuudessa käyttäjän näppäily voitaisiin korvata vaikka siten, että ohjelma hakee ohimenevän henkilön kännykästä Bluetooth-yhteydellä tarvittavat tiedot.

Yleisyys ja muutettavuus

Esimerkiksi tehtävänä naisten telinevoimistelun pistelasku. Telineet, niiden nimet ja niiden määrä täytyy olla jälkeenpäin helposti muutettavissa, koska tuskinpa muuten ohjelmassa on isoa ero siinä lasketaanko miesten vai naisten kilpailua.

Ohjaukset

Harjoitustyön ohjausta annetaan mielihyvin kaikille niille, jotka tulevat apua ja/tai ohjausta pyytämään.

Ohjaukseen tulee varata aika (Korpista) vähintään päivää ennen ohjausaikaa. Jos et pääse paikalle varaamanasi ohjausaikana, peru se (jos Korppi ei anna perua aikaa, peru aika lähettämällä ohjaajalle sähköpostia). Vapaina aikoina saa toki käydä katsomassa, josko ohjaukseen pääsisi.

Ohjaukseen tultaessa pitää olla varustautunut seuraavasti:

Kaikki edellämainittu kaivetaan esiin jo ennen ohjaajan huoneeseen astumista; ei ole ystävällistä kaivaa kassiaan 5 minuuttia ohjausajasta ja näin viedä muiden ohjattavien aikaa

Ohjauksessa:

  1. ei ole mitään pelättävää
  2. esitettävä kritiikki ja korjausehdotukset on tarkoitettu positiivikseksi opetukseksi
  3. kirjoitetaan muistiin oma-aloitteisesti ohjaajan esittämät muutokset

Kirjoitustyyli ja kommentointi

Harjoitustyö kirjoitetaan ja kommentoidaan samaan tyyliin kuin monisteen loppuosassa esitetyt esimerkkiohjelmat. Myös muut selkeät ja perustellut tyylit käyvät. Erityisesti harjoitustyöstä tarkastetaan

Harjoitustyön vaiheet

Harjoitustyö tehdään aikataulun ( http://www.mit.jyu.fi/vesal/kurssit/ohjelmointi2006/htohje.html) mukaan.

Ohjelman koodin kehityksen vaiheet näet n:\kurssit\ohj2\kerho

1. Esisuunnitelma

Katso luentomonisteen luku 2 ja luku 3.

Harjoitustyön 1. vaihe on esisuunnitelma. Tässä vaiheessa on tarkoitus tutkia tehtävän määritys tarkemmin ja yrittää määritellä siitä minkälainen ohjelman tulisi olla. Tässä tehdään monisteen Kerho-ohjelman mallin mukainen (tai parempi) suunnitelma siitä mitä ohjelma tekee.

Erityisesti kirjoitetaan kaikki ne kohdat, joita näyttöön tulostuu, mitä käyttäjä vastaa ja miten ohjelman tulisi eri vastauksiin reagoida! Siis

Anna hetu >111375-111A[RET]
Henkilötunnuksessa päivämäärä väärin!
Anna hetu >

ei missään tapauksessa pelkkiä koneen tekemisiä:

Anna hetu >                                VÄÄRIN TEHTY!
Henkilötunnuksessa päivämäärä väärin!
Anna hetu >

Jo tämä vaihe kannattaa kirjoittaa jollakin tekstieditorilla (ei Wordilla tai ainakin talletus on saatava muotoon, joka näkyy WWW:ssä ilman Wordin apua), jolloin sitä on helppo korjailla ohjaajien toivomusten mukaisesti. Myös se mitä tiedostoon talletetaan ja minkä näköisenä, tulisi esittää (tässä voi auttaa ER-kaavion tekeminen, jos sen on esimerkiksi jollakin toisella kurssilla oppinut)!

Koska Kerho-ohjelma jaetaan kurssilla mallina, saattaa ohjaaja tehdä suunnitelmaan muutoksia tai lisäyksiä, jottei työ synny pelkästään vaihtamalla malliohjelmassa sanoja Kerho sanoiksi Kauppa ja sanoja Jäsen sanoiksi Tuote.

Vaikka hieno näytönkäsittely yms. kuuluvatkin oikeaan ohjelmaan, kannattaa työmäärän vähentämiseksi (ja ohjelman pitämiseksi standardin mukaisena) tyytyä Kerho-ohjelman tyyliseen keskustelevaan kyselyyn. Kuitenkin aina kun mahdollista, kannattaa käyttäjälle ehdottaa jotakin oletusvastausta, jonka hän voi hyväksyä pelkällä RET-näppäimen painamisella.

Jos joku haluaa oikeata näytön käsittelyä, saa myös käyttää Javan AWT tai Swing-kirjastoja. Joka tapauksessa käyttöliittymä kannattaa ohjelmointivaiheessa eristää muusta koodista, jotta käyttöliittymän vaihtaminen olisi helpompaa (vrt. kerho -malliohjelmat).

Katso myös http://www.ad.jyu.fi/users/v/vesal/ohj2/

2. Käyttöohje tai suunnitelma

Katso luentomonisteen luku 2 ja luku 3.

Ohjaajan ehdottamat muutokset on tehty suunnitelmaan ja suunnitelma on puhtaaksikirjoitettu. Jatkossa ohjelmaa kehitetään tämän suunnitelman pohjalta.

Tietysti mikäli myöhemmin keksii selviä parannuksia, niin näitä voidaan suunnitelmaan tehdä. Parannukset on kuitenkin hyväksytettävä ohjaajalla.

3. Ohjelman käyttöliittymä

Katso luentomonisteen luku 2 ja luku 3.

Tässä vaiheessa toteutetaan ohjelman käyttöliittymä. Esimerkiksi jos ohjelma on menupohjainen, toteutetaan päämenu ja kaikki alimenut. Mitään varsinaista toiminnallisuutta ei tarvitse olla.

Huomattakoon, että ohjelma pitää olla aina kommentoitu. Erityisesti kukin tarvittava .java-tiedosto pitää varustaa tekijöiden nimillä ja teko- sekä muutospäivämäärillä!

Vaihetta vastaa esimerkkiohjelman hakemisto n:\kurssit\ohj2\kerho\menut_3.

4. Tietorakenteet ja luokat I

Katso luentomonisteen luku 11 ja luku 12.

Ohjelman jatkokehittelyn kannalta on välttämätöntä kiinnittää ainakin jonkinlainen osa ohjelman tarvitsemista tietorakenteista. Tietorakenteista piirretään aluksi kuvat ja ne hyväksytetään ohjaajalla.

Tietorakenteiden ei välttämättä tarvitse olla samanlaiset kuin Kerho-ohjelmassa, mutta useisiin harjoitustöihin tämä rakenne käy lähes sellaisenaan tai pienin muutoksin.

Samalla suunnitellaan ohjelman luokkajako. Luokkajako kirjoitetaan CRC-korteille tai piirretään UML-luokkakaavioksi, jotka näytetään ohjaajalle.

Katso myös http://www.ad.jyu.fi/users/v/vesal/ohj2/

Tämä vaihe kannattaa tehdä kunnolla ja ajatuksella! Aiemmilla kursseilla on havaittu, että jos tämän vaiheen tekee huolimattomasti, seuraava vaihe on yleensä yhtä vaikeuksien kanssa painimista.

5. Tietorakenteet ja luokat II

Katso luentomonisteen luku 15 ja luku 16.

Seuraavaksi toteutetaan vaiheessa 4 suunnitellut tietorakenteet ja luokat. Toteutetaan yksittäisiä tiedonpaloja hallinnoivat luokat (vrt. Kerho-ohjelman Jasen) ja testataan ne.

Tässä vaiheessa tulee jokainen luokka olla omassa Java-tiedostossaan. Ohjelman täytyy olla hyvin kommentoitu: jokaisen luokan ja metodin tarkoitus ja käyttö tulee olla hyvin dokumentoitu kommenteissa.

Viimeistään tässä vaiheessa (ja myöhemmissäkin) ohjaajat tenttaavat suullisesti tekijän ymmärtävän jokaisen ohjelmaansa kirjoittaman lauseen merkityksen (oma listaus saa olla mukana ja siinähän täytyy olla kommentteja).

Esimerkiksi Jasen-luokan toteutus kirjoitetaan Jasen.java-tiedostoon. Toteutustiedostoon tehdään pieni testiohjelma, jolla luokan toimivuus voidaan testata. seuraavaksi toteutetaan säiliöluokat (vrt. Kerho-ohjelman Jasenet) ja testataan ne. Esimerkissä Jasenet.java. Tietysti esimerkissä myös vastaavat harrastuksiin liittyvät luokat. Lopuksi vielä luokat yhteen rajapintaa kapseloiva Kerho.java. Ainakin yksi tietorakenne pitää toteuttaa itse (vrt. Jasenet) ja ainakin yksi käyttäen Javan valmiita luokkia (vrt. Harrastukset).

Vaihetta vastaa esimerkkiohjelman hakemistot n:\kurssit\ohj2\kerho\raken_5 (puuttuu harrastukset) ja n:\kurssit\ohj2\kerho\yhteis_51 (on jo "liikaakin" Naytto-luokassa oleva yhteistyö).

6. Tiedostonkäsittely ja luokkien välinen yhteistyö

Tästä eteenpäin linkit monisteeseen ovat vinossa; selvittelen, onko noita jo olemassa Java-versioina, vai mennäänkö C++ -monisteen mukaan. Joka tapauksessa luvut ovat jossain muodossa olemassa netissä, ja jaan niitä paperikopioina myös.

Tässä vaiheessa Kerho-ohjelman tapauksessa ohjelma osaa tulostaa jäsenet kunkin harrastusten kanssa, jäsenen lisäyksessä kysytään ja tallennetaan myös harrastukset.

Vaihe kannattaa aloittaa tekemällä esimerkin n:\kurssit\ohj2\kerho\yhteis_51 mukainen luokkien välinen "yhteistyö" käyttöliittymäluokkaan.

Seuraavaksi toteutetaan tiedostonkäsittely. Katso luentomonisteen luku 17 ja luku 19.

Ohjelma on paras rakentaa niin, että ohjelman käynnistyessä luetaan mahdollisesti olemassaolevasta tiedostosta tiedot ja sammutettaessa ne tallennetaan. Lienee helpointa toteuttaa ensin tiedostosta lukeminen ja testata se, ja sitten vasta tiedostoon tallentaminen ja testata se (tai päinvastoin).

Viimeistään tässä vaiheessa kootaan lisäksi käyttöliittymä ja erilliset tietorakenteet toimivaksi, yhtenäiseksi ohjelmaksi.

Vaihetta vastaa esimerkkiohjelman hakemistot n:\kurssit\ohj2\kerho\talletus_6.

7. Toimiva ohjelma

Katso luentomonisteen luku 20, luku 21 ja luku 22.

Nyt ohjelmaan täydennetään alkuperäisen suunnitelman mukaisia toimintoja pala kerrallaan koko ajan testaten. Näin saadaan lopuksi aikaan valmis ja toimiva ohjelma.

Harjoitustyössä ei välttämättä kaikkien alavalintojen tarvitse toimia, kunhan opiskelija on käynyt kaikki oleelliset ohjelmointiin ja käytettyyn kieleen liittyvät asiat läpi. Ohjaajan kanssa on sovittu edellisen vaiheen hyväksymisen yhteydessä mitkä kohdat ohjelmasta voidaan jättää toteuttamatta.

Toivottavaa olisi, että vähintään jokin yksinkertainen etsiminen (haku) toimisi. Samoin lajittelu esimerkiksi Javan valmiita algoritmeja käyttäen.

Pääosin harjoitustyön tulee tasoltaan vastata luentomonisteen malliohjelmana olevaa kerhon jäsenrekisteriä ja sen tulee toimia alkuperäisen suunnitelman mukaisesti!

Tässäkään vaiheessa tuskin kannattaa matkia sokeasti kurssin malliohjelman toteutuksia, koska jokainen ohjelmassa oleva rivi pitää pystyä perustelemaan ohjaajalle

Vaihetta vastaa esimerkkiohjelman hakemistot n:\kurssit\ohj2\kerho\lukemine_71, n:\kurssit\ohj2\kerho\tarkistu_72 ja n:\kurssit\ohj2\kerho\etsilaj_73.