Johdatus sovellussuunnitteluun, s2001, osa 4a Helsingin yliopisto / TKTL Harri Laine / Inkeri Verkamo 1. Luokka- ja oliokaaviot

Samankaltaiset tiedostot
Johdatus sovellussuunnitteluun, s99, osa3 Helsingin yliopisto;/tktl Harri Laine 1. Olioiden väliset yhteydet. Olioiden väliset yhteydet

Johdatus sovellussuunnitteluun, s99, osa3 Helsingin yliopisto;/tktl Harri Laine 1. Olioiden väliset yhteydet. Olioiden väliset yhteydet

Yhteydelle voi antaa nimen kumpaankin suuntaan Sille ei tarvise antaa lainkaan nimeä Yhteysnimen asemasta tai lisäksi voidaan käyttää roolinimiä

Johdatus sovellussuunnitteluun, s2000, osa4 Helsingin yliopisto;/tktl. Harri Laine 1. Luokka- ja oliokaaviot. Luokka- ja oliokaaviot

Olioperustaisuus (object oriented)

Johdatus sovellussuunnitteluun, s99, osa2 Helsingin yliopisto;/tktl Harri Laine 1. Olioperustaisuus (object oriented)

Johdatus sovellussuunnitteluun, s99, osa2 Helsingin yliopisto;/tktl Harri Laine 1. Olioperustainen ohjelmistokehitys

Ohjelmistotekniikan menetelmät

Ohjelmistotekniikan menetelmät

Ohjelmistotekniikan menetelmät, luokkamallin laatiminen

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

Ohjelmistojen mallintaminen Luokkakaaviot Harri Laine 1

Ohjelmistojen mallintaminen luokkamallin laatiminen

Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

UML - unified modeling language

Ohjelmistojen mallintaminen luokkamallin laatiminen

Johdatus sovellussuunnitteluun

Ohjelmistotekniikan menetelmät, luokkamallin laatiminen

Johdatus sovellussuunnitteluun osa 2

Luokkamalli LUOKKAKAAVIO. Tämän osan sisältö. Luokkamalli. Luokka ja olio. Luokkakaavio (class diagram)

Ohjelmistojen mallintaminen kertausta Harri Laine 1

Ohjelmistotekniikan menetelmät, UML

UML Luokkakaavio 14:41

UML -mallinnus LUOKKAKAAVIO EERO NOUSIAINEN

UML ja luokkien väliset suhteet

Olio-ohjelmointi Javalla

Olio-ohjelmointi: Luokkien toteuttaminen. Jukka Juslin

Johdanto. Olio (Object) Luokka (Class) Olion kuvaaminen

Ohjelmistojen mallintaminen. Luento 4,

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

2. Olio-ohjelmoinnin perusteita 2.1

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Ohjelmistojen mallintaminen Unified Modeling Language (UML)

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Luokkakaavion laatiminen

2. Olio-ohjelmoinnin perusteita 2.1

TIE Samuel Lahtinen. Lyhyt UML-opas. UML -pikaesittely

Sisällys. 19. Unified Modeling Language (UML) Johdanto. Johdanto. Johdanto. Luokkakaavio:

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia.

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

15. Ohjelmoinnin tekniikkaa 15.1

Mikä yhteyssuhde on?

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

Kertausta: Olioperustainen ohjelmistokehitys

9. Periytyminen Javassa 9.1

1. Tarkastellaan seuraavaa kaaviota

Ohjelmistojen mallintaminen. Luento 3, 9.11.

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Ohjelmistotekniikan menetelmät Luokkamallit ohjelmiston mallintamisessa Harri Laine 1

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

YHTEYSSUHDE (assosiation)

9. Periytyminen Javassa 9.1

Analyysi, staattinen mallintaminen, kohdealueen malli ja luokkakaavio

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Rajapinta (interface)

1. Olio-ohjelmointi 1.1

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Tietokantojen perusteet k2004helsingin yliopisto/tktl Tietokantojen perusteet, s 2007 ER-mallin peruskäsitteet.

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät

