# Grondbeginselen van &UML;

## Over &UML; ...

Dit hoofdstuk geeft u snel een overzicht van de grondbeginselen van &UML;. Houdt u voor ogen dat dit geen allesomvattende studie is over &UML; maar veeleer een korte inleiding in &UML; die men kan lezen als een basiscursus &UML;. Wilt u meer te weten komen over de Unified Modelling Language, of in bredere zin over software-analyse en -ontwerp, raadpleeg dan een van de vele boeken die over dit onderwerp voorhanden zijn. Er zijn ook een groot aantal cursussen op het Internet voorhanden, waarmee u een goede start kunt maken.

De Unified Modelling Language (&UML;) is een taal om diagrammen te maken of een notatiewijze om modellen van objectgeoriënteerde softwaresystemem te specificeren, te visualiseren en te documenteren. &UML; is geen ontwikkelmethode, d.w.z. het vertelt u niet wat u eerst moet doen en wat daarna, of hoe u uw systeem moet ontwerpen, maar het helpt u om uw systeem te visualiseren en te communiceren met anderen. &UML; staat onder toezicht van de Object Management Group (OMG) en is de industriestandaard voor het grafisch weergeven van software.

&UML; is gemaakt voor het ontwerpen van objectgeoriënteerde software en heeft beperkt nut voor andere programmeerparadigma's.

&UML; is opgebouwd uit vele modelelementen die de verschillende delen van een softwaresysteem vertegenwoordigen. De &UML;-elementen worden gebruikt om diagrammen te maken, die een bepaald deel of een gezichtspunt van een systeem voorstellen. De volgende soorten diagrammen worden ondersteund door &umbrello;:

