# &UML;, det basale

## Om &UML;

Dette kapitel giver en hurtig oversigt over det basale i &UML;. Husk at dette ikke er en fuldstændig &UML;-vejledning. Hvis du vil lære dig mere om Unified Modelling Language, eller om almen analyse og konstruktion af programmel, henvises du til en af de mange bøger som er tilgængelige om emnet. Der er også mange vejledninger på internettet, som du kan bruge som et startpunkt.

Unified Modelling Language (&UML;) er et diagrambaseret sprog eller notation til at specificere, visualisere og dokumentere modeller af objektorienteret programmel. &UML; er ikke en udviklingsmetode, hvilket betyder at den ikke fortæller for dig hvad du skal gøre først og hvad du skal gøre derefter, eller hvordan du skal konstruere dit system, men den hjælper til at visualisere konstruktionen og kommunikere med andre. &UML; styres af Object Management Group (OMG), og er en industristandard for at beskrive modeller af programmel.

&UML; er konstrueret for design af objektorienteret programmel, og har begrænset brug for andre programmeringsparadigmer.

&UML; er opbygget af mange modelleringselementer som repræsenterer forskellige dele af programmelsystemet. UML-elementerne bruges til at oprette diagrammer, som repræsenterer en vis del, eller en synspunkt for systemet. Følgende slags diagrammer understøttes af &umbrello;:

- Brugstilfælde-diagrammer viser aktører (mennesker eller andre brugere af systemet), brugstilfælde (scenarier når de bruger systemet), og deres forhold

- Klassediagrammer viser klasser, og forholdene mellem dem

- Sekvensdiagrammer viser objekter og deres og en sekvens af metodekald de laver til andre objekter.

- Samarbejdsdiagrammer viser objekter og deres forhold, med betoning på objekter som deltager i udveksling af meddelelser

- Tilstandsdiagrammer viser tilstande, tilstandsændringer og begivenheder for et objekt eller en del af systemet

- Aktivitetsdiagrammer viser aktiviteter, tilstander og tilstandsændringer for objekter og begivenheder som sker i en del af systemet

- Komponentdiagrammer viser programmeringskomponenter på højt niveau (såsom Kparts eller Java Beans).

- Udplaceringsdiagrammer viser komponenternes instanser og deres indbyrdes forhold.

## &UML;-elementer

### Brugstilfældediagram

Brugstilfældediagrammer beskriver forhold og afhængighed mellem en gruppe brugstilfælde og aktører som deltager i processen.

Det er vigtigt at observere at brugstilfældesdiagrammer ikke er passende til at repræsentere konstruktioner, og ikke kan beskrive systemets indre dele. Brugstilfældediagrammer er beregnede til at muliggøre kommunikation med fremtidige brugere af systemet, og med kunden. De er til særlig hjælp for at afgøre hvilke funktioner som det kræves at systemet skal have. Med andre ord fortæller brugstilfældediagrammer om hvad systemet skal gøre, men de angiver ikke — og kan ikke angive — hvordan dette skal opnås.

Et eksempel på et brugstilfældediagram. &umbrello; som viser et brugstilfældediagram

&umbrello; som viser et brugstilfældediagram

#### Brugstilfælde

Et brugstilfælde beskriver — fra aktørernes synvinkel — en samling aktiviteter i et system, som giver anledning til et konkret, væsentligt resultat.

Brugstilfælde er beskrivelser af typisk vekselvirken mellem brugerne af et system og systemet selv. De repræsenterer systemets ydre grænseflade, og angiver en slags krav på hvad systemet skal gøre (husk, kun hvad, ikke hvordan).

Ved arbejde med brugstilfælde, er det vigtigt at huske nogle enkle regler:

- Hvert brugstilfælde hører sammen med mindst en aktør

- Hvert brugstilfælde har et ophav (dvs. en aktør)

- Hvert brugstilfælde leder til et relevant resultat (et resultat med forretningsværdi).

Brugstilfælde kan også have forhold til andre brugstilfælde. De tre mest typiske slags forhold mellem brugstilfælde er:

- <<include>> (indeholder), hvilket angiver at brugstilfældet finder sted inde i et andet brugstilfælde

- <<extends>> (udvider), hvilket angiver at i visse tilfælde, eller i et tilfælde (som kaldes et udvidelsespunkt), bliver et brugstilfælde udvidet af et andet.

- Generalisering angiver at et brugstilfælde arver egenskaberne for super-brugstilfældet, og kan sætte nogen af dem ud af kraft, eller tilføje nye på samme måde som arv mellem klasser.

#### Aktør

