previous next Title Contents Index

11. Oliosuunnittelu


Mitä tässä luvussa käsitellään?

* vaatimukset ohjelman toteutukselle

* olioiden etsiminen

* CRC- kortit

* kuka huolehtii harrastuksista?

11.1 Olio on luokan esiintymä

Ennenkuin voimme aloittaa ohjelman toteutuksen, pitää meidän suunnitella mitä luokkia ohjelmassamme tarvitaan. Ohjelmassa olevat oliot ovat sitten näiden luokkien esiintymiä (ilmentymiä, instance).

11.2 Tavoitteet

Asetamme ensin ohjelman toteutukselle ulkoisen toiminnan lisäksi tiettyjä lisätavoitteita:

11.3 Luokat

Tavoitteiden aikaansaamiseksi näyttäisi, että tarvitsemme ohjelmassa ainakin seuraavat kolme luokkaa: Kullekin luokalle täytyy antaa selvät vastuualueet ja tieto siitä, miten kommunikoidaan muiden luokkien kanssa ja minkä luokan kanssa yleensäkään tarvitsee kommunikoida.

11.4 CRC- kortit

Timothy A. Budd [B] ehdottaa luokkasuunnittelun avuksi CRC-kortteja (Class Responsibility Collaborator, luokan vastuu ja avustajat). Kortti on 4"x6" (10 x15 cm) kooltaan ja se jaetaan 3 osaan: luokan nimi, vastuu (eli tehtävät) ja avustajat. Kortin koko on perusteltu sillä, että se on riittävän iso, jotta luokan vastuualueet voidaan siihen kirjoittaa ja toisaalta jos vastuualueet ei mahdu korttiin, on luokka liian iso ja se pitää jakaa useammaksi osaluokaksi. Huomattakoon että luokkaa suunniteltaessa ei juurikaan oteta kantaa siihen, kuka luokkaa käyttää!

Korttien takapuolelle voidaan kirjoittaa luokan yksityiset tiedot, eli ne tiedot joita joudutaan käyttämään jotta luokka voi hoitaa sovitun vastuunsa.

CRC-kortteja on sitten tarkoitus tutkia työryhmän jäsenten kesken antamalla kortti aina yhdelle ryhmän jäsenelle joka näin voi tarkistaa saako hän ko. luokasta tarvitsemansa tiedot (kääntämättä korttia). Jollei saa, luokkia on vielä helppo muuttaa kun ohjelmaa ei ole kirjoitettu.

11.4.1 Jäsen- luokka (cJasen)

Luokan nimi: cJasen
Avustajat:
Vastuualueet:

(- ei tiedä kerhosta, eikä käyttöliittymästä)

- tietää jäsenen kentät (nimi, hetu, puhnro, jne.)

- osaa tarkistaa tietyn kentän oikeellisuuden (syntaksin)

- osaa muuttaa |Ankka Aku|..| - merkkijonon jäsenen tiedoiksi

- osaa antaa merkkijonona i:n kentän tiedot

- osaa laittaa merkkijonon i:neksi kentäksi

- merkkijonot

11.4.2 Kerho- luokka (cKerho)

Luokan nimi: cKerho
Avustajat:
Vastuualueet:

- pitää yllä varsinaista rekisteriä, eli osaa lisätä ja poistaa jäsenen

- lukee ja kirjoittaa kerhon tiedostoon

- osaa etsiä ja lajitella


- cJasen

11.4.3 Käyttöliittymä- luokka (cNaytto)

Luokan nimi: cNaytto
Avustajat:
Vastuualueet:

- hoitaa kaiken näyttöön tulevan tekstin

- hoitaa kaiken tiedon pyytämisen käyttäjältä

(- ei tiedä kerhon eikä jäsenen yksityiskohtia)


- cJasen

- cKerho

11.4.4 Luokkajaon tarkastelua

Miksi näyttö ei saa tietää jäsenen yksityiskohtia? Jos näyttö tietäisi jäsenen yksityiskohdat, pitäisi myös cNaytto-luokkaa muuttaa kun muutetaan jotakin jäsenen yksityiskohtaa, eli esimerkiksi lisätään fax- numero. Käytännössä näytön pitää kuitenkin saada tämä muutos tietoonsa. Miten?

Näyttö voi esimerkiksi aina kysyä jäseneltä montako kenttää tällä on. Samoin näyttö voi pyytää jäsentä antamaan 1. kentän (nimi) merkkijonona, 2. kentän merkkijonona jne. Näin voidaan tulostaa jäsenen tiedot näyttöön tietämättä tarkkaan mitä kenttiä jäsenessä on.

