UML-luokkakaaviot ja Java

Download Report

Transcript UML-luokkakaaviot ja Java

UML-luokkakaaviot
Nämä kalvot on lisensoitu Creative Commons
Attribution-ShareAlike 1.0 -lisenssillä.
© Jukkaedelliseen
Lisäys
Harju, 2014
lisenssiin: Kalvojen
muokkaaminen on sallittu vain opettajille, joiden
kursseilla käytetään kurssikirjana Tuloksellinen
Java-ohjelmointi - tai Java ohjelmointi opas
ammattimaiseen osaamiseen -kirjaa.
Olio (Object)
• "An object is simply a real-world thing or concept"
[Scott]
• "Object is a thing which has behavior, state and
identity" [Booch]
– Ohjelmoinnin kannalta:
• Tila (State) = olion attribuuttien sisältämä tieto
• Toiminta (Behavior) = metodit joita oliolle voi suorittaa
• Identiteetti (Identity) = OID (object identifier)
• Kapselointi: Olion tila (=attribuutit) suojataan siten,
että sitä pystytään muuttamaan vain olion
toiminnallisuuden (=metodien) kautta.
Luokka (Class)
• "A class is a collection of objects that have the same
characteristics" [Scott]
• "A class describes a set of objects with an equivalent role or
roles in a system" [Stevens, Pooley]
• UML:ssä luokka kuvataan seuraavasti:
LuokanNimi
attribuutit
metodit
• Kuvauksesta voidaan haluttaessa jättää pois attribuuttien ja / tai
metodien "lokero".
Näkyvyysmääreet
•
•
Toteutusta kuvaavia luokkakaaviota laadittaessa tulee attribuuteille ja
metodeille määritellä niiden näkyvyys.
Tärkeimmät näkyvyysmääreet on kuvattu seuraavassa taulukossa.
Näkyvyys C#:ssa
Symboli UMLluokkakaaviossa
Käyttö mahdollista
public
+
Kaikista ohjelmiston luokista.
protected
#
Ko. luokasta ja sen aliluokista.
private
-
Ko. luokasta.
Nimeämiskäytäntö
•
Toteutusta kuvaavia luokkakaaviota laadittaessa käytetään
toteutuskielen määrittelemää nimistandardia
– C#:ssa luokkien, metodien ja ominaisuuksien nimet alkavat isolla kirjaimella.
– Useamman kuin yhden osat sisältävät nimet kirjoitetaan yhteen siten, että
toisen osan aloittava kirjain on iso (PascalCase/MixedCase).
•
•
Toteutusta kuvaavia luokkakaavioita laadittaessa käytetään
toteutuskielen mukaisia tyyppejä.
Nimien tulee olla mahdollisimman kuvaavia, liiallista lyhenteiden
käyttöä tulee välttää.
– Esim. etunimi (ei eNimi)
•
Nimien tulee olla yleisesti käytössä olevaa terminologiaa.
Nimeämiskäytäntö
•
Luokkien nimet tulee kirjoittaa yksikkömuodossa.
– Esim. Pelaaja (ei Pelaajat)
•
•
Metodien nimien tulee kuvata toimintaa.
Metodeja jotka toteutetaan yleensä aina ja vieläpä samalla tavalla, ei
kannata kuvata luokkakaaviossa.
Alus
- Henkilomaara: int
- Polttoaine: double
- Nopeus: double
+ Alus(): Alus
+ Alus(int, double, double): Alus
+ Alus(Alus): Alus
+ setHenkilomaara(int)
+ setPolttoaine(double)
+ setNopeus(double)
+ getHenkilomaara(): int
+ getPolttoaine(): double
+ getNopeus(): double
+ tankkaa(int): bool
+ kiihdyta(double)
Alus
- Henkilomaara: int
- Polttoaine: double
- Nopeus: double
+ tankkaa(int): bool
+ kiihdyta(double)
Staattiset ominaisuudet ja metodit
•
•
Staattiset ominaisuudet ja metodit esitetään UML-luokkakaaviossa
alaviivan kera.
Staattiset ominaisuudet ja metodit sijoitetaan ennen ei-staattisia
attribuutteja ja metodeja.
Tietokanta
# tietokantayhteys: Connection
- tulosjoukko: ResultSet
+ muodostaYhteys(): boolean
+ suljeYhteys(): boolean
+ suoritaKysely(String)
- tulostaVirheilmoitus(Exception)
•
Attribuutit ja metodit kuvataan laskevassa näkyvyysjärjestyksessä,
laajimman näkyvyysalueen omaavat ensiksi.
Luokkien väliset suhteet
•
Seuraavassa taulukossa on kuvattu tällä kurssilla käsitellyt luokkien
väliset suhteet.
Symboli
Suhde
yhteyssuhde eli assosiaatio
(association)
vahva koostumussuhde
(composition)
periytymissuhde (generalization)
toteutussuhde (realization)
käyttöyhteys (usage)
Yhteyssuhde eli assosiaatio
•
•
•
(Binäärinen) assosiaatio yhdistää toisiinsa kaksi luokkaa, joista luoduilla olioilla on
yhteys toisiinsa.
Assosiaatiolla toisiinsa liitettyjen luokkien välillä on pysyvä suhde.
Assosiaation ominaisuuksia:
–
nimi
•
•
–
kerrannaisuudet:
•
•
•
–
–
kirjoitetaan assosiaatio-symbolin puoliväliin
nimen yhteyteen voidaan merkitä nuolisymboli, joka kuvaa assosiaation lukusuunnan
kerrannaisuudet kirjoitetaan assosiaation päihin, kuvaa kuinka monta "viereisen" luokan oliota voi
liittyä assosiaation "toisen pään" luokan olioon.
Yleisimmät kerrannaisuudet:
– 0..1
suorittaa
1..*
1
Tehtävä
Alus
– 0..*
– 1
– 1..*
Myös muut kerrannaisuuslukemat sallittuja.
Assosiaatiota kutsutaan yksinkertaiseksi, mikäli edes toisen luokan kerrannaisuus on
korkeintaan yksi.
Assosiaatiota kutsutaan moninkertaiseksi, mikäli molempien luokkien kerrannaisuus>1.
Assosiaation toteuttaminen C#:ssa
•
•
Yksinkertaisimmin assosiaatio voidaan toteuttaa C# assosioitavan luokan
tyyppisenä ominaisuutena. Ominaisuuteen talletetaan assosiaation
kuvaama linkki.
Moninkertainen assosiaatio voidaan toteuttaa C#:ssa sopivan attribuuttina
käytettävän tietorakenteen avulla. Koska kerrannaisuuden
maksimilukumäärää ei assosiaatiossa yleensä ole tällöin tiedossa, täytyy
käytettävän tietorakenteen olla dynaaminen.
Assosiaation toteuttaminen C#:ssa
1. Esimerkki yksinkertaisesta assosiaatiosta:
Tehtävä
1..*
suorittaa
1
Alus
public class Alus{
private Tehtava tehtava;
public Tehtava SuoritettavaTehtava {
get { return tehtava;}
set { tehtava=value;}
}
Vahva koostumussuhde
•
Koostumussuhde tulee kysymykseen jo luokan olion voidaan ajatella olevan osa
toisen luokan oliota.
–
•
•
•
Koostuminen on aina yhdensuuntaista, edellisessä esimerkissä ei voida ajatella että
"alus on osa siipeä".
Vahva koostumus (composition) on koostumuksen (aggregate) erityistapaus.
Vahvassa koostumuksessa suhteen molemmilla olioilla on sama elinikä:
–
–
–
•
Esimerkiksi: "Siipi on osa alusta".
Oliot luodaan samalla kertaa.
Oliot tuhotaan samalla kertaa.
Toisen olion osana oleva olio ei voi esiintyä minkään muun olion osana.
Yleensä vahva koostumussuhde pätee lähinnä esineille.
–
–
Työntekijä on osa tiimiä: Kyseessä ei ole vahva koostumus, sillä työntekijä voi varmasti olla
olemassa vielä senkin jälkeen kun tiimi hajotetaan.
Moottori on osa autoa: Kyseessä on yleensä vahva koostumus, sillä auto ja moottori
rakennetaan yhtä aikaa ja myös romutetaan yhtä aikaa.
Auto
1
1
Moottori
Miten vahva koostumussuhde toteutettaisiin
C#:ssa?
•
Koostumussuhteessa olevat oliot tulee luoda samalla kertaa.
•
Lisäksi halutaan varmistaa että toisen olion osana oleva olio ei voi esiintyä minkään toisen olion
osana.
•
Molemmat oliot tulee tuhota samalla kertaa
Periytymissuhde
•
•
Periytymissuhde on kyseessä silloin kun luokan olion voidaan ajatella
olevan myös toisen luokan olio.
Esimerkiksi: "Laiva on alus"
Alus
Laiva
– Yliluokka: Alus
– Aliluokka: Laiva
•
•
Aliluokat sijoitetaan luokkakaaviossa aina yliluokkaansa alemmas.
Aliluokka perii kaikki yliluokkansa ominaisuudet ja toiminnot.
Periytymissuhde & C#
•
•
C#:n kannalta periytymissuhde on edellisiä selkeämpi tapaus, C#:ssa on
syntaksi periytymissuhteen toteuttamiseen.
Esimerkiksi: "Laiva on alus"
Alus
Laiva
• Alus-luokka toteutetaan "normaalisti".
• Laiva-luokan määrittelyssä merkintä ”:”.
public class Laiva : Alus {
...
Abstrakti luokka
•
•
•
•
•
Abstraktilla luokalla ei voi olla ilmentymää  abstrakti luokka täytyy aina
käytännössä periyttää jotta siitä olisi jotain hyötyä.
UML:ssä abstrakti luokka kuvataan kirjoittamalla luokan nimi kursiivilla.
Abstraktilla luokalla on yleensä vähintään yksi abstrakti metodi (eli metodi
joka on ainoastaan määritelty muttei toteutettu).
Abstrakti metodi kuvataan UML:ssä kirjoittamalla metodin nimi kursiivilla.
Abstraktit metodit täytyy toteuttaa aliluokassa.
Alus
- nimi: String
- polttoaine: double
- nopeus: double
+ tankkaa(double): bool
Laiva
+ Tankkaa(double): bool
Abstrakti luokka & C#
•
C#:ssa on syntaksi abstraktin luokan toteuttamiseen:
– Abstraktin luokan määrittelyssä avainsana abstract.
– Abstraktin metodin määrittelyssä avainsana abstract.
abstract class Alus {
private String nimi;
private double polttoaine;
private double nopeus;
public abstract bool Tankkaa(double maara);
Alus
- nimi: String
- polttoaine: double
- nopeus: double
...
}
+ tankkaa(double): bool
class Laiva : Alus {
public override bool Tankkaa(double maara) {
//metodin toteuttavat ohjelmalauseet
Laiva
}
...
}
+ Tankkaa(double): bool
Toteutussuhde
•
•
•
•
Rajapinta on joukko metodien määrittelyitä.
Rajapinnan toteuttavassa luokassa täytyy olla rajapinnassa määritellyille
metodeille toteutukset.
UML:n luokkakaaviossa luokan merkitään olevan rajapinta <<interface>>merkinnällä (merkintää kutsutaan UML:ssä stereotyypiksi).
Rajapintaluokka ei saa attribuutteja.
<<interface>>
Kulkuneuvo
Auto
Toteutussuhde & C#
•
C#:ssa on syntaksi sekä rajapintaluokan määrittelylle, että
rajapintaluokan toteuttamiselle.
<<interface>>
Kulkuneuvo
Auto
interface Kulkuneuvo{
//metodien määrittelyt
...
}
class Auto : Kulkuneuvo{
//metodien toteutukset
...
}
UML-luokkakaavio on laajempi
• Edellä käsiteltiin vain osa UML-luokkakaavion ominaisuuksista.
• Käsittelemättä jäi mm. seuraavaa:
– koostumussuhde (aggregation)
– assosiaation rooli
– assosiaation navigaatio
Lähteet
•
•
•
•
•
UML 2.0 specification:
http://www.omg.org/cgi-bin/doc?ptc/2004-10-02
UML 1.5 specification:
http://www.omg.org/cgi-bin/doc?formal/03-03-01
Grady Booch, 1991: Object Oriented Design with Applications
Kendall Scott, 2001: UML Explained
Scott W. Ambler, 2005: UML Class Diagram Guidelines
– http://www.agilemodeling.com/style/classDiagram.html
•
Genova, Ruiz del Castillo, Liorenz, 2003: Mapping UML Accosiations
into Java Code
– http://www.jot.fm/issues/issue_2003_09/article4.pdf
•
•
Booch, Jacobson, Rumbaugh, 1998: The Unified Modeling Language
Reference Manual
Stevens, Pooley, 2000: Using UML Software engineering with object
and components