Ohjelmistojen mallintaminen, mallintaminen ja UML

Taulukot. Jukka Harju, Jukka Juslin

15. Ohjelmoinnin tekniikkaa 15.1

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Luokkakohtaiset eli stattiset metodit ja attribuutit

4. Olio-ohjelmoinista lyhyesti 4.1

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

2. Olio-ohjelmoinista lyhyesti 2.1

Ohjelmistojen mallintaminen, kertausta

Tietokantasuunnittelun pääperiaatteena on tiedon toiston välttäminen. Tiedon toistumiseen liittyy monenlaisia ongelmia.

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Luokka- ja oliokaaviot

18. Abstraktit tietotyypit 18.1

Metodien tekeminen Javalla

Ohjelmistojen mallintaminen

Sisällys. Mitä on periytyminen? Yksittäis- ja moniperiytyminen. Oliot ja perityt luokat. Periytymisen käyttö. 8.2

Javan perusteita. Janne Käki

Johdatus sovellussuunnitteluun, s 2001, osa 4b Helsingin yliopisto / TKTL Harri Laine / Inkeri Verkamo 1. Luokkakaavion tarkoitus

Luokka (class) esitetään suorakulmion avulla, jonka sisälle kirjoitetaan luokan nimi (vahvennettuna).

4. Luokan testaus ja käyttö olion kautta 4.1

19. Unified Modeling Language (UML)

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Analyysi, staattinen mallintaminen, kohdealueen malli ja luokkakaavio

Mitä on periytyminen?

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Ohjelmistojen mallintaminen Olioiden yhteistyö Harri Laine 1

Tämän lisäksi listataan ranskalaisin viivoin järjestelmän tarjoama toiminnallisuus:

Ohjelmistojen mallintaminen viikon 4 laskareiden mallivastauksia

16. Javan omat luokat 16.1

Ohjelmistojen mallintaminen. Luento 2, 8.11.

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

KOHDELUOKAN MÄÄRITTELY

Transkriptio:

Luokka- ja oliokaaviot Luokka- ja oliokaavioilla kuvataan ohjelmiston / järjestelmän koostuminen olioista, olioiden tietämys, niiden tarjoamat palvelut sekä olioiden väliset yhteydet Olio tiedon ja sen käsittelyyn liittyvien palveluiden muodostama kokonaisuus olio pitää sisällään tietoja, joita olion palvelut käsittelevät / hyödyntävät Puhtaassa olio-ohjelmoinnissa olion tietoihin pääse käsiksi vain olion palveluiden kautta Luokka- ja oliokaaviot (Olio)luokka (class, object class) on samankaltaisten olioiden malli. Saman mallin mukaiset oliot kuuluvat samaan luokkaan. Ne ovat kyseisen luokan ilmentymiä (instance). Luokkakuvaus määrittelee luokan. Reaalimaailma ja luokka Olio-ohjelma ja luokka luokka eläin ilmentymät public class elain { int elain_numero; String laji; Color vari; float paino; Luokkakuvaus ohjelmointikielellä määrittelee Eläin on.. Ominaisuuksia: paino, väri, sukupuoli,... Toimintoja: syöminen, liikkuminen,... luokkakuvaus public elain( ){ } public setpaino( ){ } public float getpaino(){ } } elain otus = new elain(.); elain toinen = new elain(.); ilmentymä ilmentymä 2 Luokkakuvaus UML:llä Luokkakuvaus UML:ssä elain elain_numero: int laji: String vari: Color paino: float laji vari String Kolmiosainen kuvaus välttämätön nimi attribuutit elain( ) setpaino( ) getpaino(): float Color palvelut Instance of Instance of mukana tarvittaessa otus: elain toinen: elain Pitäisi oikeastaan poistaa täältä toisteisina Harri Laine / Inkeri Verkamo

