UML ja luokkien väliset suhteet -Luokan kuvaaminen UML-tekniikalla -Yhteyssuhde ja koostumussuhde 1
Luokan kuvaaminen UML-tekniikalla : Luokka - attribuutti1 : tietotyyppi # attribuutti2 : tietotyyppi + attribuutti3 : tietotyyppi - metodinnimi (param1:tietotyyppi... param9:tietotyyppi) : paluuarvon_tietotyyppi # metodinnimi (param1:tietotyyppi... param9:tietotyyppi) : paluuarvon_tietotyyppi + metodinnimi (param1:tietotyyppi... param9:tietotyyppi) :paluuarvon_tietotyyppi - private, # protected, + public 2
Esim. Aika-luokka : Aika - tunnit : int - minuutit : int - sekunnit : int + Aika() + Aika(tunti: int, minuutti: int, sekunti: int) + Aika (tunti: int) + Aika (aika: Aika) + settunnit(tunnit: int): void + setminutit (m: int): void + setsekunnit (s: int): void + gettunnit(): int + getminuutit(): int + getsekunnit(): int + tostring () : String 3
Miten toteutan luokkien väliset suhteet? Esim. Opintojakso -tunnus : String -nimi : String -laajuus : int 1 * Toteutus -numero : int 1 Toteutuksen aloituspvm 1 GregorianCalendar 1 -Toteutuksen lopetuspvm 1 Yhteyssuhde Vahva koostumussuhde 4
Yhteyssuhde (association) Yhteyssuhde kuvaa kahden olion välistä suhdetta: yhteyssuhdetta kutsutaan yksinkertaiseksi, jos toinen olioista osallistuu enintään kerran suhteeseen Opiskelija Suoritus 1 * yhteyssuhdetta kutsutaan moninkertaiseksi, jos kummatkin oliot osallistuvat useasti suhteeseen Opiskelija Kurssi * * 5
Yhteyssuhde (association) jatkuu Yksinkertainen yhteyssuhde toteutetaan yleensä siten, että siihen luokkaan, jossa on nolla tai yksi yhteyttä toiseen olioon, lisätään attribuutti, joka viittaa yhteydessä olevaan olioon. Moninkertainen yhteyssuhde toteuttaa yleensä siten, että sijoitetaan siihen luokkaan, jonka kautta käytetään suhteessa olevia olioita useammin kuin päinvastoin, tietorakenne, johon tallettetaan viittaukset suhteessa oleviin olioihin esim. ArrayList 6
Yhteyssuhde (association) jatkuu Esim. yksinkertainen yhteyssuhde: Opiskelija Suoritus public class Suoritus private Opiskelija opiskelija;... 1 * Esim. moninkertainen yhteyssuhde: Tilaus Tuote public class Tilaus * * private ArrayList<Tuote> tuotteet;... 7
Esimerkin luokkakaavio 8
Yhteyssuhteen toteuttaminen Toteutus-luokassa public class Toteutus private int numero; private Opintojakso opintojakso; viittaus opintojaksoon, kertoo minkä opintojakson toteutuksesta on kyse private //oletusmuodostin public Toteutus()... opintojakso = null; 9
Toteutus-luokka ja yhteyssuhde jatkuu //parametrillinen muodostin public Toteutus ( Opintojakso op, int numero, )... setopintojakso (op); //kopiointimuodostin public Toteutus(Toteutus toteutus) this(); // oletusmuodostinmen kutsu if (toteutus!= null)... opintojakso = toteutus.opintojakso; 10
Toteutus-luokka ja yhteyssuhde jatkuu public Opintojakso getopintojakso() return opintojakso; public void setopintojakso(opintojakso opintojakso) this.opintojakso = opintojakso; public String tostring() String paluu=null; if (opintojakso!= null) paluu = opintojakso.gettunnus()+"-" + numero +" " + opintojakso.getnimi() + " " ; else paluu = numero + " ";... return paluu; 11
Koostumussuhde Koostumussuhteita on kaksi: 1. Heikko koostumussuhde (Aggregation) ja 2. Vahva koostumussuhde (Composition) Koostumussuhde esittää suhteen on osa tai kuuluu olioiden välillä Esim. henkilökunta kuuluu yritykseen". koostuminen on aina yhdensuuntaista eli edellisessä esimerkissä ei voida ajatella että yritys kuuluu henkilökuntaan. 12
Heikko koostumussuhde (aggregation) Heikko koostumussuhde (aggregate) toteutetaan usein kuten yhteyssuhde Esim. heikko koostumussuhde, jossa tilaus muodostuu tilausriveistä Tilaus Tilausrivi -tilattu_maara : 1 * int * 1 Tuote public class Tilaus private ArrayList<Tilausrivi> rivi; 13
Aito/Vahva koostumussuhde (composition) Tarkoittaa koostumussuhdetta, jossa osaolio riippuu isäntäoliostaan kahdella tavalla: Osa ei ole olemassa ilman isäntää Osa voi olla vain yhden isännän osa isännän tulee huolehtia osan luomisesta ja tuhoamisesta Esim. Ministeri voi olla olemassa vain tietyssä valtioneuvostossa. 1 * Ks. Tuntiharjoitus 1 public class Valtioneuvosto private Ministeri ministeri; Valtioneuvosto Ministeri 14
Esimerkin luokkakaavio 15
Vahva koostumussuhteen toteuttaminen Toteutus-luokassa public class Toteutus private int numero; private Opintojakso opintojakso; private GregorianCalendar aloituspvm ; private GregorianCalendar lopetuspvm; //oletusmuodostin public Toteutus() numero = 0; opintojakso = null; // osa-olio luodaan samaan aikaan kuin isäntä aloituspvm = new GregorianCalendar(); lopetuspvm = new GregorianCalendar(); 16
Toteutus-luokka ja vahva koostumussuhde jatkuu //parametrillinen muodostin public Toteutus ( Opintojakso op,int numero, GregorianCalendar alku, GregorianCalendar loppu) this(); // oletusmuodostimen kutsu... setaloituspvm(alku); setlopetuspvm(loppu); //kopiointimuodostin public Toteutus(Toteutus toteutus) this(); // oletusmuodostinmen kutsu if (toteutus!= null) muutaaloituspvm(toteutus.aloituspvm); muutalopetuspvm(toteutus.lopetuspvm);... 17
Toteutus-luokka ja vahva koostumussuhde jatkuu private void muutaaloituspvm(gregoriancalendar pvm) if ( pvm!= null) aloituspvm.set( pvm.get(calendar.year), pvm.get(calendar.month), pvm.get(calendar.date)); private void muutalopetuspvm(gregoriancalendar pvm) if ( pvm!= null) lopetuspvm.set( pvm.get(calendar.year), pvm.get(calendar.month), pvm.get(calendar.date)); 18
Toteutus-luokka ja vahva koostumussuhde jatkuu public void setaloituspvm(gregoriancalendar aloituspvm) muutaaloituspvm(aloituspvm); public void setlopetuspvm(gregoriancalendar lopetuspvm) muutalopetuspvm (lopetuspvm); 19
Toteutus-luokka ja vahva koostumussuhde jatkuu private GregorianCalendar teekopio(gregoriancalendar pvm) GregorianCalendar paluu = null; if ( pvm!= null) paluu= new GregorianCalendar( pvm.get(calendar.year), pvm.get(calendar.month), pvm.get(calendar.date)); return paluu; 20
Toteutus-luokka ja vahva koostumussuhde jatkuu public GregorianCalendar getaloituspvm() GregorianCalendar pvm = null; pvm = teekopio(aloituspvm); return pvm; public GregorianCalendar getlopetuspvm() GregorianCalendar pvm = null; pvm = teekopio(lopetuspvm); return pvm; 21
Toteutus-luokka ja vahva koostumussuhde jatkuu public String tostring() String paluu=null; if (opintojakso!= null) paluu = opintojakso.gettunnus()+"-" + numero +" " + opintojakso.getnimi() + " " ; else paluu = numero + " "; paluu = paluu + aloituspvm.get(calendar.date) +"." + (aloituspvm.get(calendar.month)+1) +"." + aloituspvm.get(calendar.year) ; paluu = paluu + "-" + lopetuspvm.get(calendar.date) +"." + (lopetuspvm.get(calendar.month)+1) +". + lopetuspvm.get(calendar.year) ; return paluu; // ks. Tuntiharjoitus 2 22