Você está na página 1de 12

UML-syntax

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

Strngar omgivna av franska citationstecken, stereotype, kallas fr stereotyper och anvnds


fr att frtydliga anvndningen av en klass eller relation. En del stereotyper har givna betydelser
i UML, som t ex interface, import och access, medan andra fr introduceras fritt.

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

Abstrakta klasser och grnssnitt

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

Det finns fem sorters relationer mellan klasser:


En generalisering beskriver att en klass r en subklass till en annan.
En realisering beskriver att en klass implementerar ett grnssnitt (interface).
En association beskriver att en klass har ett attribut av en annan klass eller omvnt.
En inkapsling beskriver en situation dr en klass r deklarerad inuti en annan fr att gra
den osynlig fr andra klasser.
Ett beroende beskriver en relation mellan tv klasser av annat slag n de ovanstende som
medfr att den beroende klassen kan behva modifieras om den andra klassen frndras.
I ett klassdiagram visas relationer som linjer eller kurvor som frbinder klasser. Olika sorters associationer anvnder dekorationer som pilar, stereotyper och streckning. Att det finns en relation
mellan tv klasser syns i Java-koden genom att klassnamnet fr den ena klassen anvnds i den
andra. Detta innebr att den senare klassen inte kan kompileras utan att den frstnmnda finns
tillgnglig.

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:

List<String> list = new ArrayList<String>();

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

I programmet kan man finna


class Company {
List employee = new ArrayList();
}
class Person {
Company company;
}

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

Om de finns attribut p mse sidor ritar man pilar t bda hllen.


Om man anvnder ngon navigeringspil i ett diagram s tolkas alla associationer utan navigeringspilar som dubbelriktade. I ett diagram utan navigeringspilar har man inte specifierat hur
man kan navigera.

2.9

Aggregering och sammansttning

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

Fr en sammansttning r det normalt garobjektet som skapar delobjekten och ansvarar fr


att de frsvinner nr garobjektet tas bort. I sprk med automatisk minnestervinning (garbage
collection), som Java, tervinnes orefererat minne av exekveringssystemet nr behov uppstr.

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 och restriktioner

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

This restriction means that a head of a


committee is also a member of the committee.

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)

<

>

<

Vi ser att ett Timecard-objekt skapas under exekveringen av exec-metoden. De sm pilar (


som Martin anvnder fr parametrar och returvrden saknas i UML.

>)

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

Ett tillstndsdiagram beskriver en tillstndsmaskin.

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

En vergngsstrng har formen


event(parameters)[guard]/action
Hr r event namnet p en hndelse som kan ha parametrar, guard r ett logiskt villkor och
action r tgrd som skall utfras om hndelsen intrffar och villkoret r sant. Om det finns flera
parametrar separeras de med kommatecken.
En hndelse r normalt en signal frn omvrlden som skall pverka systemet, som t ex en knapptryckning eller en sensor som larmar. Hndelsenamnet kan ha parametrar fr att man bekvmt
skall kunna hantera likartade hndelser. Om man trycker p siffran n p en telefon kan detta representeras med hndelsen dial(n). Villkoret kan innehlla parametrarna och attribut i programmet. tgrden anges med ett beskrivande namn, ett anrop av en metod eller av programsatser.
Bde villkoret och tgrden fr utelmnas tillsammans med sina avgrnsare. Utan villkor utfrs
tgrden alltid om hndelsen intrffar. Utan tgrd sker bara en tillstndsvergng. Man kan
ocks utelmna hndelsen varvid villkoret testas hela tiden och tgrden utfres nr det r sant.
Man anvnder after(time) fr att beteckna hndelsen att man befunnit sig i ett tillstnd tiden
time och when(condition) fr hndelsen att villkoret condition blir sant.

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]

dial digit(n)[not valid]


Invalid
do/play message

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

callee answers/enable speech

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

Você também pode gostar