- use case diagrammen tonen actoren (mensen of andere gebruikers van het systeem), use cases (de scenario's wanneer zij het systeem gebruiken), en hun relaties

- Klassediagrammen tonen klassen en hun onderlinge relaties

- Volgordediagrammen tonen objecten en een volgorde van methode-aanroepen die zij doen naar andere objecten.

- Collaboratiediagrammen tonen objecten en hun relaties, met nadruk op de objecten die deelnemen aan de berichtenuitwisseling

- Toestandsdiagrammen tonen toestanden, toestandsveranderingen en gebeurtenissen van een object of een deel van het systeem

- Activiteitsdiagrammen tonen activiteiten en de overgang van de ene activiteit naar de andere samen met de gebeurtenissen die in een bepaald deel van het systeem optreden

- Componentdiagrammen tonen programmacomponenten op het hoogste niveau (zoals bijv. KParts of Java Beans).

- Deploymentdiagrammen tonen de instanties van de componenten en hun relaties.

## &UML;-elementen

### Use case diagram

Use case-diagrammen beschrijven de relaties en afhankelijkheden tussen een groep van use cases en de actoren die deelnemen aan het proces.

Belangrijk om op te merken is dat use case-diagrammen niet geschikt zijn om het ontwerp te representeren, en niet het inwendige van een systeem kunnen beschrijven. Use case-diagrammen zijn bedoeld om de communicatie met de toekomstige gebruikers van een systeem, en met de klant, te vergemakkelijken, en zijn in het bijzonder behulpzaam bij het vaststellen van welke benodigde kenmerken een systeem moet hebben. Use case diagrammen vertellen wat het systeem moet doen maar specificeren niet — en kunnen dat ook niet — hoe dit gerealiseerd moet worden.

Een voorbeeld van een use case-diagram. &umbrello; toont een use case-diagram

&umbrello; toont een use case-diagram

#### Use case

Een use case beschrijft — vanuit het standpunt van de actoren — a groep activiteiten in een systeem die een concreet, tastbaar resultaat oplevert.

Use cases zijn beschrijvingen van kenmerkende interacties tussen de gebruikers van een systeem en het systeem zelf. Zij representeren de externe interface van het systeem en specificeren een soort pakket van eisen diehet systeem moet uitvoeren (onthoud: alleen wat, niet hoe).

Bij het werken met use cases is het belangrijk om enkele eenvoudige regels in acht te nemen:

- Iedere use case is gerelateerd aan tenminste één actor

- Iedere use case heeft een initiator (&ie; een actor)

- Iedere use case leidt tot een relevant resultaat (een resultaat met waarde)

Use cases kunnen ook relaties met andere use cases hebben. De drie meest karakteristieke relaties tussen use cases zijn:

- <<include>> geeft aan dat een use case zich binnen een andere use case afspeelt

- <<extends>> geeft aan dat in bepaalde situaties, of op een zeker moment (ook wel het uitbreidingspunt genoemd) een use case uitgebreid zal worden met een andere.

- Generalisatie geeft aan dat een use case de karakteristieken erft van de super-use case, en sommige ervan kan herdefiniëren of nieuwe kan toevoegen, op eenzelfde wijze als bij de overerving bij klassen het geval is.

#### Actor

Een actor is een externe entiteit (buiten het systeem) die samenwerkt met het systeem door deelname aan (en veelal door initiëren van) een use case. In de dagelijkse werkelijkheid kunnen actoren mensen zijn (bijvoorbeeld gebruikers van een systeem), andere computersystemen of externe gebeurtenissen.

Actoren representeren niet de fysieke mensen of systemen, maar hun rol. Dit impliceert dat als een persoon met het systeem samenwerkt op verschillende manieren (hij meet zich verschillende rollen aan) hij door meerdere actoren voorgesteld zal worden. Bijvoorbeeld een persoon die telefonische klantenondersteuning geeft en orders invoert van de klant in het systeem, voorgesteld wordt door een actor afdeling ondersteuning en een actor afdeling verkoop

#### Use case-omschrijving

Use case-omschrijvingen zijn textuele verhandelingen van de use case. Zij nemen gewoonlijk de de vorm van een aantekening of een document aan dat op een bepaalde manier gekoppeld is aan de use case, en de processen of activiteiten die in de use case plaatsvinden, nader toelicht.

### Klassediagram

Klassediagrammen tonen de verschillende klassen waaruit het systeem is gemaakt, en hoe zij aan elkaar gerelateerd zijn. Van klassediagrammen zegt men dat zij statische diagrammen zijn omdat zij weliswaar de klassen weergeven, samen met hun methoden en attributen, alsmede de statische relaties tussen hen (i.e. welke klassen hebben weet van welke klassen of welke klassen maken deel uit van een andere klasse), maar niet de methode-aanroepen tussen hen onderlingweergeven.

Een voorbeeld van een klassediagram &umbrello; toont een klassediagram

&umbrello; toont een klassediagram

#### Klasse

Een klasse definieert de attributes en de methoden van een set objecten. Alle objecten die van deze klasse afgeleid zijn (instanties van deze klasse) hebben eenzelfde gedrag, en hebben overeenkomstige verzamelingen met attributen (ieder object heeft zijn eigen set). I.p.v. klasse wordt ook wet de term type gebezigd, maar het moet nadrukkelijk gesteld worden dat deze twee niet identiek zijn, type is een algemenere term.

In &UML;, worden klassen door rechthoeken gerepresenteerd, met de naam van de klasse; hierin kunnen ook de attributen en operaties van de klasse weergegeven worden in twee andere vakken binnen de rechthoek.

Een klasse in &UML; Visuele representatie van een klasse in &UML;

Visuele representatie van een klasse in &UML;

##### Attributen

In &UML;, worden attributen minsten met hun naam weergegeven, maar ook kunnen hun type, beginwaarde en andere eigenschappen weergegeven worden. Attributen kunnen ook worden getoond met hun zichbaarheid:

- `+` staat voor public attributen

- `#` staat voor protected attributen

- `-` staat voor private attributen

##### Operaties

Operaties (methoden) worden eveneens met minstens hun naam getoond; Ook zij kunnen hun parameters en return typen tonen. Operaties kunnen, net als attributen, hun zichtbaarheid weergeven:

- `+` staat voor public operaties

- `#` staat voor protected operaties

- `-` staat voor private operaties

##### Sjablonen

Klassen kunnen sjablonen hebben, een waarde die gebruikt wordt voor een niet gespecificeerde klasse of type. Het sjabloontype wordt gespecificeerd wanneer de klasse geïnstantieerd wordt (&ie; een object wordt aangemaakt). Sjablonen komen voor in modern C++ en zullen in Java 1.5 geïntroduceerd worden onder de naam generics.

#### Klassenassociaties

Klassen kunnen op verschillende wijze aan elkaar gerelateerd zijn (met elkaar geassocieerd zijn):

##### Generalisatie

Overerving is een van de fundamentele concepten van objectgeoriënteerdprogrammeren, waarbij een klasse toegang krijgt tot (bijna) alle attributen en operaties van de klasse waar het van erft, en sommige ervan opnieuw kan implementeren (overriding), alsook meer attributen en operaties van zichzelf kan toevoegen.

In &UML;, plaatst een generalisatie-associatie tussen twee klassen hen in een hiërarchie die het concept van overerving van een afgeleide klasse van een basisklasse representeert. In &UML;, worden generalizaties weergegeven door een lijn, die de twee klassen met elkaar verbindt, met een pijlpunt aan de kant van de basisklasse. Generalisatie Visuele representatie van een generalisatie in &UML;

Visuele representatie van een generalisatie in &UML;

##### Associaties

Een associatie vertegenwoordigt een relatie tussen klassen, en voorziet in de gemeenschappelijke semantiek en structuur voor vele soortenconnecties tussen objecten.

Associaties zijn het mechanisme dat objecten in staat stelt met elkaar te communiceren. Het beschrijft de connectie tussen verschillende klassen (de connectie tussen de eigenlijke objecten noemt men een objectconnectie, of link).

Associaties kunnen een rol hebben die het doel van de associatie specificeert en zowel uni- als bi-directioneel zijn (dit geeft aan of de twee objecten die een relatie hebben, berichten naar elkaar kunnen sturen, of dat slechts één van hen weet heeft van de ander). Ieder uiteinde van de associatie heeft ook een multipliciteit, die oplegt hoeveel objecten aan deze kant van de associatie gerelateerd kunen zijn aan telkens een object aan de andere kant.

In &UML;, worden associaties weergegeven als lijnen, die de klassen die aan de relatie deelnemen, met elkaar verbinden. Hierbij kan ook de rol en de multipliciteit van elk van de deelnemers worden getoond. De multipliciteit wordt afgebeeld als een bereik [min..max] van niet-negative waarden. Een asterisk (`*`) aan de maximumkant geeft oneindig weer. &UML;-associatie Visuele representatie van een associatie in &UML;

Visuele representatie van een associatie in &UML;

##### Aggregatie

Aggregaties zijn een speciaal type associaties waarin de twee deelnemende klassen geen gelijkwaardige status hebben, maar een geheel-deel relatie vormen. Een aggregatie beschrijft hoe de klasse die de rol van geheel heeft, samengesteld wordt uit de andere klassen, die de rol van deel hebben. Voor aggregaties heeft de klasse die optreedt als geheel, altijd de multipliciteit één.

In &UML;, worden aggregaties gerepresenteerd door een associatie die een ruit heeft aan de kant van het geheel. Aggregatie Visuele representatie van een aggregatie-relatie in &UML;

Visuele representatie van een aggregatie-relatie in &UML;

##### Compositie

Composities zijn associaties die zeer sterke aggregaties vertegenwoordigen. Dit betekent dat composities evengoed geheel-deel relaties vormen, maar de relatie is zo sterk dat de delen niet op zichzelf kunnen bestaan. Zij bestaan slechts binnen het geheel, en als het geheel vernietigd wordt, gaan de delen er ook aan.

In &UML;, worden composities gerepresenteerd door een gekleurde ruit aan de kant van het geheel.

Compositie Visuele representatie van een compositie-relatie in &UML;

#### Andere klassediagram-onderdelen

Klassediagrammen kunnen verscheidene andere onderdelen bevatten naast klassen.

##### Interfaces

Interfaces zijn abstracte klassen, wat wil zeggen dat instanties niet direct uit hen gemaakt kunen worden. Zij kunnen operaties bevatten maar geen attributen. Klassen kunnen overerven van interfaces (via een realisatie-associatie) en pas dan kunnen instanties van deze diagrammen gemaakt worden.

##### Gegevenstypen

Gegevenstypen zijn primitieven die normaal gesproken ingebouwd zijn in een programmeertaal. Bekende voorbeelden zijn integers en booleans. Zij kunnen geen relatie met klassen hebben, maar klassen kunnen wel een relatie met hen hebben.

##### Enumeraties

Enumeraties zijn een eenvoudige lijst met waarden. Een typisch voorbeeld is een enumeratie voor de dagen van de week. De keuzemogelijkheden binnen een enumeratie noemt men enumeratieconstanten. Evenals gegevenstypen kunnen zij geen relatie met klassen hebben, maar klassen kunnen wel een relatie met hen hebben.

##### Pakketten

Pakketten vertegenwoordigen een naamruimte in een programmeertaal. In een diagram worden zij gebruikt om delen van een systeem te representeren, die meer dan één klasse, wellicht zelfs honderden klassen, kunnen bevatten.

### Volgordediagrammen

Volgordediagrammen geven de berichtenuitwisseling weer (&ie; methode-aanroep) tussen verscheidene objecten in een specifieke tijd-begrensde situatie. Objecten zijn instanties van klasses. Volgordediagrammen leggen speciale nadruk op de volgorde waarin en de tijdstippen waarop de berichten naar de objecten verstuurd worden.

In volgordediagrammen worden objecten gerepresenteerd door vertikale onderbroken lijnen, met de naam van het object bovenaan. De tijd-as loopt ook verticaal, en neemt toe naar beneden, zodat berichten verstuurd worden van het ene object naar de nadere in de vorm van pijlen met de namen van de operatie en de parameters erbij.

Volgordediagram
&umbrello; toont een volgordediagram

&umbrello; toont een volgordediagram

Berichten kunnen ofwel synchroon zijn, het normale type bericht aanroep waarbij de besturing wordt doorgegeven aan het aangeroepen object totdat de betreffende methode voleindigd is, of asynchroon, waarbij de besturing direct weer teruggeven wordt aan het aanroepende object. Synchrone berichten hebben een verticaal kader aan de kant van het aangeroepen object om het verloop van de programmabesturing te laten zien.

### Collaboratiediagrammen

Collaboratiediagrammen laten de interacties zien die plaatsvinden tussen objects die participeren in een specifieke situatie. Dit is min of meer dezelfde informatie als weergegeven bij volgordediagrammen maar daar valt de nadruk op hoe de interacties plaats vinden in de tijd, terwijl bij Collaboratiediagrammen de relaties tussen de objecten en hun topologie op de voorgrond treden.

In collaboratiediagrammen worden berichten die van het ene object naar het andere worden gestuurd, voorgesteld door pijlen, waarbij de naam van het bericht, de parameters, en de bericht-volgorde, weergegeven wordt. Collaboratiediagrammen zijn bij uitstek geschikt om een specifiek programma-verloop of situatie weer te geven, en zijn een van de beste diagramtypen om snel een process in de programmalogica te demonstreren of toe te lichten.

Collaboratie
&umbrello; toont een collaboratiediagram

&umbrello; toont een collaboratiediagram

### Toestandsdiagram

Toestandsdiagrammen geven de verschillende toestanden van een object weer gedurende zijn bestaan, en de stimuli, die er voor zorgen dat het object zijn toestand wijzigt.

Toestandsdiagrammen kijken naar objecten als toestandsmachines of eindige automaten, die in een van een set eindige toestanden kunnen verkeren en hun toestand kunnen veranderen middels een van een eindige set stimuli. Bijvoorbeeld een object van het type NetServer kan in een van de volgende toestanden voorkomen tijdens zijn bestaan:

- Klaar

- Luisterend

- Werkend

- Gestopt

en de gebeurtenissen die ervoor kunnen zorgen dat het object van toestand verandert, zijn

- Object is aangemaakt

- Object ontvangt bericht "luisteren"

- Een cliënt vraagt een verbinding aan over het netwerk

- Een cliënt beëindigt een aanvraag

- De aanvraag is uitgevoerd en beëindigd

- Object ontvangt bericht "stoppen"

- etc

Toestandsdiagram &umbrello; toont een toestandsdiagram

&umbrello; toont een toestandsdiagram

#### Toestand

Toestanden zijn bouwstenen voor toestandsdiagrammen. Een toestand hoort bij exact één klasse en vertegenwoordigt een opsomming van waarden die de attributen van een klasse kunnen aannemen. Een &UML;-toestand beschrijft de interne toestand van een object van een bepaalde klasse

Merk op dat niet iedere verandering in een van de attributen van een object door een toestand gerepresenteerd dient te worden, maar slechts die veranderingen die significant de werking van het object kunnen beïnvloeden

Er zijn twee bijzondere toestandstypen: begin en eind. Zij zijn bijzonder omdat er geen gebeurtenis bestaat die ervoor kan zorgen dat een object terugkeert naar zijn begin-toestand, evenals er geen gebeurtenis bestaat die mogelijkerwijs een object uit zijn eind-toestand kan halen, wanneer het die eenmaal bereikt heeft.

### Activiteitsdiagram

Activiteitsdiagrammen beschrijven de volgorde van aktiviteiten in een systeem net behulp van activiteiten. Aktiviteitsdiagrammen zijn een bijzondere vorm van toestandsdiagrammen, die alleen (of voornamelijk) aktiviteiten bevatten.

Een voorbeeld van een activiteitsdiagram. &umbrello; toont een activiteitsdiagram

&umbrello; toont een activiteitsdiagram

Activiteitsdiagrammen zijn vergelijkbaar met procedurele fluxdiagrammen, met dit verschil dat alle aktiviteiten duidelijk gekoppeld zijn aan objecten.

Activiteitsdiagrammen worden altijd geassocieerd met een klasse, een operatie of een use case.

Aktiviteitsdiagrammen ondersteunen zowel sequentiële als parallelle activiteiten. Parallelle uitvoering wordt gerepresenteerd m.b.v. pictogrammen voor afsplitsen/wachten, en voor de parallel verlopende activiteiten, is het niet van belang in welke volgorde zij worden uitgevoerd (zij kunnen tegelijkertijd uitgevoerd worden, of na elkaar)

#### Activiteit

Een activiteit is een enkele stap in een process. Een activiteit is een toestand in het systeem met interne activiteit en, ten minste, één uitgaande transitie. Activiteiten kunnen ook meer dan een uitgaande transitie bezitten als zij verschillende voorwaarden hebben.

Activiteiten kunnen hiërarchieën vormen, dit wil zeggen dat een activiteit samengesteld kan zijn uit meerdere detail-activiteiten, in welk geval de in- en uitgaande transities zouden moeten overeenstemmen met de in- en uitgaande transities van het detaildiagram.

### Hulpelementen

Er zijn een paar elementen in &UML; die geen reële semantische waarde voor het model, maar helpen bij het verhelderen van delen van het diagram. Deze elementen zijn

- Tekstregels

- Notities en ankers

- Vakken

Tekstregels zijn nuttig om korte tekstuele informatie aan een diagram toe te voegen. Het is vrijstaande tekst en heeft geen betekenis voor het model zelf.

Notities zijn nuttig om meer gedetailleerde informatie over een object of een specifieke situatie toe te voegen. Zij hebben het grote voordeel dat notities aan &UML;-elementen verankerd kunnen worden om te laten zien dat de notitie tot een specifiek object of situatie behoort.

Vakken zijn vrijstaande rechthoeken die gebruikt kunnen worden om groepen onderdelen samen te voegen en zo de diagrammen leesbaarder te maken. Zij hebben geen logische betekenis voor het model.

### Componentdiagrammen

Componentdiagrammen tonen de softwarecomponenten (ofwel component technologieën zoals KParts, CORBA-componenten of Java Beans ofwelsecties uit het systeem die duidelijk te onderscheiden zijn) en de artefacten waaruit zij gemaakt zijn zoals broncodebestanden, programmabibliotheken en relationele databasetabellen.

Componenten kunnen interfaces bezitten (&ie; abstracte klassen met operaties) die associaties tussen componenten toelaten.

### Deploymentdiagrammen

Deploymentdiagrammen tonen de "runtime" componentinstanties en hun associaties. Zij omvatten nodes, die fysieke resources zijn, in het typische geval een enkele computer. Zij tonen ook interfaces en objecten (instanties van klassen).