Luokkahierarkioiden mallintaminen¶
Ohjelmien monimutkaistuessa niiden suunnittelemiseen tarvitaan enemmän tukea. On entistä tärkeämpää voida hahmottaa ohjelman rakennetta ja toimintaa sekä osina että kokonaisuutena. Unified Modelling Language (UML) on tähän käyttöön tarkoitettu, standardoitu graafinen oliokeskeisen suunnittelun mallinnuskieli. UML on ehkä tunnetuin käytetty kuvausnotaatio, joten sen peruspiirteet on hyvä tuntea. Käytännön työssä usein käytetään varsin vapaamuotoisia tapoja kuvata ohjelman rakennetta. Tyypillisesti nämäkin kuitenkin pohjaavat johonkin UML:n kaaviotyyppiin ja piirtelyä helpottaa ymmärrys yleisistä ohjelman toiminnan hahmottelutavoista. On myös hyvä muistaa, ettei UML tai muukaan kuvaus, ota kantaa siihen, millainen on hyvä ohjelman rakenne tai rajapinta. Kyseessä on vain tapa kuvata ohjelman rakennetta ja ajoaikaista käyttäytymistä tavalla, jota kaikki ymmärtävät.
UML:n kaaviotyypit voidaan jakaa kahteen perustyyppiin: rakennekaavioihin ja käyttäytymiskaavioihin. Rakennekaaviot kuvaavat ohjelman pysyvää (staattista) perusrakennetta eli luokkien, rajapintojen ja olioiden välisiä suhteita. Käyttäytymiskaaviot puolestaan havainnollistavat ohjelman ajoaikaista (dynaamista) käyttäytymistä.
Rakennekaaviot¶
UML:ssä luokat, niistä luodut oliot ja rajapinnat kuvataan laatikoilla.
Luokasta laatikon sisällä annetaan sen attribuutit, julkisen rajapinnan palvelut ja kuvaus luokan vastuista, jokainen omassa lokerossaan.
Olio kuvataan muuten luokkaa vastaavasti, mutta sille annetaan laatikon yläosassa myös identiteetti (eli nimi) olion luokan lisäksi. Samoin attribuuteille voidaan merkitä arvot näkyviin.
Kun toiminnallinen yksikkö halutaan kuvata puhtaasti julkisena rajapintana, se tehdään lisäämällä laatikkoon sana <<interface>>
.
Abstrakti kantaluokka ja ne rajapinnan metodit, joille luokka ei tarjoa toteutusta, voidaan merkitä {abstract}
.
![kuva UML:n luokkaa, oliota, rajapintaa ja toteutusluokkaa kuvaavista laatikoista](https://plus.tuni.fi/graderS/static/compcs140-s2022/_images/UML_classdiagram1.png)
Luokka, Olio, Rajapinta ja Luokan toteutus UML-kaaviona¶
Suunnittelutyön alussa kaavion ei tulisi ottaa kantaa toteutukseen liittyviin asioihin. UML mahdollistaa kuitenkin myös näkyvyysmääreiden esittämisen osana luokan rakennetta.
Näkyvyys |
Merkintätapa |
---|---|
|
|
|
# |
|
|
|
~ |
Luokkakaaviossa myös luokkien väliset yhteydet pitää merkitä. Tämä tehdään merkitsemällä luokkien välille assosiaatioita viivoin ja nuolin, jotka kuvaavat yhteyden tyyppiä.
Riippuvuus: yksisuuntainen yhteys, joka vain kertoo, että luokka (A) riippuu toisesta luokasta (B). Se, että A tarvitsee luokan B oliota johonkin toiminnassa, merkitään katkoviivanuolella, joka osoittaa A:sta B:hen.
Assosiaatio: kuvaa luokkien erilaisia suhteita toisiinsa. Yksinkertaisin assosiaatio on viiva luokkien välillä. Assosiaatioon liitetään usein erilaista tietoa yhteyden laadusta (tekstikuvausta tai lukumäärätietoa). Yksisuuntaisessa assosiaatiossa vain toinen luokista tietää assosiaatiosta. Assosiaatio voi olla myös muodostumis- tai koostumissuhde.
Muodostuminen: Muodostumissuhde merkitään täytetyllä vinoneliöllä ja siinä olioiden elinkaaret ovat tiukasti sidoksissa toisiinsa. Kun olio tuhoutuu, myös sen muodostavat oliot tuhoutuvat.
Koostuminen: Koostumissuhde merkitään tyhjällä vinoneliollä. Koostuminen eroaa muodostumisesta siinä, ettei olioiden elinkaaret ole niin tiukasti sidoksissa toisiinsa: tuhoutuva olio ei välttämättä tuhoa koosteolioitaan.
Periytyminen: Periytyminen esitetään kolmiopäisellä nuolella, joka osoittaa kantaluokkaan.
Toteuttaminen: Rajapinnan toteutussuhde merkitään katkoviivaisella kolmiopäisellä nuolella, joka osoittaa kohti toteutettavaa rajapintaa. Myös viivamuoto, jossa rajapinnan laatikko on korvattu pelkällä rajapinnan nimellä ja kolmio pienellä ympyrällä, on mahdollinen.
![kuva UML:n yhteystyypeistä](https://plus.tuni.fi/graderS/static/compcs140-s2022/_images/connections.png)
UML:n erilaisten yhteystyyppien esittämistavat luokkakaaviossa¶
Suorituksen kuvaaminen¶
Ohjelman suoritusta kuvaavia kaavioita ovat mm. sekvenssikaavio, käyttötapauskaavio ja tilakaavio. Käyttötapauskaavio kuvaa käyttäjän vuorovaikutustapoja ohjelman kanssa. Niissä käyttäjä (eli aktori) kuvataan tikku-ukkona ja itse käyttötapaukset ovaaleina tai ympyröinä. Sekvenssikaavio eli tapahtumasekvenssi kuvaa sitä, miten ohjelmassa oliot kutsuvat toistensa palveluita. Kaaviossa pystyviivoin esitetään olioiden rajapintoja ja näiden välillä tapahtuvia funktiokutsuja nuolin. Sekvenssissä aika kulkee kaaviossa ylhäältä alas.
![kuva sekvenssikaaviosta](https://plus.tuni.fi/graderS/static/compcs140-s2022/_images/runner_sekvenssi.png)
Esimerkki erään korttipeliohjelman sekvenssikaaviosta¶
Tilakaaviossa kuvataan ohjelman toiminnallisia tiloja ja niiden välisiä siirtymiä. Tilakaaviossa suoritus alkaa aika alkutilasta, jota kuvataan mustalla umpinaisella ympyrällä ja päättyy yhteen tai useampaan lopputilaan, joita kuvataan mustilla umpinaisilla ympyröillä, joiden ympärillä on ympyrä.