En aktør er en ekstern enhed (udenfor systemet) som vekselvirker med systemet ved at deltage i (og ofte indlede) et brugstilfælde. Aktører kan i virkeligheden være mennesker (for eksempel brugere af systemet), andre maskinesystemer eller ydre begivenheder.

Aktører repræsenterer ikke fysiske mennesker eller systemer, men deres rolle. Det betyder at når en person vekselvirker med systemet på forskellige måder (antager forskellige roller) repræsenteres han ved flere aktører. En person som for eksempel giver kundeunderstøttelse via telefon og tager imod bestillinger fra kunden til systemet, vil blive repræsenteret af en aktør Kundeunderstøttelsespersonale og af en aktør Salgsrepræsentant.

#### Beskrivelse af brugstilfælde

En beskrivelse af et brugstilfælde er en tekstbaseret beretning om brugstilfældet. Det er ofte i form af en note eller et dokument som på en eller anden måde er linket til brugstilfældet, og forklarer processerne eller aktiviteterne som finder sted i brugstilfældet.

### Klassediagram

Klassediagrammer viser de forskellige klasser som opbygger et system og hvordan de relateres til hinanden. Klassediagrammer siges at være statiske diagrammer, fordi de viser klasserne, sammen med deres metoder og attributter, samt det statiske forhold mellem dem: hvilke klasser der kender til andre klasser, eller hvilke klasser der er en del af andre klasser, men viser ikke metodekald mellem dem.

Et eksempel på et klassediagram Umbrello som viser et klassediagram

Umbrello som viser et klassediagram

#### Klasse

En klasse definerer attributterne og metoderne for en mængde af objekter. Alle objekter af klassen (instanser af klassen) deler samme opførsel, og har samme mængde af attributter (hvert objekt har sin egen mængde). Udtrykket type bruges ind imellem i stedet for klasse, men det er vigtigt at nævne at de to ikke er det samme, og at type er et mere generelt udtryk.

Klasser i &UML; repræsenteres af rektangler, med klassens navn, og kan også vise klassens attribut og operationer i to afdelinger inde i rektanglet.

En klasse i &UML; Visuel repræsentation af en klasse i &UML;

Visuel repræsentation af en klasse i &UML;

##### Attribut

Attributter i UML vises i det mindste med deres navne, og kan også vises med type, oprindelig værdi og andre egenskaber. Attribut kan også vises med synlighed:

- `+` Står for åbne (public) attributter

- `#` Står for beskyttede (protected) attributter

- `-` Står for private (private) attributter

##### Operationer

Operationer (metoder) vises også i det mindste med deres navne, og kan også vises med parametre og returtyper. Operationer, præcis som attributter, kan vises med deres synlighed:

- `+` Står for åbne (public) operationer

- `#` Står for beskyttede (protected) operationer

- `-` Står for private (private) operationer

##### Skabeloner

Klasser kan have skabeloner, en værdi som bruges for en uspecificeret klasse eller type. Skabelontypen angives når klassen initieres (dvs. et objekt laves). Skabeloner findes i moderne C++ og vil blive introduceret i Java 1.5, hvor de kaldes Generics.

#### Klasseassociationer

Klasser kan relateres til (associeres med) hinanden på forskellige måder:

##### Generalisering

Arv er et af de grundlæggende begreber i objektorienteret programmering, hvor en klasse opnår alle attributter og operationer fra klassen den arver fra, og kan overskride/ændre nogen af dem, samt tilføje flere egne attributter og operationer.

En generalisering mellem to klasser i &UML;, placerer dem i et hierarki som repræsenterer arvebegrebet for en afledt klasse fra en basisklasse. Generaliseringer i &UML; repræsenteres med en linje som binder de to klasser sammen, med en pil på basisklassens side. Generalisering Visuel repræsentation af en generalisering i &UML;

Visuel repræsentation af en generalisering i &UML;

##### Associationer

En association repræsenterer et forhold mellem klasser, og giver den fælles semantik og struktur for mange typer af forbindelser mellem objekter.

Associationer er mekanismen som tillader at objekter kommunikerer med hinanden. De beskriver forbindelsen mellem forskellige klasser (forbindelsen mellem de virkelige objekter kaldes objektforbindelser, eller link).

Associationer kan have en rolle, som angiver associationens formål, og kan være ensrettede eller gensidige (indikerer om de to objekter som deltager i forholdet kan sende meddelelser til hinanden, eller om kun et af dem kender til det andet). Hver eneste af associationerne har også en multiplicitet, som bestemmer hvor mange objekter på denne side af associationen kan relateres til et objekt på den anden side.

