Luokkakaavio

**Luokkakaavio** on UML-mallinnuksessa käytettävä kaavio. Sen avulla kuvataan olio-ohjelmointikielien luokkia. Luokat vastaavat tietoja, niiden ominaisuuksia (attribuutteja) sekä tietoon kohdistuvia toimenpiteitä. Luokkakaaviossa luokkia yhdistää assosiaatiot. Assosiaatioissa voi olla yhden suhde yhteen, yhden suhde moneen, monen suhde moneen -yhteyksiä. Voi olla myös nollan suhteita, joka tarkoittaa, että toisen luokan ilmentymää ei ole.

Luokkakaavioissa voi olla periytymissuhteita. Periytymiskaaviot auttavat ohjelmoijaa valitsemaan sopivan luokan ja sen metodin tehtävään. Luokkakaavio auttaa myös hahmottamaan missä johdetuissa luokissa metodi näkyy. Kirjastoja ovat mm. Microsoftin MFC, Sun Javan JDK SDK Api.

Luokkakaaviossa luokat esitetään laatikoina, jotka jakautuvat kolmeen osaan. Ylin osa sisältää luokan nimen, keskimmäinen osa luokan attribuutit ja alin osa luokan metodit. Attribuuttien ja metodien edessä on näkyvyysmääreen symboli ja perään on merkattu minkä tyyppistä dataa attribuutti tai metodi ottaa vastaan tai palauttaa.

Ohjelmointiympäristö voi osata luoda luokkakaaviosta ohjelmointikielen mukaista ohjelmakoodia. Koodi on runko luokasta, attribuuteista ja toiminnoista (metodit). Metodeihin tulee automaattisesti parametrit. Tämä nopeuttaa ohjelmointia kun rutiinitoimenpiteet syntyvät automaattisesti.

## Jäsenet
UML tarjoaa mekanismeja luokan jäsenten, kuten attribuuttien ja metodien esittämiseen, sekä lisätietoa niistä kuten rakentajista.

### Näkyvyys
Luokan jäsenen (mikä tahansa attribuutti tai metodi) näkyvyyden määrittämiseksi nämä merkinnät on sijoitettava jäsenen nimen eteen:

`+`    Julkinen (Public) Määrittää jäsenen olevan käytettävissä kaikkialla ohjelmistossa

`-`    Yksityinen (Private) Määrittää jäsenen olevan käytettävissä vain luokan sisällä

`#`    Suojattu (Protected) Määrittää jäsenen olevan käytettävissä kaikille samassa paketissa oleville luokille ja kaikille luokasta periytyville aliluokille    

`~`    Paketti (Package) Määrittää jäsenen olevan käytettävissä kaikille samassa paketissa oleville luokille

Johdettu ominaisuus on ominaisuus, jonka arvo (tai arvot) tuotetaan tai lasketaan muista tiedoista, esimerkiksi käyttämällä muiden ominaisuuksien arvoja.

Johdettu ominaisuus esitetään siten, että sen nimen edessä on kauttaviiva ”/”.

### Näkyvyysalue
UML määrittelee jäsenille kahdentyyppisiä näkyvyysalueita: ilmentymä ja luokka, ja jälkimmäiset esitetään alleviivatuilla nimillä.

* Ilmentymäjäsenet on rajattu tiettyyn ilmentymään.
** Attribuuttien arvot voivat vaihdella ilmentymien välillä.
** Metodin kutsuminen voi vaikuttaa ilmentymän tilaan (eli muuttaa ilmentymän attribuutteja).
* Luokan jäsenet tunnetaan yleensä ”staattisina” monissa ohjelmointikielissä.
** Attribuuttien arvot ovat samat kaikissa ilmentymissä.
** Metodin kutsuminen ei vaikuta luokittelijan tilaan.

Jäsenen luokittelualueen osoittamiseksi sen nimi on alleviivattava. Muussa tapauksessa näkyvyysalue asetetaan oletuksena.

