UML -mallinnus LUOKKAKAAVIO EERO NOUSIAINEN
SISÄLLYS 3. Luokkakaavio UML -mallinnuskielessä 3.1 Luokkakaavion luokan rakenteet 3.2 Luokan kuvauksesta C++ ohjelmakoodiksi 3.3 Luokkakaavion luokkien yhteystyypit 3.4 Yhteyssuhteen toteuttaminen C++ ohjelmointikielellä 3.5 Koosteinen yhteys luokkien välillä 3.6 Löyhä kooste 3.7 Vahva kooste 3.8 Löyhä ja vahva kooste yhteydessä samaan luokkaan 3.9 Koosteen toteuttaminen C++ ohjelmointikielellä 3.10 Yleistäminen (generalization) eli periminen 3.11 Perinnän toteuttaminen C++ ohjelmointikiellä
3.1 Luokkakaavion luokan rakenteet Luokkakaavio koostuu luokista, niiden tiedoista, toiminnoista ja luokkien välisistä yhteyksistä LUOKKAZ LUOKKAB LUOKKAX LUOKKAY LUOKKAQ Luokkakaavion luokan tiedot (attribuutit) ja toiminnot (funktiot/metodit) esitellään seuraavasti Anturi Tilatieto Suorita itsetesti Lähetä signaali LUOKAN NIMI (AINA YKSIKKÖ MUODOSSA) LUOKAN TIEDOT LUOKAN TOIMINNOT
3.2 Luokan kuvauksesta C++ ohjelmakoodiksi Luokan kuvauksesta ohjelmakoodiksi - julkinen (public +) - yksityinen (private -) - suojattu (protected #) SUUNNITTELUVAIHEEN LUOKAN KUVAUS CAnturi #tilatieto:int -toinen_muuttuja:char #suorita_itsetesti():int #laheta_signaali():float -kolmas_funktio(int x):void +neljas_funktio():char LUOKAN TOIMINNOT LUOKAN NIMI LUOKAN TIEDOT class CAnturi // ensin tiedot private: char toinen_muuttuja; protected: int tilatieto; // sitten toiminnot private: void kolmas_funktio(int x); protected: int suorita_itsetesti(); float laheta_signaali(); public: char neljas_funktio(); }
3.3 Luokkakaavion luokkien yhteystyypit Luokkakaavion luokkien välisiä yhteystyyppejä ovat - yhteyssuhde (assosiation) - koostesuhde (aggregation ja composition) ja - yleistyssuhde eli periminen (generalization) Yhteydet rakennetaan aina kerrallaan kahden luokan välille, vaikka luokka on yhteydessä useampaan luokkaan
3.3 LUOKKAKAAVION LUOKKIEN YHTEYSTYYPIT Yhteyssuhde eli assosiaatio on yhteys luokkien välillä Luokkien välillä voi olla seuraavia yhteyssuhteita - Yhden suhde yhteen 1:1 - Yhden suhde moneen 1:M tai - Monen suhde moneen M:N Yhteyssuhteessa luokkien välillä kerrotaan yhteyden nimi ja kerrannaisuus LUOKKAZ LUOKKAY * Yhteyden nimi 1 Kerrannaisuus voidaan ilmaista seuraavasti - 1 tarkoittaa yhtä yhteyttä luokkien välillä - * tarkoittaa määrittelemättömän monta - 0..1 tarkoittaa kertautumista "yksi tai ei yhtään - 0..* tarkoittaa kertautumista ei yhtään tai määrittelemättömän monta - Lukuarvot voidaan ilmaista myös tarkemmin esim. 5..100
3.3 Luokkakaavion luokkien yhteystyypit Yhden suhde yhteen (1:1) Yhteen tilaukseen kuuluu yksi lähetys ja yksi lähetys sisältää yhden tilauksen Yhteyden nimi Kerrannaisuudet TILAUS 1 kuuluu 1 LÄHETYS
3.3 Luokkakaavion luokkien yhteystyypit Yhden suhde moneen (1:n) Yrityksessä työskentelee monta työntekijää ja tietty henkilö voi työskennellä vain yhdessä yrityksessä YRITYS 1 työskentelee * TYÖNTEKIJÄ Kontrolleri ottaa viestejä vastaan 2-5:ltä anturilta ja anturit lähettävät viestejä vain yhdelle kontrollerille KONTROLLERI 1 kuuntelee 2..5 lähettää viestejä ANTURI YHTEYDEN SUUNTA VOIDAAN MYÖS OSOITTAA
3.3 Luokkakaavion luokkien yhteystyypit Monen suhde moneen (n:m) Kaksisuuntainen n:m -yhteys voidaan muuntaa kahdeksi 1:m yhteydeksi Projektissa työskentelee monta työntekijää ja työntekijä työskentelee monessa projektissa PROJEKTI * työskentelee * TYÖNTEKIJÄ PROJEKTI 1 * TYÖSKENTELEE * 1 Tuntimäärä TYÖNTEKIJÄ
3.4 Yhteyssuhteen toteuttaminen C++ ohjelmointikielellä Yhden suhde yhteen CKontrolleri - *ipainike:cpainike +CKontrolleri(CPainike *ppainike) +kuuntele_viesteja():void 1 Kuuntelee Lähettää merkin 1 CPainike -merkki:char +lue_merkki():char Yhteyssuhteen toteuttaminen luokassa osoittimen avulla class CKontrolleri private: CPainike *ipainike; public: CKontrolleri(CPainike *ppainike); void kuuntele_viesteja(); }; Yhteyssuhde 1:1 muodostetaan ohjelman käynnistyessä void main() CPainike *ipainike; CKontrolleri *ikontrolleri; ipainike = new CPainike; // Yhteyssuhteen 1:1 muodostaminen ikontrolleri=new CKontrolleri(iPainike);... Olion luonti aiheuttaa muodostinfunktion suorittamisen CKontrolleri::CKontrolleri (CPainike *ppainike) ipainike=ppainike; kuuntele_viesteja(); }
3.5 Koosteinen yhteys luokkien välillä Koostumussuhde on assosisaation erikoismuoto Koosterakenteessa on kysymys omistamisesta Koosteluokka omistaa osaluokkansa ja on vastuussa näiden käsittelystä Koostumuksen tunnistaa, kun assosisaatioon liittyy sanoja, kuten koostuu, sisältää, on osa jne ; eli sanoja, jotka viittaavat luokkien väliseen koosteiseen suhteeseen Koosteisia suhteita ovat aggregation (löyhä kooste) ja composition (vahva kooste)
3.5 Koosteinen yhteys luokkien välillä Miksi kaksi erilaista koostetta? Mitä eroa? Löyhässä koostessa osaluokkien olemassaolo ei ole riippuvainen koosteluokasta Vahvassa koostessa osaluokka ei voi olla olemassa ilman isäntäänsä (koosteluokka) ja se voi olla vain yhden isännän osa. Vahvan koosterakenteen yksi olennainen piirre on se, että osaluokat häviävät, kun koosteluokka häviää. Tämän piirteen avulla voi testata, onko kyse vahvasta vai heikosta koosterakenteesta Koosteen tyyppi vaikuttaa toteutukseen, koska ohjelmakoodissa kerrotaan kuka, koska ja missä luokasta luodaan olio ja kuka, koska ja missä olio voidaan tuhota
3.6 Löyhä kooste Löyhä kooste esitetään koosteluokan päässä olevalla ontolla vinoneliöllä Koosteluokka Osaluokka LAIVASTO Sisältää * SOTALAIVA Yhteyteen kuuluvat osat nimi, kerrannaisuudet ja yhteyden suunta, voidaan kuvata koosteessa aivan kuten tavallisessa yhteyssuhteessakin JOUKKUE 1 Koostuu * HENKILÖ Kuuluu
3.7 Vahva kooste Vahva kooste esitetään koosteluokan päässä olevalla täytetyllä vinoneliöllä Esimerkki - Ikkuna koostuu yhdestä otsikko-osasta, yhdesta valikosta ja 1..* tekstikentästä - Kun ohjelmassa ikkuna olio tuhotaan näytöltä, niin myös ikkunaan kuuluvat osat tuhotaan 1 OTSIKKO-OSA IKKUNA 1 VALIKKO 1..* TEKSTI-KENTTÄ
3.8 Löyhä ja vahva kooste yhteydessä samaan luokkaan Esimerkki - Vähintään 1 vastaanottaja täytyy olla viestissä - Viestiin kuuluu yksi otsikkokenttä ja yksi viestiosa - Liitetiedosto voi kuulua viestiin,mutta olemassaolo ei ole riippuvainen sähköpostiviestin olemassaolosta Sähköpostiviesti 1 0..* 1 1 0..* Liitetiedosto 1 Viestiosa 1..* Vastaanottajaosa 1 Otsikkokenttäosa
3.9 Koosteen toteuttaminen C++ ohjelmointikielellä Vahva kooste Luokkien väliset suhteet: vahva koostesuhde 1:1 - Koosteluokka omistaa osaluokkansa ja on vastuussa sen käsittelystä - Koosteolion tulee huolehtia osaolion luonnista ja hävittämisestä - *ipainike:cpainike CKontrolleri +Ckontrolleri +~Ckontrolleri +kuuntele_viesteja():void KOOSTESUHDE MUODOSTETAAN OSOITINOLION AVULLA KOOSTELUOKKA 1 CPainike OSALUOKKA -merkki:char +lue_merkki():char
3.9 Koosteen toteuttaminen C++ ohjelmointikielellä // CKontrolleri.h class CKontrolleri private: CPainike *ipainike; public: CKontrolleri (); ~CKontrolleri(); void kuuntele_viesteja(); }; // CPainike.h class CPainike private: char merkki; public: char lue_merkki; }; - *ipainike:cpainike CKontrolleri +Ckontrolleri +~Ckontrolleri +kuuntele_viesteja():void CPainike -merkki:char +lue_merkki:char
3.9 Koosteen toteuttaminen C++ ohjelmointikielellä Koosteolion luonti ohjelman käynnistyessä void main(void) // luodaan koosteolio CKontrolleri *ikontrolleri =new CKontrolleri(); } //tuhotaan koosteolio delete ikontrolleri; koosteolion muodostinfunktiossa luodaan osaolio CKontrolleri::CKontrolleri() // Luodaan osaolio ipainike=new CPainike; kuuntele_viesteja (); } Kun koosteolio tuhotaan, niin suoritetaan tuhoojafunktio, jossa tuhotaan myös osaolio CKontrolleri::~CKontrolleri() delete ipainike; }
3.10 Yleistäminen (generalization) eli periminen Yleistäminen on suhde yleisemmän (yliluokka) ja erikoisemman luokan välillä (aliluokka) Aliluokka on täysin yhteensopiva yläluokan kanssa ja sisältää vain lisätietoa ja perii yläluokan ominaisuuksia (tietoja, toimintoja ja yhteyksiä) Yleistyssuhde kuvataan onton kolmion avulla Kulkuväline Yläluokka Aliluokat Auto ja Vene Auto Vene
3.11 Perinnän toteuttaminen C++ ohjelmointikielellä class Kulkuvaline // tänne metodit ja data }; class Auto : public Kulkuvaline // tänne metodit ja data }; Perintä rakennettaan C++ -ohjelmointikielessä public -määreellä class Vene : public Kulkuvaline // tänne metodit ja data };