Escolar Documentos
Profissional Documentos
Cultura Documentos
Lennart Andersson
Datavetenskap, LTH
20 januari 2013
Inledning
UML r en grafisk notation fr utformning och beskrivning av objektorienterade system. Akronymen str fr Unified Modeling Language. Notationen skapades av Booch, Rumbaugh och Jacobson
i slutet av 1990-talet genom att de samordnade sina respektive notationer. UML har snabbt blivit
en standard och det finns mnga bcker och modelleringsprogram som anvnder den.
Denna uppsats beskriver den triviala delen av UML-anvndning, syntaxen fr notationen, dvs
reglerna fr hur UML-diagram fr ritas. Vi ger ocks mening, semantik, t notationen genom att
relatera till Java-implementeringar. Vi kommer inte alls att diskutera relationen mellan verkligheten och UML-modellen och vad som r bra eller dlig design. Det finns ett tiotal olika sorters
diagram i UML. Vi skall bara behandla ngra.
Den formella specifikationen av UML [2] omfattar ver 1000 sidor. Specifikationen erbjuder mnga
fler mjligheter och strre friheter n vad som presenteras hr. I vissa detaljer r specifikationen
entydig medan den i andra lmnar stort utrymme fr olika tolkningar. Vid bedmningen av lsningar till problem givna i kursen r det denna skrift som utgr norm.
Klassdiagram
Ett klassdiagram beskriver den statiska strukturen fr modellen eller det program som representerar modellen, dvs vilka klasser som finns och hur dessa r relaterade. Detta r information som
r ltt att extrahera ur programkoden och mnga modelleringsprogram kan ta kllkod som indata och producera ett klassdiagram. De kan ofta ocks g den andra vgen och producera kllkod
frn ett klassdigram. Ett klassdiagrammet innehller inte all information som finns i programmet. Implementering av operationer (metoder) ingr normalt inte klassdiagrammet. Omvnt kan
klassdiagrammet innehlla information som inte alltid gr att utlsa ur programmet. Det kan
handla om modellerarens intentioner betrffande relationer mellan klasser.
Huvudkomponenterna i ett klassdiagram r klasser, grnssnitt (interface) och flera sorters relationer.
2.1
Stereotyper
2.2
Klasser
En klass representeras med en rektangel som innehller en till tre avdelningar separerade av
horisontella linjer. Den frsta avdelningen innehller klassnamnet, den andra klassens attribut
och en tredje dess metoder. Avdelningarna med attribut och metoder behver inte innehlla alla
attribut och metoder och fr utelmnas helt.
Klassen Integer i java.lang kan beskrivas, med kande detaljrikedom, p fljande stt.
Integer
Integer
compareTo(Object): int
equals(Object): boolean
toString(): String
Notera att returtyper anges efter kolon. Det r tilltet att utelmna parametertyper och returtyper under frutsttning att detta gres konsekvent inom ett diagram. I nsta diagram visas
att statiska attribut och metoder markeras med understrykning och att attribut kan ges initialvrden. Man kan anvnda stereotyper som rubriker i metodlistor: constructor, query och
update.
Integer {final}
+ MAX_INT: int = 0x7fffffff
- value: int
+ Integer(int)
+ Integer(String)
# clone(): Object
+ intValue(): int
+ compareTo(Object): int
+ equals(Object): boolean
+ hashCode(): int
+ toString(): String
+ valueOf(String): Integer
Integer
MAX_INT: int = 0x7fffffff
constructor
Integer(int)
Integer(String)
query
intValue(): int
compareTo(Object): int
equals(Object): boolean
toString(): String
factory
valueOf(String): Integer
Det sista diagrammet visar synlighet fr namnen med + fr public, # fr protected och - fr
private. Paketsynlighet anges med ~. Ytterligare egenskaper fr klassen, attributen eller metoderna, som t ex final, kan noteras inom klamrar.
2.3
Namn p abstrakta klasser och metoder markeras med kursiv stil eller nr detta r otydligt med
{abstract}.
Ett grnssnitt (interface) ritas ocks som en rektangel med stereotypen interface ovanfr namnet p grnssnittet. Grnssnitt har ingen avdelning fr attribut, men vl fr metoder.
interface
Comparable
compareTo(Object): int
Number {abstract}
intValue(): int
longValue(): long
floatValue(): float
doubleValue(): double
2.4
Relationer
2.5
Generalisering
Nr en Java-klass utvidgar eller rver en annan klass ritas detta alltid som en generalisering
med en ofylld triangelpil mot superklassen. Om en klass har flera subklasser lter man dem ofta
dela p pilen.
Number
Number
Integer
Integer
2.6
Double
Realisering
En Java-klass som implementerar ett grnssnitt ritas med en streckad pil med en ofylld triangel
mot grnssnittet. En frenklad variant erstter grnssnittsrutan med en liten cirkel med namnet
p grnssnittet vid sidan.
interface
Comparable
Comparable
Integer
Integer
Martin [1] ritar ibland, i strid med UML, heldragna i stllet fr streckade pilar vid realisering.
2.7
Parametriserade klasser
I vissa objektorienterade sprk kan man definiera klasser som har klassnamn som formella parametrar. I Java kallas detta fr generiska klasser och i C++ fr template. Detta innebr att man
kan definiera en List-klass med en parameter som talar om vilken typ elementen har. Nr man
instansierar en sdan klass i programmet anger man den aktuella elementtypen som argument.
I UML beskrivs denna konstruktion och instansiering med
T
List
add(T)
elementAt(int): T
List<String>
I Java version 1.5 har Collection-klasserna i jav.util blivit generiska. Man kan t ex deklarera
och skapa en lista som bara kan ha strngar som element:
2.8
Associationer
Nr en klass innehller ett attribut av en annan klass finns det en tydlig relation mellan klasserna som kallas fr association. I sdana sammanhang r det vanligt att inte visa attributet i
klassrutan utan istllet rita en linje mellan klasserna. Nr det i denna kurs freskrivs att man
skall konstruera ett klassdiagram med associationer betyder detta alla attribut som inte r primitiva typer eller har typen String skall ritas som associationer och inte visas i attributrutan.
Normalt stter man ett namn p associationen ovanfr linjen som klargr relationen. Man kan
tillfoga en fylld triangel vid namnet som visar i vilken riktning namnet skall tolkas i frhllande
till klasserna. En sdan triangel pverkar inte implementeringen.
Vid associationens ndar kan man ange roller, som ofta verensstmmer med attributnamn i
programmet, och multipliciteter, som anger hur mnga instanser av den ena klassen som finns
i en instans av den andra. Multipliciteten r ett heltal, som 1 eller 2, eller ett intervall, som
0..2. Man anvnder symbolen * fr ett obegrnsat antal, ensamt eller i intervall som 1..*. Det
r tilltet, men sllan meningsfullt, att kombinera flera multipliciteter med kommatecken. Rollnamn och multipliciteter som anvnds i en klass skrives nrmast den andra klassen och dr r
placeringen fri (ver/under etc).
Company
Company
employs
company
Person
employee
Person
Man kan tydligare visa vilka klasser i en association som har attribut av den andra klassen
genom att stta ut navigeringspilar och navigeringskryss. I figuren nedan har Company-klassen
ett Person-attribut medan Person-klassen saknar Company-attribut.
employs
Company
Person
2.9
Om man vill gra tydligt att ett objekt utgr en del av eller innehller ett annat objekt dekorerar
man associationen p garsidan med en ofylld romb. Detta kallas aggregering. Ett objekt kan
vara aggregerat till flera andra objekt. I exemplet har en kurs, Course, referenser till 0 eller flera
studenter och en studentkr, Union, referenser till studenter.
Course
Student
Union
Ibland r associationen starkare s att garobjektet inte r meningsfullt utan sina delar och varje
del har exakt en gare. D fyller man romben och kallar det fr en sammansttning (composition).
Ibland r associationen starkare s att garobjektet inte r meningsfullt utan
*
Keyboard
Key
2.10
Inkapsling
I Java kan man deklarera en klass inuti en annan. Anledningen kan vara att man vill ge objekt av den inre klassen direkt tillgng till alla attribut och metoder, ven privata sdana, i den
omgivande klassen.
class Outer {
private int n;
class Inner {
...
n = 1; ...
}
}
I denna typ av inkapsling (inner class) r det bara ett Outer-objekt som kan skapa ett Inner-objekt
och detta fr allts tillgng till de privata delarna av sin skapare.
En annan anledning att nstla klassser r att man vill gra en klass osynlig utanfr den omgivande klassen, men att den i vrigt inte skall ha ngra srskilda privilegier betrffande instanser av
den omgivande klassen. I detta fall skall den nstlade klassen vara static (static nested class).
class Outer {
private static class Inner {
...
}
}
Ofta anvnds nstlade klasser fr att representera den yttre klassens interna tillstnd och br
drfr vara privata. I UML anvnds fljande notation fr en sdan privatisering. Om man vill
gra det tydligt vilken form av inkapsling det handlar om kan man sjlv introducera en stereotyp.
Outer
2.11
Inner
Outer
inner
Inner
Beroenden
Om en klass har en metod med ngon parameter eller returvrde av en annan klass utan att ha
ngra attribut av denna klass ritar man relationen med en streckad beroendepil med pilen mot
den andra klassen. I fljande exempel har grnssnittet Observer en metod.
interface Observer {
Object update(Observable observable, Object object);
}
interface
Observer
2.12
> Observable
Associationsklass
Det finns en hybrid mellan klass och association, en associationsklass, som enligt UML-specifikationen r en klass med associationsegenskaper eller omvnt. En associationsklass ritas som en
streckad linje som ansluter mitt p en association och slutar med klassruta.
Intentionen r att till varje par av associerade objekt finns exakt ett objekt som kan innehlla
attribut och metoder i vanlig ordning. Standardexemplet visar en association mellan Company
och Person dr varje anstllningsrelation r kopplad till ett objekt som innehller uppgift om t ex
ln. En person kan vara anstlld vid flera fretag men ha hgst en anstllning hos ett fretag.
Company
Person
Job
salary: int
Det finns ingen direkt motsvarighet till en associationsklass i Java.
2.13
Kvalificerad association
I den frsta figuren nedan kan ett Company-objekt referera till mnga Person-objekt. Fr att komma t en person med givet namn mste man itererar ver personerna tills man hittar rtt objekt.
Om vi kan anvnda ett index eller en nyckel fr att direkt hitta rtt objekt ritar vi detta som en
kvalificerad association som i figuren till hger. Notera att multipliciteten p personklassen nu
br vara 0 eller 1; fr ett givet namn br det finns hgst en person.
6
Company
Company
Person
name:String
Person
I implementeringen av Company anvnder vi kanske en hashtabell eller en databas med personnamnet som nyckel.
class Company {
Map employees = new HashMap();
}
2.14
Objekt
Fr att illustrera hur en datastruktur ser ut i minnet vid ett visst tillflle under exekveringen
kan man rita ett objektdiagram med objektrutor analogt med klassrutor. Namnavdelningen skall
innehlla ett eventuellt objektnamn, ett kolon och ett klassnamn och allt skall vara understruket.
Aktuella vrden p attribut kan uppvisas.
erik: Person
: Person
name = "Erik Ek"
salary = 18000
Enkla aritmetiska uttryck kan modelleras enligt klassdiagrammet till vnster. Den datastruktur
som representerar uttrycket (1 + 2) + 3 visas till hger:
: Add
Expr
: Add
Int
value: int
: Int
value=3
Add
: Int
value=1
: Int
value=2
Linjerna mellan objekten kallas lnkar (link) och fr dekoreras med navigationspilar och aggregeringssymboler.
2.15
Anteckningar (notes) r rutor som kan innehlla all slags textinformation, som t ex programkod
och kommentarer. Rutans vre hgra hrn skall vara vikt. Anteckningsrutor frbinds med de
komponenter i ett diagram som de berr.
En restriktion r ett logiskt uttryck omgivet av klamrar. En restriktion kan placeras p en streckad linje med eller utan pil mellan tv element i ett diagram eller inuti en anteckning med frbindelse till relevanta element.
Person
memberOf
Company
{subset}
headOf
2.16
Paket
Relationer mellan paket kan beskrivas. En paketruta ritas med en tab-ruta ovanfr till vnster.
Namnet p paketet skrivs i tabrutan. Om paketrutan r tom fr namnet skrivas dr.
java
awt
lang
<
import
event
Vanliga beroendepilar anvnds fr paket. De mrks med access eller import, dr det senare
betyder att paketet importeras s att klassnamn kan anvndas utan kvalifikation. Ett paket som
r ett ramverk kan frses med stereotypen framework.
Det r tilltet att rita klassrutor inuti en paketruta och frse dem med synlighetsattribut.
I stllet fr att rita ett paket inuti ett annat kan anvnda inneslutningssymbolen (
).
Om man anvnder ett klassnamn frn ett annat paket kvalificeras det p C++-maner,
java::awt::Frame.
Sekvensdiagram
I ett sekvensdiagram visar man en dynamisk bild av en del av exekveringen av ett program. Det
finns en tidsaxel som normalt tnks riktad nedt. De aktuella objekten ordnas horisontellt. Varje
objekt har en streckad vertikal livslinje som visar nr det existerar. Ett objekt som skapas visas
p den plats efter tidsaxeln dr det skapas. Ett objekt aktiveras nr ngon metod i objektet anropas. Man ritar en pil med fylld spets frn det aktiverande till det aktiverade objektet. Livslinjen
vergr d i en lngsmal rektangel som slutar vid metodaktiveringens upphrande. terhoppet
frn metodaktiveringen kan makeras med en streckad pil med ppen pilspets. terhoppspilar fr
utelmnas. Vid aktiveringspilarna fr man visa metodanrop och hur returvrden tas om hand.
:Command
exec(id,date,time)
emp=getId()
>
:DataBase
emp:Employee
>
<
tc=new TimeCard(date,time)
> tc:TimeCard
add(tc)
<
>
<
>)
Ett metodanrop kan initieras av en mnniska eller ett program eller hrdvara utanfr det system
man modellerar. I sekvensdiagrammet ritas en sdan aktr som en streckgubbe. Om en metod
aktiverar en annan metod i samma objekt ritas aktiveringsrektangeln delvis ovanp den frsta
aktiveringen. Om ett objekt upphr att existera avslutas livslinjen med ett stort kryss.
:Window
kill()
>
erase()
<
4
4.1
Tillstndsdiagram
Speciella tillstnd
Starttillstndet fr ett system anges med en liten fylld cirkel. Ofta finns det en omedelbar
vergng frn starttillstndet till ett annat tillstnd.
Ett system kan ocks ha ett sluttillstnd som ritas som en liten cirkel som innehller en mindre
fylld cirkel. Det fr inte finnas ngra vergngar frn ett sluttillstnd.
>
Sleep
do/sleep
>
4.2
Tillstndsvergngar
Ibland uppvisar ett objekt olika beteende beroende p i vilket tillstnd det befinner sig. Fljande
exempel beskriver en digital klocka som har tv knappar fr att stlla in tiden. Med den ena
knappen, mode, vljer man om klockan skall visa tiden, ge mjlighet att ndra timmar eller att
ndra minuter och med den andra, inc, kar man timvrdet eller minutvrdet. Klockan befinner
sig allts i ett av tre tillstnd, Display, SetHours och SetMinutes.
I ett tillstndsdiagram ritas tillstnden som rektanglar med rundade hrn och vergngar mellan
dem som pilar.
inc/hours++
inc/minutes++
>
Display
mode
do/display time
>
SetHours
do/display hours
mode
mode
>
SetMinutes
do/display minutes
4.3
Enkla tillstnd
Ett enkelt tillstnd har i regel ett namn som anges i den vre delen av rektangeln. Namnet br
indikera vad som frsiggr nr objektet befinner sig i tillstndet men vilka tgrder som vidtages
anges i den nedre delen av rektangeln med hjlp av den notation som beskrivs i nsta avsnitt.
TypingPassword
entry/setNoEcho
type(chr)/stringBuilder.append(chr)
exit/setEcho
4.4
vergngsstrngar
10
Det finns ngra frdefinierade interna hndelser fr varje tillstnd som bara fr anvndas i den
nedre halvan av en tillstndsrektangel. De r entry som intrffar nr man kommer in i ett tillstnd, exit som intrffar nr man lmnar ett tillstnd och do som anvnds fr att ange tgrder
som fretas hela tiden man befinner sig i ett tillstnd.
4.5
vergngar
Externa hndelser ger normalt upphov till tillstndsvergngar. En sdan vergng ritas med en
pil mellan tillstnden tillsammans med en vergngsstrng som anger nr vergngen skall ske
och eventuell tgrd som skall vidtas. Om det saknas en vergngsstrng p en vergng innebr
detta att vergngen sker omedelbart.
dialDigit(chr)[not complete]
<
Dialling
after(20 sec)
dialDigit(chr)[complete]/connect
TimeOut
Connecting
Tillstndsdiagram skall vara deterministiska s att en hndelse i ett givet tillstnd inte kan ge
upphov till tv olika vergngar. Olika hndelser frutstts ej intrffa samtidigt.
4.6
Sammansatta tillstnd
Ett tillstnd kan innehlla ett tillstndsdiagram med starttillstnd, vergngar och sluttillstnd.
Detta kan vara lmpligt fr att strukturera ett stort diagram och visa strukturen p de sammansatta tillstnden separat. Det kan ocks frenkla diagrammet om mnga eller alla tillstnd har
en vergng till ett tillstnd utanfr det sammansatta. Detta utnyttjas i fljande exempel. Om
man befinner sig ngonstans i det sammansatta tillstndet Active och uppringaren lgger p
luren s hamnar man i tillstndet Idle.
Active
after(15 sec)
after(15 sec)
dial digit(n)
DialTone
do/play tone
caller
lifts
receiver
Timeout
do/play message
Dialing
dial digit(n)
[incomplete]
Idle
dial digit(n)[valid]
/connect
caller
hangs up
/disconnect
Pinned
callee
hangs up
callee answers
Talking
Referenser
Connecting
busy
Busy
do/play busy tone
connected
Ringing
do/play ring tone
11
1. Martin, R.C., Agile Software Development Priciples, Patterns, and Practices, PrenticeHall, 2002.
Referenser
1. Martin, R.C., Agile Software Development Priciples, Patterns, and Practices, Prentice-Hall,
2002.
2. Object Managment Group, Unified Modeling Language (UML), version 1.5,
http://www.uml.org/.
12