Entä tietojen lukeminen? Näyttö voi myös kysyä jäseneltä sen tekstin, joka täytyy käyttäjälle kirjoittaa, kun pyydetään käyttäjää antamaan 3. kentän tiedot ("Katuosoite"). Tämän jälkeen näyttö voi tulostaa tämän tekstin näyttöön ja jäädä odottamaan käyttäjältä merkkijonoa. Kun käyttäjä antaa merkkijonon, pyydetään jäsentä muuttamaan annettu merkkijono 3:nen kentän tiedoiksi.

Aikanaan saattaa tulla vastaan tilanne, jossa on edullista jakaa näyttöluokka useampaan alaluokkaan, eli esim. yleinen näyttö (cNaytto), kerhon näyttö (cKerhon_naytto) ja jäsenen näyttö (cJasenen_naytto).

Lisäksi yksittäisten kenttien käsittelyä voi auttaa kenttä-luokan käyttö. Peruskenttäluokasta voidaan periä erikoistuneita kenttäluokkia. Tiedon säilyttämisen apuna kerholuokalla voi olla tietorakenne-luokka. Etsiminen voidaan ehkä jättää etsimis- ja selailu -luokan tehtäväksi. Alkuun päästään kuitenkin suunnitelman mukaisella kolmella luokalla.

11.5 Harrastukset mukaan

Entä sitten kun haluamme lisätä kerholaisille harrastuksia. Ainakin tarvitaan cHarrastus- luokka lisää. Kuka huolehtii harrastuksista?

Jos valinta tehdään valitun tiedostomuodon mukaan, niin mahdollisuuksia on:

11.5.1 "Oliomalli"

Oletetaan aluksi että Jäsen huolehtii harrastuksistaan. Tällöin Kerho ei tarvitse mitään muutoksia ja Näyttökin vain sen verran, että tietää kysellä ja tulostaa Jäsenelle tulleita lisäominaisuuksia. Jäsenen ominaisuuksiin lisätään harrastuksien ylläpito vastaavasti kuin Kerho ylläpiti jäsenistöä.

11.5.2 Relaatiomalli

Jos valitaan relaatiomallin mukainen tiedostorakenne, niin ehkä myös luokat kannattaa suunnitella vastaavasti. Tässä mallissa Jäsen ei tiedä mitään harrastuksistaan ja cJasen pysyykin muuttumattomana. cHarrastus tekee täsmälleen samat asiat kuin cJasen, paitsi tietenkin omille ominaisuuksilleen.

Jos mahdollisimman paljon vastuuta harrastusten ylläpidosta annetaan Kerholle, huomataan että toistetaan samat ominaisuudet, joita kirjoitettiin jo jäsenistöä varten. Tämän vuoksi Kerhon roolia kannattaakin hieman selventää siten, että tietorakenteiden ylläpitoa varten tehdään omat luokat ja Kerho komentaa näitä luokkia.

11.5.3 Harrastus- luokka (cHarrastus)

Vertaa toimintaa cJasen- luokan toimintoihin.

11.5.4 Kerho- luokka (cKerho)

Luokan nimi: cKerho
Avustajat:
Vastuualueet:

- huolehtii cJasenet ja cHarrastukset - luokkien välisestä yhteistyöstä ja välittää näitä tietoja pyydettäessä

- lukee ja kirjoittaa kerhon tiedostoon pyytämällä apua avustajiltaan


- cJasenet

- cHarrastukset

11.5.5 Jäsenet- luokka (cJasenet)

Luokan nimi: cJasenet
Avustajat:
Vastuualueet:

- pitää yllä varsinaista jäsenrekisteriä, eli osaa lisätä ja poistaa jäsenen

- lukee ja kirjoittaa jäsenistön tiedostoon

- osaa etsiä ja lajitella


- cJasen

11.5.6 Harrastukset- luokka (cHarrastukset)

Luokan nimi: cHarrastukset
Avustajat:
Vastuualueet:

- pitää yllä varsinaista harrasterekisteriä, eli osaa lisätä ja poistaa harrastuksen

- lukee ja kirjoittaa harrastukset tiedostoon

- osaa etsiä ja lajitella


- cHarrastus

Koska Harrastukset ja Jäsenet ovat täsmälleen samanlaisia lukuunottamatta sitä, mitä alkioita ne käsittelevät, voidaan käytännössä C++:lla ensin tehdä malliluokka, josta generoidaan kumpikin hieman eri versio.

Näin päästään siihen tilanteeseen, jossa myös rinnakkaisten rakenteiden lisääminen Harrastuksille vaatii vain hyvin vähän uutta ohjelmointia.

Huomattakoon, että sekä cJasenet että cHarrastukset ovat pelkkiä abstrakteja tietorakenneluokkia, niiden sisäinen talletustapa voi olla mikä vaan (taulukko, lista, puu) ulkoisen rajapinnan ollessa silti edellisen suunnitelman kaltainen.


previous next Title Contents Index