Systemutvikling med UML - Institutt for teknisk kybernetikk - NTNU
Systemutvikling med UML - Institutt for teknisk kybernetikk - NTNU Systemutvikling med UML - Institutt for teknisk kybernetikk - NTNU
Systemutvikling med UML Øyvind Stavdahl Institutt for teknisk kybernetikk, NTNU Oktober 2004
- Page 2 and 3: Denne kursbolken er basert på Mart
- Page 4 and 5: Innhold 1. Intro til UML SA/SD vs.
- Page 6 and 7: UML omfatter: 1. En meta-modell - R
- Page 8 and 9: Tre måter å bruke UML på 1. UML
- Page 10 and 11: 2. UML som blåkopi Nøkkel: Komple
- Page 12 and 13: Denne kursbolken: Primært ”UML s
- Page 14 and 15: Sammenliking av SA/SD og UML • Ut
- Page 16 and 17: Analyse: Omgivelser, overordnet fun
- Page 18 and 19: Analyse/konstruksjon (1/3): Informa
- Page 20 and 21: Analyse/konstruksjon (3/3): Funksjo
- Page 22 and 23: Innhold 1. Intro til UML SA/SD vs.
- Page 24 and 25: Use case = bruksmodus • Systemet
- Page 26 and 27: Actors En Actor representerer en ro
- Page 28 and 29: Use case-relevant informasjon (2/2)
- Page 30 and 31: Hvordan ikke bruke use case-diagram
- Page 32 and 33: Innhold 1. Intro til UML SA/SD vs.
- Page 34 and 35: Hva sekvensdiagrammet viser • Hvo
- Page 36 and 37: Synkrone vs. asynkrone meldinger Sy
- Page 38 and 39: Loops and Conditionals
- Page 40 and 41: Fra funksjonelle krav til detaljert
- Page 42 and 43: Innhold 1. Intro til UML SA/SD vs.
- Page 44 and 45: Klasse Navn Attributter Operasjoner
- Page 46 and 47: Eksempel: attributt vs. assosiasjon
- Page 48 and 49: Forskjellen er... Attributter: ”s
- Page 50 and 51: Notasjon - Visibility + Public, dvs
<strong>Systemutvikling</strong> <strong>med</strong> <strong>UML</strong><br />
Øyvind Stavdahl<br />
<strong>Institutt</strong> <strong>for</strong> <strong>teknisk</strong> <strong>kybernetikk</strong>, <strong>NTNU</strong><br />
Oktober 2004
Denne kursbolken er basert på<br />
Martin Fowler, <strong>UML</strong> Distilled, Third Edition<br />
Addison-Wesley, 2004. ISBN 0-321-19368-7<br />
Stoffet er primært hentet fra<br />
kapittel 1-4 og 9-12
To ord om terminologi<br />
Norske ord og begreper bør brukes der de<br />
kan brukes<br />
• <strong>UML</strong> er et engelsk-basert<br />
modelleringsspråk.<br />
• Norske ord brukes her sporadisk når det<br />
er åpenbart hvilket <strong>UML</strong>-begrep vi snakker<br />
om
Innhold<br />
1. Intro til <strong>UML</strong><br />
SA/SD vs. <strong>UML</strong><br />
2. Funksjonskrav:<br />
Use case-diagram<br />
Sekvensdiagram<br />
3. ”In<strong>for</strong>masjons-rommet”:<br />
Klassediagram<br />
4. ”Tilstandsrommet”:<br />
Tilstandsmaskin<br />
Aktivitetsdiagram<br />
5. ”Funksjonsrommet”:<br />
Kommunikasjonsdiagram<br />
Andre <strong>UML</strong>-diagrammer<br />
6. Et lite eksempel<br />
Oppsummering
<strong>UML</strong>:<br />
Unified Modeling Language<br />
• Standardisert grafisk modelleringsspråk<br />
– Primært <strong>for</strong> programvaretunge systemer<br />
• Mange uavhengige og overlappende språk<br />
eksisterte<br />
• <strong>UML</strong> er en sammenstilling og <strong>for</strong>malisering av<br />
noen av disse
<strong>UML</strong> omfatter:<br />
1. En meta-modell<br />
– Rigorøs definisjon av <strong>UML</strong>begreper<br />
– Viktig ved bruk av <strong>UML</strong> som<br />
programeringspråk<br />
2. Grafisk notasjon <strong>for</strong> 13 ulike<br />
diagramtyper<br />
• Activity<br />
• Class<br />
• Communication<br />
• Component<br />
• Composite structure<br />
• Deployment<br />
• Interaction overview<br />
• Object<br />
• Package<br />
• Sequence<br />
• State machine<br />
• Timing<br />
• Use Case
”<strong>UML</strong> is Not Enough!”<br />
• <strong>UML</strong> - flere diagramer enn de fleste<br />
trenger<br />
• <strong>UML</strong> standardisert, systemer <strong>for</strong>skjellige<br />
– <strong>UML</strong> passer ikke alltid like godt<br />
• Bruk bare det du har nytte av!<br />
• Bryt reglene når det er nyttig!
Tre måter å bruke <strong>UML</strong> på<br />
1. <strong>UML</strong> som skisse<br />
2. <strong>UML</strong> som blåkopi<br />
3. <strong>UML</strong> som programmeringsspråk
1. <strong>UML</strong> som skisse<br />
Nøkkel: Selektivitet<br />
• Bare modellere det du trenger akkurat nå<br />
• Rask konkretisering av ideer<br />
• Sammenlikning av alternativer<br />
• Kommunikasjon<br />
– Kunder<br />
– Medarbeidere
2. <strong>UML</strong> som blåkopi<br />
Nøkkel: Kompletthet<br />
• Forward engineering:<br />
– Alle detaljer som programmereren trenger å<br />
vite<br />
• Backwards engineering:<br />
– Komplett grafisk ”innholds<strong>for</strong>tegnelse” <strong>for</strong><br />
systemet<br />
– Typisk automatisert prosess!
3. <strong>UML</strong> som programmeringsspråk<br />
Nøkkel: Modellen er systemet!<br />
• Systemmodellen utgjør kildekoden<br />
Ut<strong>for</strong>dringer:<br />
• Modellen må inneholder ALT<br />
• Lavnivå-algoritmer ofte modellert i tekstbaserte<br />
prog.-språk<br />
• Flere måter å modellere oppførsel på i <strong>UML</strong><br />
– Hvilke(n) skal brukes til programmering?
Denne kursbolken:<br />
Primært ”<strong>UML</strong> som skisse”<br />
• Myk start <strong>for</strong> nye <strong>UML</strong>-brukere<br />
• Bare de ”viktigste” diagrammene
Innhold<br />
1. Intro til <strong>UML</strong><br />
SA/SD vs. <strong>UML</strong><br />
2. Funksjonskrav:<br />
Use case-diagram<br />
Sekvensdiagram<br />
3. ”In<strong>for</strong>masjons-rommet”:<br />
Klassediagram<br />
4. ”Tilstandsrommet”:<br />
Tilstandsmaskin<br />
Aktivitetsdiagram<br />
5. ”Funksjonsrommet”:<br />
Kommunikasjonsdiagram<br />
Andre <strong>UML</strong>-diagrammer<br />
6. Et lite eksempel<br />
Oppsummering
Sammenliking av SA/SD og <strong>UML</strong><br />
• Utviklingsprosess uanvhengig av verktøy<br />
• Sammenlikner verktøyene i lys av et typisk<br />
prosess-rammeverk:<br />
– Analyse (spec., oppførselsmodell)<br />
– Konstruksjon (”byggebeskrivelse”)<br />
– Implementasjon (programmering)<br />
– Dokumentasjon (<strong>for</strong> systemvedlikehold)
Egenskapsrommet<br />
Én - av uendelig mange - måter å dekomponere<br />
systemets egenskaper på<br />
Funksjonsrommet<br />
(hva systemet skal gjøre)<br />
In<strong>for</strong>masjonsrommet<br />
(hva systemet må huske)<br />
Tilstandsrommet<br />
(hvordan systemet skal<br />
reagere)
Analyse: Omgivelser,<br />
overordnet funksjon (1/2)<br />
SA/SD:<br />
Kontekstdiagram<br />
<strong>UML</strong>:<br />
Use case-diagram<br />
tastatur<br />
kortautomat<br />
Bensinstyring<br />
Bensinkunde<br />
Fyll bensin<br />
pistolbryter<br />
display
Analyse: Omgivelser,<br />
overordnet funksjon (2/2)<br />
SA/SD:<br />
Hendelsesliste<br />
<strong>UML</strong>:<br />
Sekvensdiagram<br />
Kunde<br />
Kortautomat<br />
Bensinpistol
Analyse/konstruksjon (1/3):<br />
In<strong>for</strong>masjonsrommet<br />
SA/SD:<br />
Logisk datamodell<br />
<strong>UML</strong>:<br />
Klassediagram<br />
farge<br />
Bil<br />
eies av<br />
regNr<br />
Bil<br />
farge: String<br />
regNr: String<br />
eier<br />
Person<br />
Person
Analyse/konstruksjon (2/3):<br />
Tilstandsrommet<br />
SA/SD:<br />
Tilstandstransisjonsdiagram<br />
<strong>UML</strong>:<br />
Tilstandsmaskin<br />
(aktivitetsd, interaksjonsd.)<br />
S1<br />
S1<br />
Hendelse 2<br />
•Aksjon 2a<br />
•Aksjon 2b<br />
Hendelse<br />
•Aksjon 1a<br />
•Aksjon 1b<br />
Hendelse 2/Aksjon<br />
2a, Aksjon 2b<br />
Hendelse/ Aksjon 1,<br />
Aksjon 1b<br />
S2<br />
S2
Analyse/konstruksjon (3/3):<br />
Funksjonsrommet<br />
SA/SD:<br />
Dataflytdiagram<br />
<strong>UML</strong>:<br />
Kommunikasjonsdiagram<br />
Pros1<br />
Data1<br />
Data2<br />
Pros2<br />
2: data2<br />
Obj1<br />
Obj2<br />
1: Data1
Modellering av<br />
funksjonelle systemkrav<br />
...eller: hvordan finne ut hva kunden<br />
egentlig bestiller, hvordan hun tenker<br />
og hvordan hun ønsker å bruke<br />
systemet.
Innhold<br />
1. Intro til <strong>UML</strong><br />
SA/SD vs. <strong>UML</strong><br />
2. Funksjonskrav:<br />
Use case-diagram<br />
Sekvensdiagram<br />
3. ”In<strong>for</strong>masjons-rommet”:<br />
Klassediagram<br />
4. ”Tilstandsrommet”:<br />
Tilstandsmaskin<br />
Aktivitetsdiagram<br />
5. ”Funksjonsrommet”:<br />
Kommunikasjonsdiagram<br />
Andre <strong>UML</strong>-diagrammer<br />
6. Et lite eksempel<br />
Oppsummering
Use case-diagrammet<br />
Actor Association Use case<br />
Fyll bensin<br />
Bensinkunde
Use case = bruksmodus<br />
• Systemet tilbyr et antall funksjoner som er<br />
aktuelle <strong>for</strong> ulike <strong>for</strong>mål, til ulike tider og<br />
<strong>for</strong> ulike aktører<br />
•Hvert use case er én slik ”bruksmodus”<br />
Summen av alle use cases<br />
=<br />
hele systemets funksjonalitet
Eksempel:<br />
veggmontert elektrisk bryter<br />
Systemets grense<br />
Lysbruker<br />
Betjen<br />
<br />
Montér<br />
Montør
Actors<br />
En Actor representerer en rolle, ikke en<br />
entitet (person, system, fysisk enhet)<br />
• Samme entitet kan utgjøre flere Actors<br />
• Flere entiteter kan utgjøre samme Actor<br />
Alle slags entiteter kan være Actors<br />
•Personer<br />
• Systemer eller enheter
Use case-relevant in<strong>for</strong>masjon<br />
(1/2)<br />
Pre-conditions:<br />
Vilkår som må være tilfredsstilt <strong>for</strong> at use<br />
case’t kan starte<br />
Trigger:<br />
Hendelsen som starter use case’t
Use case-relevant in<strong>for</strong>masjon<br />
(2/2)<br />
Guarrantee:<br />
Det systemet vil garantere er oppfylt ved<br />
avslutningen av use case’t<br />
• Success guarrantee:<br />
Det som garantert er oppfylt etter et vellykket<br />
scenario<br />
• Minimal guarrantee:<br />
Det som er oppfylt etter et hvilket som helst<br />
scenario.
Tekstlig use case-beskrivelse.<br />
Eksempel: Montering av bryter<br />
Montér<br />
Pre-condition: Sikringen er tatt ut.<br />
Trigger: Kunde bestiller<br />
montering av bryter<br />
Suksess-scenario:<br />
1. Montør åpner bryterdekselet<br />
2. Montør fester bryteren til<br />
veggen<br />
3. Montør fester ledningene<br />
4. Montør lukker bryterdekselet<br />
5. Montør setter i sikringen<br />
6. Montør betjener bryteren og<br />
konstaterer at den virker<br />
Utvidelse:<br />
6a: Bryteren virker ikke<br />
.1: Montør fjerner sikringen<br />
... (kopler fra bryteren...)<br />
.n: Montør setter i sikringen<br />
Suksessgaranti:<br />
Bryteren montert og operativ.<br />
Minimal garanti:<br />
Alle strømførende ledninger<br />
isolert eller frakoplet,<br />
sikringen satt i.
Hvordan ikke bruke<br />
use case-diagrammet<br />
• Ikke bruk masse tid på å lage et<br />
”avansert” diagram!<br />
• Ikke prøv å synliggjøre alle spesialtilfeller<br />
• Ikke bruk ”avansert notasjon”<br />
KISS: Keep It Simple and Stupid!<br />
- Alt annet er bortkastet tid!
Hvordan bruke<br />
use case-diagrammet<br />
Betrakt diagrammet som en oversiktlig<br />
”innholds<strong>for</strong>tegnelse” <strong>for</strong> systemets<br />
funksjonalitet<br />
• Detaljene beskrives <strong>med</strong> tekst eller andre<br />
typer diagrammer<br />
• Dette er den verdifulle in<strong>for</strong>masjonen!
Innhold<br />
1. Intro til <strong>UML</strong><br />
SA/SD vs. <strong>UML</strong><br />
2. Funksjonskrav:<br />
Use case-diagram<br />
Sekvensdiagram<br />
3. ”In<strong>for</strong>masjons-rommet”:<br />
Klassediagram<br />
4. ”Tilstandsrommet”:<br />
Tilstandsmaskin<br />
Aktivitetsdiagram<br />
5. ”Funksjonsrommet”:<br />
Kommunikasjonsdiagram<br />
Andre <strong>UML</strong>-diagrammer<br />
6. Et lite eksempel<br />
Oppsummering
Sekvensdiagrammet
Hva sekvensdiagrammet<br />
viser<br />
• Hvordan en gruppe objekter samarbeider<br />
<strong>for</strong> å realisere en oppførsel<br />
• Deltakerne i et scenario (sub-sett av et<br />
use case)<br />
• Sekvensen og naturen i<br />
meldingsutvekslingen mellom deltakerne<br />
• Deltakernes livsløp
Notasjonen er nesten<br />
selv<strong>for</strong>klarende…
Synkrone vs. asynkrone meldinger<br />
Synkron:<br />
Senderen må vente til<br />
meldingen er ”utført”<br />
(typisk: metodekall)<br />
Gammel<br />
notasjon<br />
Sender<br />
Ny<br />
notasjon<br />
Sender<br />
Mottaker<br />
Mottaker<br />
Asynkron:<br />
Senderen <strong>for</strong>tsetter<br />
så snart meldingen er<br />
sendt<br />
(typisk: meldingskø)
Hva sekvensdiagrammet<br />
ikke viser<br />
…iallfall ikke så veldig godt:<br />
• Løkker (loops, ”while…”)<br />
• Alternativer (conditionals; ”if…”, ”switch...”)<br />
…og alt annet som ikke går i ren sekvens.
Loops and Conditionals
Hvordan (ikke) bruke<br />
sekvensdiagrammet<br />
Illustrere scenarier<br />
• Ikke komplette/komplekse algoritmer<br />
• Ikke <strong>for</strong> presis oppførselsemodellering<br />
Unntak finnes<br />
• Sekvensielle algoritmer<br />
• Bilateral kommunikasjon (protokoller)
Fra funksjonelle krav til<br />
detaljert oppførsel<br />
...eller: fra eksternt til internt<br />
perspektiv.
Funksjonrommets<br />
”ortogonale dimensjoner”<br />
Funksjonsrommet<br />
(hva systemet skal gjøre)<br />
In<strong>for</strong>masjonsrommet<br />
(hva systemet må huske)<br />
Tilstandsrommet<br />
(hvordan systemet skal<br />
reagere)
Innhold<br />
1. Intro til <strong>UML</strong><br />
SA/SD vs. <strong>UML</strong><br />
2. Funksjonskrav:<br />
Use case-diagram<br />
Sekvensdiagram<br />
3. ”In<strong>for</strong>masjons-rommet”:<br />
Klassediagram<br />
4. ”Tilstandsrommet”:<br />
Tilstandsmaskin<br />
Aktivitetsdiagram<br />
5. ”Funksjonsrommet”:<br />
Kommunikasjonsdiagram<br />
Andre <strong>UML</strong>-diagrammer<br />
6. Et lite eksempel<br />
Oppsummering
”In<strong>for</strong>masjonsrommet”: Klassediagram
Klasse<br />
Navn<br />
Attributter<br />
Operasjoner<br />
BankKunde<br />
- navn: String<br />
- konto: KontoNummer<br />
- pinKode: Kryptert<br />
+ hentNavn(): String<br />
+ hentKontoNr(): KontoNummer<br />
+ sjekkPinKode(pin: PinKode): Boolean
Klassers egenskaper (Properties)<br />
- to varianter:<br />
Attributter<br />
• ”Member-variable”<br />
Assosiasjoner<br />
• ”Referanser” (i<br />
praksis pekere etc.) til<br />
andre klasser<br />
• Inneholder det direkte<br />
in<strong>for</strong>masjonsinnholdet<br />
i klassen<br />
• In<strong>for</strong>masjon relatert til<br />
klassen selv, men<br />
inneholdt i de<br />
assosierte klassene
Eksempel:<br />
attributt vs. assosiasjon<br />
Bil<br />
farge: String<br />
regNr: String<br />
*<br />
eier<br />
0..1<br />
Person<br />
navn: String<br />
personNr: Integer<br />
adresse: AdrType<br />
Attributt<br />
Assosiasjon<br />
Begge klassene utviser egenskaper som er<br />
relevante <strong>for</strong> Bil.
Hva er <strong>for</strong>skjellen...?<br />
farge<br />
regNr<br />
Bil<br />
eier<br />
0..1<br />
navn<br />
Person<br />
Bil<br />
farge<br />
regNr<br />
eierNavn<br />
”An attribute is the ghost of a class without attributes”
Forskjellen er...<br />
Attributter:<br />
”små” egenskaper (elementære datatyper)<br />
Assosiasjoner:<br />
mer signifikante ”ting” (egenskaper) som har<br />
sine egne attributter
Notasjon<br />
Tenk ”variabeldeklarasjon”.<br />
Generell notasjon:<br />
visbility name: type multiplicity = default {property-string}<br />
– Kun name er obligatorisk<br />
Noen raske eksempler:<br />
+ farge: String [1..*] = ”sjokkrosa”<br />
- pinKode: Digit [4]
Notasjon - Visibility<br />
+ Public, dvs synlig uten<strong>for</strong> klassen<br />
- Private, dvs. usynlig uten<strong>for</strong> klassen<br />
m.fl.<br />
Eksempel:<br />
- pinKode: Digit [4]
Notasjon - Type<br />
Igjen: tenk ”variabeldeklarasjon”.<br />
Type angir hva slags data som kan<br />
inneholdes i attributten<br />
(type er irrelevant <strong>for</strong> assosiasjoner)<br />
Eksempel:<br />
alder: Integer<br />
finished: Boolean
Notasjon - Multiplisitet<br />
1 Nøyaktig én<br />
0..2 0, 1 eller 2<br />
* 0 eller flere<br />
Ingen multiplisitet angitt => 1<br />
Eksempler:<br />
Person<br />
barn<br />
*<br />
hender: Hånd [0..2]<br />
hår: Hårstrå [*]<br />
ektefelle<br />
0..1
Angir tilleggsegenskaper:<br />
Notasjon –<br />
Property-string<br />
readOnly<br />
ordered<br />
osv.<br />
Kan ikke endres<br />
Ordnet mende (dvs.<br />
elementenes rekkefølge fast)<br />
Eksempel:<br />
navn: String = ”Nemo” {readOnly}
Bidireksjonelle assosiasjoner (1/2)<br />
Person<br />
eier<br />
0..1<br />
*<br />
Bil<br />
Merk to ”navigerbarhespiler”<br />
To egenskaper som er <strong>for</strong>bundet som<br />
”inverse”:<br />
• Person har egenskapen<br />
biler: Bil [*]<br />
• Bil har egenskapen<br />
eier: Person [0..1]
Bidireksjonelle assosiasjoner (2/2)<br />
Person<br />
eier<br />
0..1 *<br />
Bil<br />
Hvor<strong>for</strong>?<br />
Begge klasser avhenger av tjenester fra<br />
den andre<br />
Spesiell praktisk ut<strong>for</strong>dring:<br />
Synkronisering – begge ”referansene” må<br />
være gyldige til enhver tid
Operasjoner<br />
Tenk ”metodedeklarasjoner”.<br />
Generell notasjon:<br />
visbility name (parameter list): return-type {property-string}<br />
Eksempel:<br />
+ sjekkPinKode(pin: PinKode): Boolean {query}
Notasjon - Property-string<br />
Property-string angir tillegsegenskaper <strong>for</strong><br />
operasjonene:<br />
query<br />
modifier<br />
osv.<br />
Endrer ikke klassens tilstand<br />
Endrer klassens tilstand<br />
Eksempel:<br />
+ sjekkPinKode(pin: PinKode): Boolean {query}<br />
+ settPinKode(pin: PinKode): Boolean {modifier}
Til ettertanke<br />
• Omverdenen aksesserer ofte properties<br />
via aksessorer (query-operasjoner).<br />
• Den som kaller aksessoren kan ikke<br />
avgjøre om den mottar eksplisitt lagrede<br />
data eller beregnede data.<br />
• Det er mao. i utgangspunktet ingen direkte<br />
korrelasjon mellom <strong>UML</strong>-begrepene og<br />
programkoden.
Til etterlevelse<br />
...der<strong>for</strong> bør du (utviklingsteamet, bedriften)<br />
etablere en praksis som definere en slik<br />
korrespondanse.<br />
Dette kan bety at du bevisst gjør en<br />
begrenset tolkning av <strong>UML</strong>, og at du kun<br />
benytter et subsett av notasjonen.
Notasjon - Generalisering<br />
Arv i <strong>UML</strong><br />
Person<br />
Kvinne<br />
Mann<br />
Frimurer
Avhengighet (Dependency)<br />
Client Supplier<br />
Sirkeline<br />
<br />
Trigonometrix<br />
dependency<br />
Scenario: Sirkeline lager sirkler. Til dette trenger<br />
hun funksjonalitet som Trigonometrix tilbyr.<br />
• Hvis Trigonometrix <strong>for</strong>andrer oppførsel, kan<br />
dette få følger <strong>for</strong> Sirkeline slik at hun også må<br />
endre seg.<br />
• Trigonometrix er derimot helt uavhengig av<br />
Sirkeline.
Vær uAvhengig!<br />
<strong>UML</strong> 2.0 definerer 10 ulike Dependencies...<br />
• Fare: Overlessede diagrammer<br />
• Vis bare signifikante relasjoner<br />
• Evt. egne diagrammer <strong>med</strong> fokus på<br />
avhengigheter<br />
• Som skapt <strong>for</strong> automatisk reverse<br />
engineering!!!
Hva så <strong>med</strong> alt det andre...?<br />
Constraint Rules: I <strong>UML</strong> kan du skrive hva som<br />
helst i diagrammet, på et hvilket som helst språk,<br />
bare du setter det i krøllparentes:<br />
{korrekthetssjekk: alder>0 år}<br />
Dessuten har vi ”kommentarboksen”:<br />
Se opp <strong>for</strong><br />
runde <strong>for</strong>mer!<br />
Sirkeline