HY / TKTL / 58160-8 Ohjelmoinnin harjoitustyö / Sami Nikander
Copyright © 1998 Sami Nikander, <niksu@iki.fi>. Tämän oppimateriaalin käyttö on sallittu vain yksityishenkilöille opiskelutarkoituksissa. Materiaalin käyttö muihin tarkoituksiin, kuten kaupallisilla tai muilla kursseilla, on kielletty.
12.10.98

Oliosuunnitelma

Työohje Ohjelmoinnin harjoitustyöhön

Yleistä

Kehitä tehtävänannosta alustava oliomalli! Tässä voi käyttää jotain "puolivirallista" olioiden suunnittelumenetelmää, tai jotain vähemmän formaalia tapaa. Jokin yleisesti tunnettu kuvaustapa, esimerkiksi OMT-kuvaus, on sikäli hyvä, että silloin sinun ei tarvitse kuluttaa aikaa pyörän keksimiseen uudestaan (= omien oliomerkintöjen ja kuvaustapojen keksimiseen)! Valmiin kuvaustavan sijaan voit käyttää omaakin tapaasi, mutta joka tapauksessa kuvauksesta tulee käydä ilmi olioiden ominaisuudet, suhteet ja metodikutsut.

OMT-menetelmästä on saatavilla paljon ohjeita ja se on useimpien ohjaajien tuntema (joten ohjaaja ymmärtää suunnitelmiasi paljon helpommin kuin itse keksimilläsi merkinnöillä). OMT-merkintätapaan tutustutaan pintapuolisesti mm. approbatur-kurssilla Informaatiojärjestelmät. Lisäksi on olemassa ohjelmia (esim. Mermaid ja KISS), joilla kaavioita voi näppärästi piirtää ja päivittää. Suunnitelmien päivittäminen on tarpeen yleensä useita kertoja, joten samojen kuvien teko yhä uudelleen ja uudelleen jollain tavanomaisella piirto-ohjelmalla tai käsin voi alkaa turhauttaa ennen pitkää.

Ensimmäinen suunnitelma on alustava, mutta sitä täydennetään ja parannellaan jatkuvasti. Ei tarvitse vielä piirtää sitä millään ohjelmistolla tms., ruutupaperi käy hyvin (myös lopulliset kaaviot voi piirtää käsin, kunhan sen tekee huolella). Alustava kaavio muuttuu moneen kertaan, joten sen millintarkkaan viilaamiseen esim. jollain tavallisella piirto-ohjelmalla voi olla aika turhaa työtä. Kannattaa aluksi mielummin käyttää ohjelmoijan uskollisia apulaisia, paperia ja kynää.

Luokkien hahmottelu

Listaa ensin ohjelmassa esiintyvät käsitteet. Käsitteillä on aina loogisia yhteyksiä muihin käsitteisiin, ja näitä yhteyksiä voidaan olio-ohjelmassa esittää eri tavoin. Pitää vain valita, mitkä asiat mallinnetaan luokkina, mitkä luokkien muuttujina ja metodeina. Osalle käsitteistä ei aina löydy luontevaa esitystä oliomaailmassa, jolloin ne voidaan rinnastaa johonkin muuhun asiaan tai ehkä karsia kokonaan pois mallista.

Keksi luokkia ja niiden välisiä yhteyksiä. Mitkä asiat on parasta kuvata luokkina, mille asioille riittää luokan attribuutti (muuttuja), mitä palveluita luokka voisi tarjota (eli mitkä asiat ovat selkeästi luokan omalla vastuulla, ja mitkä hommat on parasta jättää toisten luokkien huoleksi), mitkä oliot vaihtavat keskenään tietoja jne. Jonkinlainen peukalosääntö voisi olla esim. "substantiivit ovat potentiaalisia luokkia, verbit metodeja, adjektiivit ja adverbit attribuutteja"...

Muista, että tähän työvaiheeseen voidaan hyvin palata vaikka useita kertoja. Ei siis tarvitse vielä lyödä lukkoon mitään, vaan tärkeintä on saada aikaan jonkinlainen luokkarakennelma. Jos myöhemmin huomataan, että jokin luokka on ylimääräinen (tarpeeton, sitä ei käytetä mihinkään tai se on selvästi naimisissa jonkin toisen luokan kanssa), tai että jokin luokka on jäänyt puuttumaan, ne voidaan lisätä malliin.

OMT-menetelmässä luokkien suhteista piirretään kaavio. Perinnälle ja koostumukselle/olemassaoloriippuvuudelle on omat merkintänsä, ja muutkin luokkien väliset loogiset kytkennät merkitään näkyviin, esim. erilaiset lukumääräsuhteet (1:1, 1:N, M:N). OMT:ssä on suuri määrä erilaisia merkintöjä, joita kaikkia ei tarvitse opetella. Perusmerkinnät riittävät. Tutustu erilliseen OMT-ohjeeseen!

Toiminnan hahmottelu

Tee sitten muutama kappale dynaamisia malleja, eli ohjelman toimintaa kuvaavia hahmotelmia. Luokkien määrittelyhän ei vielä kerro mitään siitä, missä järjestyksessä luokat kutsuvat toisiensa metodeita ja mitkä luokat ylipäätään käyttävät toistensa palveluita, toisin sanoen oloiden keskinäisestä viestinnästä. Tämä olioiden "juttelu" tai viestintä on olio-ohjelman ehkä tärkein suunnitteluvaihe, ja se määrää suoraan, minkälainen ohjelmasta muodostuu. Kuvauksessa tulisi esitellä kaikki ne erilaiset tilanteet, joita ohjelman kulussa voi tulla. Kuvauksessa näkyy, millä oliolla ohjelman kontrolli kulloinkin on (eli missä metodikutsussa ollaan), mitä olioita tilanteessa kutsutaan, mitä kutsun palatessa tapahtuu jne.

