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ää.
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!
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ä!
Luokkien hahmottelu
Toiminnan hahmottelu
<niksu@iki.fi>