Ilmentymän kuvaaminen Ilmentymän kuvaaminen Ilmentymän nimi (ei välttämätön) Luokan nimi (ei välttämätön) Otus: elain elain_numero=2345 laji=norsu vari=harmaa paino=2300 Otus2: elain elain_numero=2346 laji=aasi vari=ruskea paino=220 Instance of elain Instance of Ilmentymät luokkakaaviossa Ilmentymiä esitetään yleensä vain esimerkkeinä leijona kissa2 Olioiden tietämys (tietosisältö) kuvataan attribuutteina Attribuutista voidaan esittää nimi (välttämätön) tietotyyppi arvojen määrä (hakasuluissa, alaraja..yläraja, =epämääräisen monta) näkyvyys vain ohjelmointiläheisessä kuvauksessa oletusarvo muita määreitä Näkyvyys (visibility) on esim. C++ ja Javaohjelmointikielissä käytetty tekniikka, jolla säädellään luokkakuvauksessa esitellyn muuttujan tai metodin (palvelun) käyttömahdollisuuksia. private (-) rajaa käytön luokan omiin palveluihin protected (#) sallii käytön myös luokan aliluokissa määriteltävissä palveluissa ( puhdasoppisesti ajateltuna kaikkien attribuuttien tulisi olla näkyvyydeltään protected public (+) sallii käytön myös luokan ulkopuolelta UML käyttää yllä sulkeissa olevaa merkkiä attribuutin nimen edessä osoittamaan näkyvyyden. pankkitili #tilinumero #tilin_tila -tapahtumat[] +viimeksi_käytetty_pvm Attribuutit tilinumero ja tilin_tila ovat käytettävissä luokan pankkitili ja sen aliluokkien palveluissa (esim. luokassa käyttötili). Moniarvoiseen attribuuttiin tapahtumat voi viitata vain pankkitilin omissa palveluissa. Attribuuttiin viimeksi_käytetty_pvm voi viitata myös ulkopuolisten luokkien palveluissa. UML:ssä on mahdollista määritellä: luokka-attribuutteja (class attribute), attribuutilla luokkakohtainen arvo ilmaistaan alleviivaamalla attribuutin nimi ilmentymäattribuutteja (instance attribute) arvo erikseen jokaisessa luokan ilmentymässä henkilötunnus tarkistusmerkit[3] päiväys vuosisata jnro tarkmerkki Luokkakohtainen tarkistusmerkkitaulukko Ilmentymäkohtaisia tietoja Harri Laine / Inkeri Verkamo 2

Attribuutin arvo on jotain tyyppiä. Tyyppi ilmaistaan antamalla se nimen perässä kaksoispisteellä erotettuna: päiväys:date jnro:int tarkastusmerkki: char Arvo voi olla perustietotyypin arvo UML ei ota kantaa tietotyyppeihin, vaan sallii mitä tahansa perustietotyyppejä. yllä int ja char Olio, jolloin tietotyyppinä on olion luokka Olioarvoinen attribuutti muodostaa yhteyden attribuutin sisältävän olion ja attribuutin arvona olevan olion välille. Tällaiset yhteydet pitäisi tuoda selkeästi esiin ja kuvata omalla tekniikallaan (luokkia yhdistävinä viivoina). Jos attribuutin arvona on olio, tämä tulisi esittää attribuuttimäärittelyn yhteydessä vain, mikäli olion luokka on perustietotyyppimäinen, esim Date, String, Color, Point, päiväys:date nimi:string Attribuuttimäärittelyyn voi liittää muiden määrittelyjen jälkeen kaarisulkeissa {...} lisämääreitä. UML tarjoaa valmiina lisämääreet: changeable (oletus) arvon muuttamiseen ei ole rajoitteita frozen arvoa ei voi muuttaa addonly moniarvoiselle attribuutille voi vain lisätä arvoja, ei koskaan poistaa UML-mallin soveltaja voi ottaa käyttöön omia lisämääreitä. Hyödyllisiä voisivat olla id ulkoinen tunniste, attribuutin arvo ei voi olla sama kahdella eri ilmentymällä pankkitili tilinumero {frozen, id} Tilinumeroa ei voi muuttaa, se yksilöi tilit. Jos usealla attribuutilla on id-määre, ne yhdessä yksilöivät kohteen ja Java ohjelma UML-luokka vastaa Java-luokkaa. Javan static-muuttujat vastaavat luokkaattribuutteja. Muut Java-luokassa määritellyt muuttujat vastaavat ilmentymäattribuutteja. Javan protected tulkinta on hieman edellä esitetystä poikkeava Luokan palvelut Palvelusta UML:ssä voidaan kuvata: näkyvyys - kuten attribuuttien kohdalla nimi (välttämätön) parametrit paluuarvon tyyppi muut määreet Hakasulut ilmaisevat valinnaisen elementin [näkyvyys] nimi [(parametrit)] [:paluuarvon tyyppi] [{muut määreet}] parametrimäärittelyn muoto on [suunta] nimi: tyyppi [= oletusarvo ] Harri Laine / Inkeri Verkamo 3

Luokan palvelut Esim. henkilötunnus #tarkistusmerkit[3] #päiväys #vuosisata #jnro #tarkmerkki +tostring():string +isok():boolean +getbirthdate():date +getsex():int Olioiden (ilmentymien) välisiä rakenteellisia kytkentöjä kutsutaan yhteyksiksi (association). Ohjelmakoodissa rakenteellinen kytkentä ilmenee siten, että luokalla on olioarvoinen attribuutti tai jokin epäsuora viittaus toiseen olioon. omistaja[]: Tarkoittaa, että pankkitili-olioiden ja asiakas-olioiden välillä on kytkentä, joka voidaan kuvata seuraavasti: Määritellään Java-ohjelmassa pankkitilin omistaja [] omistaja = new [3]; eli tilillä voi olla enintään 3 omistajaa. llä täytyy aina olla omistaja (tämä on tarkistettava ohjelmassa). Ylläoleva esitettäisiin kaaviona: omistaja-> omistaja->..3 Yhden tilin voi omistaa useita asiakkaita. Edellä on kyseessä suunnattu yhteys: pankkitilistä päästään asiakkaaseen, mutta asiakkaasta ei päästä pankkitiliin, eli ilmentymätasolla tilanne olisi seuraava: Jos haluttaisiin yhteys myös toiseen suuntaan (ja edelleen taulukoilla), voisimme määritellä asiakkaalle attribuutin [] tili=new [0]; 234:pankkitili omistaja omistaja->..3 omistaja 0..0 <-tili Aku Ankka: Ines Ankka: Asiakkaalla ei välttämättä ole yhtään tiliä Harri Laine / Inkeri Verkamo 4

Ilmentymätasolla tilanne voisi olla: 235:pankkitili 236:pankkitili 234:pankkitili tili omistaja tili omistaja tili tili omistaja omistaja 4567:pankkitili tili Aku Ankka: Ines Ankka: Tili- ja omistaja-yhteydet kuvaavat samaa asiaa käänteisesti ja ne voidaan yhdistää Ilmentymätasolla mikään ei muutu, kaaviotasolla viivojen määrä vähenee. 0..0 omistaja->..3 <-tili omistaja Yhteyden nimi Nimen lukusuunta Tässä tili ja omistaja ovat roolinimiä, Ohjelmaa kuvattaessa kumppanin roolinimenä voi käyttää olion sisältämän kumppaniin viittaavan muuttujan nimeä. 0..0 omistaja->..3 0..0..3 <-tili tili omistaja Yhteydelle voi antaa nimen kumpaankin suuntaan. Sille ei tarvise antaa lainkaan nimeä. Yhteysnimen asemasta/lisäksi voidaan käyttää roolinimiä. tili-muuttuja (tässä tapauksessa taulukko) sisältyy jokaiseen -olioon. Sitä ei kuitenkaan suositella esitettäväksi asiakkaan attribuuttina, jotta vältettäisiin tarpeetonta saman asian toistoa. Vastaavasti omistaja on pankkitiliin sisältyvä taulukkomuuttuja. 0..0 Tärkeää..3 Yhteysviivan päässä oleva nuolenkärki kuvaa ns. navigointimahdollisuutta eli sitä, että viivan päässä olevan luokan olioista pääsee suoraan nuolella osoitetun luokan olioon (yhteen tai useampaan) - oliossa on siis siirtymän mahdollistava olioarvoinen muuttuja. Tili Omistaja Asiakkaaseen kytkettyjen pankkitilien minimi- ja maksimimäärä ilmoitetaan kumppanin (siis pankkitilin) puoleisessa päässä yhteysviivaa. n opiskelijoiden ylärajaa ei ole kiinnitetty (). 0.. Opiskelija_kurssilla sta pääsee kurssin_opiskelijaan mutta ei toisinpäin. Harri Laine / Inkeri Verkamo 5

Kun kuvauksen abstraktiotasoa nostetaan, jätetään navigointimahdollisuus yleensä kuvaamatta. Tällöin yhteysviivan kummassakaan päässä ei ole nuolenkärkeä. Jos yhteysviivan toisessa päässä kuvataan navigointimahdollisuus, se tulkitaan kuvatuksi myös toisessa päässä. A B A B Tämän ei tarkoita sitä, ettei A:sta pääse B:hen eikä päinvastoin, vaan sitä, että navigointimahdollisuus on jätetty esittämättä. Navigointimahdollisuuden voi tällöin ajatella olevan molemminsuuntainen. Näin esitettynä B-olioista ei ole suoraa pääsyä A-olioihin. Molemmat yhteyden osapuolina olevat oliot voivat kuulua samaan luokkaan. Iso_pomo Työntekijä alainen 0.. esimies 0.. Työntekijällä voi olla vain yksi (välitön) esimies. Työntekijällä voi olla useita alaisia, ei välttämättä yhtään. esimies esimies Pikku_pomo alainen alainen duunari duunari2 duunari3 Pikku_pomo2 duunari4 duunari5 Yhteyteen voidaan liittää järjestysmääre kuvaamaan sitä, että samaan olioon yhteydessä olevien olioiden joukko on jollain perusteella järjestetty. Olioiden maihinnousu Kirja 0.... tuote tekijä {ordered} Henkilö 2 Fox Mulder Dana Scully Kirjan tekijöiden joukko on järjestetty. Järjestetty joukko Harri Laine / Inkeri Verkamo 6

Jos yhteyden osapuolta voidaan pitää osana toista osapuolta, on kyseessä kooste (aggregate). Tällainen yhteyden erikoistapaus voidaan esittää yhteysviivan kokonaisuuden puoleiseen päähän sijoitetun salmiakki-symbolin avulla. Kooste auttaa hahmottamaan sitä, miten oliot semanttisesti kytkeytyvät toisiinsa. Sillä ei välttämättä ole mitään vaikutusta esimerkiksi navigointimahdollisuuksiin. Yleensä kuitenkin kokonaisuudesta on aina pääsy osiinsa. Pelaaja voi kuulua moneen joukkueeseen. joukkue pelaaja jäsen Pelkkä tarkoittaa samaa kuin pari 0.. joukkue jäsen pelaaja Pelaajasta on suora pääsy pelaajan joukkueseen ja joukkueesta sen pelaajiin. Ohjelman toiminnan kannalta koostetta merkittävämpi yhteys on kompositio-yhteys (composition). Kompositio on koosteen erikoistapaus, jossa osan olemassaolo on kytketty kokonaisuuden olemassaoloon - kun kokonaisuus hävitetään, häviävät myös sen osat (tavallisen koosteen kohdalla näin ei käy) osa voi sisältyä vain yhteen samantyyppisen kompositioon osa ei voi vaihtaa kompositiotaan, vaan on aina osa samaa kokonaisuutta Esimerkkejä: Rakennus Huoneisto Kompositio esitetään mustalla salmiakilla kokonaisuuden puoleisessa päässä. Kompositio on UML:ssä ainoa tapa ilmaista olemassaoloriippuvuus. Olemassaoloriippuvuus on mallintamisessa hyvin tärkeä asia, tärkeämpi kuin osan ja kokonaisuuden yhteys. Jos olemassaoloriippuvuus pitää kyetä esittämään, on syytä käyttää kompositiota, vaikka osa-kokonaisuus-yhteys ei aivan selvältä näyttäisikään. Kompositiota käytetään reaalimaailmassa usein hyväksi olioiden identifioinnissa. Rakennuksen Teollisuuskatu 23 huone B446 pitää sisällään komposition. Perus-UML ei tarjoa keinoa komposition kautta tapahtuvan ulkoisen identifioinnin kuvaamiseen, joten tällä kurssilla otetaan käyttöön yhteytessä osan puolelle liitettävä lisämääre {id} esittämään tätä. Harri Laine / Inkeri Verkamo 7

Rakennus.. {id} Huone Rakennus.. Katuosoite {id} {id} Huone Huonenumero {+id} Huoneen yksikäsitteiseen identifiointiin tarvitaan tieto rakennuksesta, jossa huone sijaitsee. Koska rakennuksessa voi olla useita huoneita tarvitaan identifiontiin lisäksi jokin rakennuksen sisäinen tunniste. Käytetään tällaisen osoittamiseen merkintää {+id} Katuosoite ja huonenumero yhdessä identifioivat huoneen. Esim: Teollisuuskatu 23, B446 Kompositioita ohjelmissa käsiteltäessä kokonaisuusolio on vastuussa osiensa luonnista ja hävittämisestä. kurssi luo hävitä Yhteyskategoriat Yhteydet voidaan jakaa osallistumisrajoitteiden ylärajojen perusteella tyyppeihin seuraavasti :N (lue yhden suhde moneen) toisella osapuolen ilmentymillä voi olla monta kumppania, mutta toisen ilmentymillä enintään yksi, esim. -, N:M (lue monen suhde moneen) ja kummankin osapuolen ilmentymillä voi olla useita kumppaneita. Esim -Oppikirja : (lue yhden suhde yhteen) kummakin osapuolen ilmentymillä voi olla enintään yksi kumppani, esim Henkilö-Ajokortti Tarkastellaan tilannetta, jossa kurssin harjoitusryhmät on taulukon asemasta toteutettu RyhmaKokoelma-luokan avulla. Tämä luokka toteuttakoon dynaamisen taulukon (= taulukko, joka laajenee tarvittaessa). JSS:KURSSI JSS-RYHMÄT: Yksityiskohtaisessa kuvauksessa tilanne olisi tällöin: RyhmäKokoelma Dynaaminen taulukko JSS/H:H.RYHMÄ JSS/H2:H.RYHMÄ ilmentymätasolla Harri Laine / Inkeri Verkamo 8

Sama asia voitaisiin toteuttaa myös vaikkapa listarakenteena. 0.. 0.. 0.. first 0.. next JSS:KURSSI first Lista ilmentymätasolla Näissä kummassakin kuvauksessa, erityisesti ylläolevassa, ratkaisun yksityiskohdat vaikeuttavat oleellisen kokonaisuuden hahmotusta = sitä, että kurssiin liittyy useita harjoitusryhmiä, jotka ovat olemassaoloriippuvia kurssista. Kuvauksen abstraktiotasoa on tällöin syytä nostaa häivyttämällä tekninen ratkaisu. JSS/H:H.RYHMÄ next JSS/H2:H.RYHMÄ Kokoelman toteutus Tarkastellaan vielä aiempaa esimerkkiä Abstrakti kuvaus RyhmäKokoelma Dynaaminen taulukko RyhmäKokoelma Toteutukset 0.. 0.. first 0.. 0.. next Tässä ratkaisussa RyhmäKokoelma todennäköisesti toteutettaisiin ohjelmointikielen tarjoamaa valmista dynaamista taulukkoa käyttäen (Javassa luokka Vector) - miten tämä kuvataan UML:llä? Kokoelman toteutus Kokoelman toteutus Vector RyhmäKokoelma Vector Ratkaisu on virheellinen, sillä kaikki Vector-luokan ilmentymät eivät toki ole olemassaoloriippuvia Kursseista. UML:ssä on mahdollista määritellä riippuvuuksia luokkien välille, tässä on kyse riippuvuudesta yleiskäyttöisen luokan (Vector) ja sillä toteutetun luokan (RyhmäKokoelma) välillä. Harri Laine / Inkeri Verkamo 9

Kokoelman toteutus Java-ohjelmana edellisen kalvon esimerkki toteutuisi seuraavasti: Henkilö Yhdistys public class { Vector RyhmäKokoelma; 0.. 0.. public void lisääryhmä(harjoitusryhmä h) { RyhmäKokoelma.addItem(h); } Tässä siis luokkaa RyhmäKokoelma ei ole määritelty. On vain Vectorluokan ilmentymä, mutta koska Vector on geneerinen yleiskäyttöinen luokka, sen ilmentymä voidaan ajatella tarkoitukseen sidotuksi luokaksi. Jäsenyys Rooli Tässä esimerkissä jäsenyys-olioiden avulla kuvataan henkilön jäsenyyttä yhdistyksessä. Henkilö voi olla rivijäsen, johtokunnassa tai kunniajäsen. Ilmentymätasolla HYY:Yhdistys AP-RY Rooli=rivijäsen AP:Henkilö Tilanne voitaisiin mallintaa myös ns. yhteysluokan (association class) avulla. AP-HYY Rooli= johtok. Yhdistys 0.. 0.. Henkilö KK-HYY Rooli= rivijäsen KK:Henkilö jäsenyys Rooli Tähän sisältyy implisiittinen vaatimus, että henkilöllä on enintään yksi jäsenyys kussakin yhdistyksessä.... Yhteysluokkaa käyttäen voidaan kahden olion väliseen kytkentään liittää kytkennän laatua kuvaavia attribuutteja. Yhteydet UML:ssä on mahdollista kuvata myös useamman kuin kahden olion välisiä kytkentöjä. Oppikirjana Kirja Opettaja Opettaja käyttää kurssilla tiettyä oppikirjaa. Harri Laine / Inkeri Verkamo 0

Luokkien väliset suhteet Edellä on tarkasteltu olioiden (ilmentymien) välisiä yhteyksiä. Luokkakaaviossa nämä kuvataan luokkien välillä. UML:ssä voidaan lisäksi esittää luokkien välisiä riippuvuuksia (dependency) ja luokkahierarkia Riippuvuus Luokien välisellä riippuvuudella tarkoitetaan tilannetta, jossa luokan määrittelyissä tapahtuvalla muutoksella voi olla vaikutuksia toisen luokan toimintaan. Riippuvuus kuvataan katkoviivalla, jonka päässä oleva nuolenkärki osoittaa siihen luokkaan, josta viivan toisessa päässä oleva on riippuva. Käytettävä Käyttäjä Käyttäjä on riippuvuussuhteessa käytettävään. Riippuvuus Esimerkki riippuvuudesta on palvelun parametrin aiheuttama riippuvuus, jossa palvelun tarjoava luokka tulee riippuvaksi parametrin luokasta. Riippuvuus Aiemmin oli jo esillä riippuvuus yleiskäyttöisestä luokasta kokoelman toteutuksessa. Class Käyttäjä { Yleinen kokoelma Täsmäkokoelma public omapalvelu(käytettävä k) { k.vieraspalvelu(); } } UML:ssä on nimetty 8 erilaista luokkakaaviossa mahdollista riippuvuutta. Näiden määrittelyt ovat kuitenkin osin varsin epämääräisiä. Harri Laine / Inkeri Verkamo