Peruskäsitteitä: Koostaminen

Perusteellisestakin suunnittelusta huolimatta olio-ohjelmoinnissa tulee vastaan tilanteita, jolloin alkuperäisten luokkien ominaisuudet ja toiminnot ovat puutteellisia.

Luokan laajentaminen onnistuu kolmella tavalla:

check_circle Alkuperäisen luokan muuttaminen
check_circle Perintä, peritään alkuperäisestä luokasta uusi luokka, joka sisältää vanhojen ominaisuuksien lisäksi uudet tarvittavat ominaisuudet
check_circle Koostaminen, jolloin luokka joko käyttää toisen luokan ominaisuuksia ja toimintoja tai luokkaa laajennetaan siten, että se sisältää toisen luokan olion jäsenmuuttujana

Koostaminen

Koostamisessa luokan sisällä käytetään toisen luokan olioita. Koostamiseen liittyy useita olio-ohjelmointiin liittyviä käsitteitä riippuen siitä minkä tasoisesta koostamisesta on kyse.

Alla olevassa esimerkissä on esitetty koostamiseen liittyvät tärkeimmät käsitteet: Assosiation, Aggregation ja Composition.

Assosiation

Toinen luokka "käyttää" toisen luokan olioita.
- opettajalla on henkilökortti tai opettaja käyttää henkilökorttia
- "luokkahuone käyttää opettajia ja oppilaita" ei kuulosta hyvältä mutta "luokkahuoneessa on yksi opettaja ja oppilaita" kuulostaa jo paljon paremmalta

Esimerkki: Assosiation.cs

Aggregation

Toinen luokka "sisältää" toisen luokan olioita.
- luokkahuone sisältää tietokoneita
- osasto sisältää opettajia

Esimerkki: Aggregation.cs

Composition

Toinen luokka "sisältää" toisen luokan olioita, jos käyttävä luokka poistuu, poistuu myös käytetty.
- rakennus sisältää luokkahuoneita
- JAMK sisältää osastoja

Esimerkki: Composition.cs

Hieman esimerkkiä yllä olevasta ohjelmointikoodina

Alla on esitettynä muutama luokka havainnollistamaan luokkarakenteita ja yhteyksiä yllä esitetystä UML-kaaviosta:

Student-luokka periytyy Person-luokasta ja toteuttaa ILearning-rajapinnan


    

Classroom-luokka koostaa sisälleen Student-luokan oliota, Computer-luokan olioita, Teacher-luokan olio sekä sisältää oman RoomNumber-ominaisuuden:



    

Perintä vai koostaminen?

Vaikea valinta
- Yleisesti vertailussa käytetään "is-a"- ja "has-a"-sääntöä
- Jos voidaan ajatella, että LuokkaA on LuokkaB (is-a), niin silloin kannattaa harkita perintää
- Jos taas voidaan ajatella, että Luokassa A on toinen luokka B, niin silloin kannattaa koostaa

Esimerkkejä:
- "Auto on Moottori", ei kuulosta hyvältä -> ei peritä
- "Autossa on Moottori", kuulostaa hyvältä -> koostetaan
- "Opettaja on Henkilö", kuulostaa hyvältä -> peritään
- "Opettajassa on Henkilö", ei kuulosta hyvältä -> ei koosteta

Esimerkkitoteutus: Association



    

Esimerkkitoteutus: Aggregation


    
    

Esimerkkitoteutus: Composition


    
    

Yhteenveto

Valinta koostamisen ja perinnän välillä on vaikeasti havaittavissa. Yleisesti vertailussa käytetään "is-a"- ja "has-a"-sääntöä. Jos voidaan ajatella, että LuokkaA on LuokkaB (is-a), niin silloin kannattaa harkita perintää. Jos taas voidaan ajatella, että Luokassa A on toinen luokka B, niin silloin kannattaa koostaa.

Esimerkkejä:
grade "Auto on Moottori", ei kuulosta hyvältä -> ei peritä
grade "Autossa on Moottori", kuulostaa hyvältä -> koostetaan
grade "Opettaja on Henkilö", kuulostaa hyvältä -> peritään
grade "Opettajassa on Henkilö", ei kuulosta hyvältä -> ei koosteta

Lisätietoa

UML Class Diagrams: Reference
UML Class Diagrams: Guidelines