Associationer i &UML; repræsenteres som linjer som binder de klasser sammen som deltager i forholdet, og kan også vise rollen og multipliciteten for hver af deltagerne. Multiplicitet vises som et interval [minimum..maksimum] med ikke-negative værdier, med en stjerne (*) på maksimumsiden som repræsenterer uendeligt. &UML;-association Visuel repræsentation af en association i &UML;

Visuel repræsentation af en association i &UML;

##### Aggregering

Aggregeringer er en særlig slags association, hvor de to deltagende klasser ikke har en ligeværdig status, men udgør et helhed-del forhold. En aggregering beskriver hvordan klassen som intager rollen som helhed, er sammensat af (har) andre klasser, som intager rollerne som dele. Klassen der virker som helhed har altid multiplicitet en, for aggregeringer.

Aggregeringer i &UML; repræsenteres ved en association som viser en rombe på den side som hører til helheden. Aggregering Visuel repræsentation af en aggregeringsrelation i &UML;

Visuel repræsentation af en aggregeringsrelation i &UML;

##### Sammensætning

Sammensætninger er associationer som repræsenterer meget stærke aggregeringer. Det betyder at sammensætninger også former helhed-del forhold, men at forholdet er så stærkt at delene ikke kan eksistere for sig selv. De findes kun inde i helheden, og hvis helheden forstyrres, forsvinder delene også.

Sammensætninger i &UML; repræsenteres af en udfyldt rombe på siden af helheden.

Sammensætning Visuel repræsentation af en sammensætningsrelation i &UML;

#### Andre punkter i klassediagrammer

Klassediagrammer kan indeholde flere andre objekter foruden klasser.

##### Grænseflader

Grænseflade er abstrakte klasser hvilket betyder at instanser ikke direkte kan skabes fra dem. De kan indehold operationer men ingen attributter. Klasser kan arve fra grænseflader (via en realisationsassociation) og instanser kan derefter laves af disse diagrammer.

##### Datatyper

Datatyper er primitiver som typisk er indbyggede i et programsprog. Almindelige eksempler omfatter heltal og en boolesk type. De kan ikke have forhold til klasser, men klasser kan have forhold til dem.

##### Gentagelsestyper

Gentagelsestyper er enkle lister med værdier. Et typisk eksempel er en nummereringstype af ugedage. Som datatyper kan de ikke have forhold til klasser, men klasser kan have forhold til dem.

##### Pakker

Pakker repræsenterer navnerum i et programsprog. I et diagram bruges de til at repræsentere dele af et system som indeholder mere end en klasse, måske hundredvis af klasser.

### Sekvensdiagrammer

Sekvensdiagrammer viser udveksling af meddelelser (dvs. metodekald) mellem flere objekter, i en specifik, tidsbegrænset situation. Sekvensdiagrammer lægger særlig vægt på rækkefølgen og tiden når meddelelserne til objekter sendes.

Objekter repræsenteres af lodrette stregede linjer i sekvensdiagrammer, med objektets navn øverst. Tidsakslen er også lodret, og vokser nedad, så meddelelser sendes fra et objekt til et andet i form af pile med operationer og parameternavn.

Sekvensdiagram
&umbrello; som viser et sekvensdiagram

&umbrello; som viser et sekvensdiagram

Meddelelser kan enten være synkrone, den normale type for meddelelseskald hvor kontrollen overgår til det kaldte objekt til metoden er kørt færdigt, eller asynkrone hvor kontrollen går direkte tilbage til det kaldende objekt. Synkrone meddelelser har en lodret boks ved siden af det kaldte objektet, for at vise programkontrollen.

### Samarbejdsdiagrammer

Samarbejdsdiagrammer viser vekselvirkningen mellem objekter som deltager i en speciel situation. Dette er mere eller mindre samme information som vises i sekvensdiagrammer, men hvor vægten lægges på hvordan vekselvirkningen sker i tiden, mens samarbejdsdiagrammer lægger vægten på forholdet mellem objekterne og deres topologi.

I samarbejdsdiagrammer repræsenteres meddelelser fra et objekt til et andet med pile, som viser meddelelsens navn, parametre og meddelelsesekvensen. Samarbejdsdiagrammer er særligt passende til at vise en særlig programflydning eller situation, og er blandt de bedste diagramtyper til hurtigt at demonstrere eller forklare en process i programmets logik.

Samarbejde
&umbrello; som viser et samarbejdsdiagram

&umbrello; som viser et samarbejdsdiagram

### Tilstandsdiagram

Tilstandsdiagrammer viser de forskellige tilstande et objekt har i sin livstid, og de stimuli som forårsager at objektet ændrer sin tilstand.