Erityistä huomiota täytyy kiinnittää kontrollin sijaintiin ohjelmassa: olio-ohjelma koostuu alusta loppuun metodikutsuista, eli palvelupyynnöistä, joita oliot lähettelevät toisilleen. Täten kontrolli on vuorollaan aina jollain tietyllä oliolla, ja sen pitäisi myös palata aikanaan palvelupyynnön esittäneelle kutsujalle. Kutsujen ja niistä palaamisen pitää siis esiintyä yleensä aina pareittain! (Poikkeuksiakin on, liittyen esim. Javan säikeisiin eli rinnakkaiseen kontrolliin, ja tapahtumien käsittelyyn, mutta näitä tilanteita ei käsitellä tässä ohjeessa.) Helpoiten saat kutsut ja paluut pidettyä järjestyksessä, kun pidät kirjaa siitä, kuka on kutsuja ja ketä kutsutaan. Usein tilanteisiin liittyy sisäkkäisiä kutsuja, joissa oliot kutsuvat toisiaan "ristiin". Nämä ovat eri asia kuin kaksi peräkkäistä kutsua, ja näissä tulee myös useimmin tulkintavirheitä. Esimerkkikuvassa on havainnollistettu kutsuja ja niistä paluuta (ESIMERKKIKUVA PUUTTUU!).

Tähänkin toimintakuvaukseen voi käyttää erilaisia menetelmiä. OMT-menetelmässä käytettävät skenaariot ovat havainnollinen tapa kuvata olioiden keskinäistä "juttelua" ja ajonaikaisia suhteita. Vaikka et käyttäisikään juuri näitä merkintätapoja, pitää ohjelman toiminnasta pystyä kertomaan nämä samat asiat jollain muulla tavoin! Seuraavat ohjeet pätevät siis kaikkeen toimintojen kuvaukseen.

(Esimerkkikuva skenaariosta puuttuu)

Yhden skenaarion osapuolina ovat "tilanteen" selvittämiseen osallistuvat luokat. Lisäksi on aivan sallittua ja tarpeellista laittaa yhdeksi osapuoleksi myös esim. "käyttäjä", vaikka se ei varsinainen luokka olekaan. Näin saadaan kuvaan mukaan ohjelman kommunikointi ihmisen kanssa (ohjelman syötteet ja tulosteet).

Jos tilanne on monimutkainen, se kannattaa jakaa osiin, eli rakentaa ensin yleiskuvaus, jossa viitataan eri osatoimintoihin ja tarkentaa sitä sitten asteittain. Nyrkkisääntönä voisi olla, että jos skenaariossa esiintyy jokin epämääräinen maininta, joka tuntuu sisältävän paljon "toimintaa" (vaatii todennäköisesti aina juttelua muiden olioiden kanssa) esim. "tarkista tilanne" tai "laske seuraava vaihe", se pitää tarkentaa. Toimintaa ei siis saa piilottaa tällaiseen "mustaan laatikkoon", josta tulos maagisesti putkahtaa esiin, vaan se on esitettävä eri kuvauksessa tarkemmin. Jos näitä tilanteita ei kuvaa riittävän tarkasti, tulee koodauksessa vastaan ongelma: on luotettu siihen, että tieto ilmestyy tyhjästä, ja koodissa pitäisikin saada tieto jotenkin tuotettua.

Skenaarioita pitäisi olla useampia, kaikista realistisista tilanteista ja siten, että ne kattavat ohjelman toiminnot. Yksi skenaario sisältää yhden mahdollisen tilanteen, esim. yhden käyttäjän tekemän toimenpiteen ja siihen reagoinnin. Tarkoitus ei ole tehdä kaikenkattavia kuvauksia kaikista mahdollisista erilaisista poluista ohjelman suorituksen läpi, riittää kun eri tyyppisistä tilanteista on kustakin oma kuvauksensa.

Esimerkki 1: Jos mallinnettavana on vaikkapa shakkipeli, riittää että yhden esimerkkisiirron kulku kuvataan, ei tarvitse erikseen tehdä skenaariota kymmenistä erilaisista siirroista. Tässä olisi ehkä hyvä kuvata tilanne ensin yleisellä tasolla, ja sitten tarkentaa skenaario aliskenaarioihin: osatoimintoja ovat esim. siirrettävän nappulan valinta, kohderuudun valinta, laillisuuden tarkistus, mahdollinen nappulan syönti, shakki- ja matti-tilanteiden tarkastus, tuloskirjanpidon päivittäminen. Lisäksi on tietysti vielä tarpeen kuvata muitakin ohjelman toimintoja, esimerkiksi pelin alustus, mahdollinen pelitilanteen talletus, tms.

Esimerkki 2: Mallinnetaan matematiikan/vieraan kielen tenttausohjelmaa. Tässä voitaisiin tehdä skenaario ainakin yhden kyselykierroksen kulusta (kysymysten arvonta/valinta, vastauksen kysyminen, oikeellisuuden tulkinta, oikean/väärän vastauksen rekisteröinti jne.). Jos kysymysten arvontaan liittyy esimerkiksi vaikeustason nosto tms. toiminnan muuttaminen ajon aikana, se lienee syytä kuvata aliskenaarionaan. Jos ohjelmaan liittyy esim. väärin vastattujen kysymysten uudelleententtausmahdollisuus, myös sen järjestäminen pitää näyttää.

Oliko tehtävänanto sittenkin liian hutera? Voit hyvin palata välillä täydentämään tehtävänmäärittelyä! Ota ohjaajaan yhteyttä, jos työ tuntuu vaikealta. Oliosuunnittelu ei avaudu yhdessä silmänräpäyksessä!



<niksu@iki.fi>