## Luokkien väliset suhteet
Luokkien välisiä suhteita ja yhteyksiä kuvataan luokkakaavioissa erilaisilla nuolilla ja viivoilla.

### Assosiaatio (association)
Assosiaatio kuvaa luokkien välisiä yhteyksiä. Luokasta määritetään assosiaatio, jos luokka esimerkiksi omistaa tai kontrolloi muita jäseniä luokkakaaviosta tai muulla tavalla liittyy toiseen luokkaan. Assosiaatio voi olla yksi- tai kaksisuuntainen. Assosiaatiota kuvataan esimerkiksi viivalla tai tavallisella nuolella.

### Aggregaatio (aggregation)
Aggregaatiolla tuodaan esiin luokan koostuminen muista luokista ja se kuvaa luokkien välisiä omistussuhteita. Aggregaatio on erikoistunut assosiaatio. Aggregaatiota kuvataan luokkakaaviossa nuolella, jonka päässä on tyhjä vinoneliö. Aggregaatiksi nimitetään sitä luokkaa, johon aggregaattinuoli osoittaa. Aggregaatti omistaa nuolen toisessa päässä olevan luokan. Aggregaatin tuhoutuessa sen osat eivät yleensä tuhoudu.

### Kooste (composition)
Kooste tarkoittaa vahvaa aggregaatiota, jossa aggregaatin tuhoutuessa myös kaikki sen osat tuhoutuvat. Koostetta kuvataan nuolella, jonka päässä on täytetty vinoneliö.

### Yleistys (generalization) ja periytyminen (inheritance)
Yleistyksellä kuvataan luokkien välistä periytymistä. Luokkakaaviossa periytymistä kuvataan nuolella, jonka päässä on kolmio. Lapsiluokka periytyy kantaluokasta, joka sijaitsee nuolen päässä. Lapsiluokka perii kantaluokan ominaisuudet ja toiminnot, ja kykenee muokkaamaan tai korvaamaan niitä. Myös kokonaan uusien ominaisuuksien ja toimintojen lisääminen on mahdollista. Lapsiluokkaa pidetään kantaluokan erikoistuneena muotona, ja kantaluokkaa pidetään yleistyksenä lapsiluokasta. Käytännössä siis jokainen lapsiluokan ilmentymä on myös kantaluokan ilmentymä.

Muita kantaluokasta käytettyjä nimiä ovat muun muassa *isäluokka*, *emoluokka*, *yläluokka* ja *yliluokka*.

Lapsiluokasta puolestaan käytetään joskus nimiä *alaluokka*, *aliluokka* ja *jälkeläisluokka*.

Esimerkki tämänkaltaisista yleistyksistä löytyy tieteellisestä luokittelusta: ihminen on apinoiden alaluokka, joka puolestaan on nisäkkäiden alaluokka ja niin edelleen. Suhde on helpoin ymmärtää lauseen ”A on B” avulla (ihminen on nisäkäs, nisäkäs on eläin).
### Riippuvuus (dependency)
Riippuvuus on tyyppi assosiaatiosta, joka kertoo, että luokat liittyvät toisiinsa. Riippuvuutta kuvataan katkoviivanuolella. Riippuvuusnuolen päässä oleva luokka pystyy aiheuttamaan muutoksia nuolen toisessa päässä olevaan luokkaan. Riippuvuus on yksisuuntainen.

### Implementaatio (implementation)
Implementaatio kuvaa luokkien välistä toteutussuhdetta, joka osoittaa luokan toteuttavan implementaationuolen päässä olevan rajapinnan tarjoamat toiminnot. Implementaatiota kuvataan katkoviivalla, jonka päässä on kolmio.

### Moniarvoisuusmääreet (multiplicity)
Luokkien välisiä suhteita kuvaavien viivojen päihin voidaan myös laittaa näkyviin moniarvoisuusmääreet. Luvut tulevat viivan molempiin päihin ja ne kuvaavat moniko luokan ilmentymä yhteyteen liittyy. Moniarvoisuus määreet on kuvattu alla olevassa taulukossa.