Tilstandsdiagrammer ser objekter som tilstandsmaskiner eller finite automates, som kan være i en af en mængde begrænsede tilstande og som kan ændre tilstand via et af et begrænset antal stimuli. Et objekt af typen Netserver, kan for eksempel være i en af følgende tilstande i sin livstid:

- Klar

- Lytter

- Arbejder

- Stoppet

og begivenhederne som kan gøre at et objekt skifter tilstand er

- Objektet laves

- Objektet tager imod meddelelsen at lytte

- En klient beder om en forbindelse via netværket

- En klient afslutter en forespørgsel

- En forespørgsel køres og afsluttes

- Objektet tager imod meddelelsen at stoppe

- osv

Tilstandsdiagram &umbrello; som viser et tilstandsdiagram

&umbrello; som viser et tilstandsdiagram

#### Tilstand

Tilstand er byggeblokken i tilstandsdiagrammer. En tilstand hører til nøjagtig en klasse, og repræsenterer en sammenfatning af de værdier klassens attributter kan intage. En &UML;-tilstand beskriver den interne tilstand for et objekt af en vis klasse.

Bemærk at ikke hver ændring af en af et objekts attributter skal repræsenteres som en tilstand, men kun de ændringer som væsentligt kan påvirke objektets arbejde.

Der er to specielle typer tilstand: start og slut. De er specielle på den måde at der ikke er nogen begivenhed som kan gøre at et objekt går tilbage til sin starttilstand, og på samme måde er der ingen begivenhed som gør det muligt for et objekt at forlade sin sluttilstand når den først er nået.

### Aktivitetsdiagram

Aktivitetsdiagrammer beskriver en følge af begivenheder i et system, ved hjælp af aktiviteter. Aktivitetsdiagrammer er en speciel form af tilstandsdiagrammer, som kun (eller hovedsagelig) indeholder aktiviteter.

Et eksempel på aktivitetsdiagram &umbrello; som viser et aktivitetsdiagram

&umbrello; som viser et aktivitetsdiagram

Aktivitetsdiagrammer ligner procedurelle flydediagrammer, med forskellen at alle aktiviteter er klart linkede til objekter.

Aktivitetsdiagrammer hører altid sammen med en klasse, en operation eller et brugstilfælde.

Aktivitetsdiagrammer understøtter sekventielle- og parallelle aktiviteter. Parallel kørsel repræsenteres med ikonen Del op/Vent, og det er ikke vigtigt for aktiviteter som kører parallelt i hvilken rækkefølge de udføres (de kan køres samtidigt eller en af gangen).

#### Aktivitet

En aktivitet er et enkelt skridt i en process. En aktivitet er en tilstand i systemet med intern aktivitet og i det mindste en udgående overgang. Aktiviteter kan også have mere end en udgående overgang, hvis de har forskellige betingelser.

Aktiviteter kan opbygge hierarkier, hvilket betyder at en aktivitet kan bestå af flere detaljeaktiviteter, hvor indkommende og udgående overgange skal passe sammen med de indkommende og udgående overgange i detaljediagrammet.

### Hjælpeelementer

Der er nogle få elementer i &UML; som ikke har noget virkelig semantisk værdi for modellen, men som hjælper til at klargøre dele af diagrammerne. Disse elementer er

- Tekstlinjer

- Noter og ankre

- Bokse

Tekstlinjer er nyttige til at tilføje kort tekstinformation i et diagram. Det er fritstående tekst, og har ingen betydning i selve modellen.

Noter er nyttige til at tilføje mere detaljeret information om et objekt eller en særlig situation. De har den store fordel at noter kan ankres ved &UML;-elementer for at vise at noten hører til et særligt objekt eller en særlig situation.

Bokse er fritstående rektangler som kan bruges til at gruppere objekter sammen, for at gøre diagrammer mere læsbare. De har ingen logisk mening i modellen.

### Komponentdiagrammer

Komponentdiagrammer viser programkomponenter (enten komponentteknologier såsom Kparts, CORBA-komponenter eller Java Beans eller kun dele af systemet som er klart udskillelige) og artefakterne de består af, såsom kildekodefiler, programbiblioteker eller relationsdatabasetabeller.

Komponenter kan have grænseflader (dvs. abstrakte klasser med operationer) som tillader associationer mellem komponenter.

### Udplaceringsdiagrammer

Udplaceringsdiagrammer viser komponentinstanserne ved kørsel og deres associationer. De omfatter knuder, som er fysiske ressourcer, typisk en enkelt maskine. De viser også grænseflader og objekter (klasseinstanser).