Professional Documents
Culture Documents
Objectgericht Ontwerpen - Electronica Opleiding
Objectgericht Ontwerpen - Electronica Opleiding
De Nayer instituut
Industrieel ingenieur
Opleiding Elektronica-ICT
3e academisch bachelorjaar
Objectgericht ontwerpen
1 Systeemontwikkeling en systeemanalyse. 3
1.1 Systeemontwikkeling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.1 Benaderingswijzen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Software levenscyclus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.1 Het waterval model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.2 Het spiraal model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 Systeemanalyse: verzamelen van gegevens. . . . . . . . . . . . . . . . . . . . . . . . 6
2 Objectgeoriënteerde systeemontwikkeling 9
2.1 Objecttechnologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2 Verschillen met traditionele ontwikkeling . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.1 Functionele decompositie versus domeinmodellering . . . . . . . . . . . . . 9
2.2.2 Verschillen met data-georiënteerde ontwikkeling . . . . . . . . . . . . . . . . 10
2.3 Unified modeling language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.4 Verschillende stadia van de diagrammen . . . . . . . . . . . . . . . . . . . . . . . . 12
2.5 De diagrammen bij een traditionele aanpak . . . . . . . . . . . . . . . . . . . . . . 13
I
INHOUDSOPGAVE 1
4.2.2 Standaardtypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.2.3 Gebruik van klassen en types . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.2.4 Geassocieerde objecten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.2.5 Associaties en verzamelingen van objecten . . . . . . . . . . . . . . . . . . . 27
4.2.6 Klasse-operaties en -attributen . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.2.7 Operaties op alle objecten . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.2.8 Initiële waarden en afleidingsregels . . . . . . . . . . . . . . . . . . . . . . . 29
4.3 Werkwijze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3.1 Vind de regel voor de constraint . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3.2 Bepaal de context en schrijft de constraint op . . . . . . . . . . . . . . . . . 30
5 Interactie diagrammen 31
5.1 Use-case diagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.1.1 Functionele en niet-functionele systeemeisen . . . . . . . . . . . . . . . . . . 31
5.1.2 Actoren en use-cases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.1.3 Use-case diagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.1.4 Werkwijze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.2 Sequence- en communicatiediagram . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.2.1 Concepten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.2.2 Voorbeelden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.2.3 Werkwijze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.2.4 Gebruik van CRC-kaarten . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
6 Toestands- en activiteitsdiagram 43
6.1 Toestandsdiagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.1.1 Concepten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.1.2 Voorbeeld . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.1.3 Werkwijze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.2 Activiteitsdiagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.2.1 Concepten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.2.2 Werkwijze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
7 Applicatie- en implementatiestadium 51
7.1 Beschrijving . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7.2 Werkwijze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
7.2.1 Integreer alle informatie in het klassediagram . . . . . . . . . . . . . . . . . 52
7.2.2 Detailleer het klassediagram . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
7.2.3 Voeg nieuwe klassen toe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
7.2.4 Maak dynamische diagrammen . . . . . . . . . . . . . . . . . . . . . . . . . 55
7.2.5 Integreer alle informatie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
7.3 Component- en deployment diagrammen . . . . . . . . . . . . . . . . . . . . . . . . 56
2 INHOUDSOPGAVE
Hoofdstuk 1
Systeemontwikkeling en
systeemanalyse.
1.1 Systeemontwikkeling.
1.1.1 Benaderingswijzen.
Bij het ontwikkelen van systemen kan men essentieel twee verschillende benaderingswijzen volgen,
nl. de top-down approach (van boven af) ofwel de bottom-up approach (van onder op).
Bij de top-down benadering wordt eerst een globaal model van de informatiestroom ontwikkeld.
Pas dan wordt een informatiesysteem ontworpen om aan die informatiestroom te voldoen. Dit in-
formatiesysteem bestaat uit een aantal modules of subsystemen die in een volgorde ontwikkeld
worden die een maximale integratie toelaat. Het voordeel van deze benadering is de grotere inte-
gratiemogelijkheid, omdat onmiddellijk het geheel wordt overzien en dus alles beter gecoördineerd
en gepland kan worden. Nadelig is de moeilijkheid om grote systemen op die manier te benaderen.
In de bottum-up benadering gebeurt de ontwikkeling van het informatiesysteem meer geleidelijk.
Vermits de basiselementen van eender welk verwerkingssysteem een aantal modules (toepassingen)
zijn die transakties uitvoeren of bestanden aanpassen, begint men hier met het operationeel op
punt stellen van deze modules, waarna ze geı̈ntegreerd worden. Naarmate de tijd vordert, kun-
nen overeenkomstig de vraag en de nood, nieuwe modules toegevoegd worden zoals plannings-,
kontrole- en beslissingsmodules. Met andere woorden het informatiesysteem groeit geleidelijk naar
zijn uiteindelijke vorm, waarbij gestreefd wordt naar een geordende integratie en implementatie.
Naarmate het systeem evolueert en volgens de noden van het ogenblik, kunnen nieuwe func-
ties toegevoegd worden die gebruik maken van de reeds bestaande modellen en gegevens of een
aanvulling vereisen.
De voordelen van deze benadering zijn:
• opbouw op basis van reële behoeften en mogelijkheid tot expansie
• de gegevensbestanden worden opgebouwd op basis van de toepassingen
• men verkrijgt een soepel systeem waarbij verschillende functies duidelijk gescheiden blijven.
Nadelig is soms de onmogelijkheid om zover te integreren als nodig. Bepaalde toepassingen
kunnen, door hun aan- of afwezigheid de vereiste integratie tegenwerken of vertragen. Ook zullen
modules na verloop van tijd opnieuw ontwikkeld moeten worden om een verdere integratie toe te
laten.
3
4 HOOFDSTUK 1. SYSTEEMONTWIKKELING EN SYSTEEMANALYSE.
Behoefte
analyse
Programma
ontwerp
Implementatie
Testen
Onderhoud
Het waterval model van de software levenscyclus wordt in figuur 1.1 getoond. Het diagram
heeft 5 blokken:
Behoefte analyse en specificatie: deze fase begint met een opdracht op basis van het LT in-
formaticaplan of op basis van een vooronderzoek. In samenspraak met de klant worden de
vereisten waaraan de software moet voldoen, opgesteld. Nadat de doelstellingen zijn vast-
gelegd, worden een aantal systeemconcepten gemaakt en onderling gewaardeerd (kosten-
batenanalyse).
Ontwerp: identificeren van de belangrijkste data types en bijhorende operaties (data abstractie);
vastleggen van de verschillende interfaces.
• Functioneel ontwerp: Alle functies in het nieuwe systeem worden uitgelegd en duidelijk
beschreven, en waar nodig verder opgesplitst. De informatiebehoefte en de gegevens
die daarvoor nodig zijn worden bestudeerd, beschreven en uitgelegd.
1.2. SOFTWARE LEVENSCYCLUS 5
• Technisch ontwerp: Het technisch ontwerp beschrijft hoe het systeem moet werken,
hoe de functies gerealiseerd kunnen worden. Procedures en programmaspecifikaties
worden nu gemaakt tesamen met formulieren, recordindelingen, e.d.
Implementatie: het schrijven van de programma’s op basis van het ontwerp: normaal is de keuze
van de programmeertaal gebaseerd op dit ontwerp, in de praktijk wordt nogal dikwijls de
voorkeurtaal van de programmeur(s) genomen.
Taakbeschrijvingen worden gemaakt op basis van de ontwikkelde procedures en de hoeveel-
heden uit te voeren werk en verder:
• het ontwerpen van de programmastruktuur
• het schrijven van de programma’s
• het afzonderlijk testen van deze programma’s
• het vervolledigen van de programmadokumentatie.
Testen: nagaan of de programma’s correct werken op het vlak van functionaliteit en algemeen-
heid. De afzonderlijke programma’s worden samengesteld tot jobs en in onderlinge samen-
hang tesamen met de procedures getest.
Konversie en invoering: Hier kan de vraag gesteld worden of men gedurende bepaalde tijd
moet schaduwdraaien.
Systeemgebruik en -beheer: Omdat geen enkel systeem perfekt is, moet het continu onder-
houden worden. Soms moeten de programma’s overgedragen worden naar nieuwe systemen;
de functionaliteit moet verhoogd worden. Verder moet vooral worden gelet op veiligheids-
voorzieningen, herstelprocedures, e.d.
Uit het diagram blijkt dat er een constante stroom is van één blok naar het volgende. Daarnaast
is er voortdurende inschatting of de vorige deeltaak al of niet goed uitgevoerd is; indien nodig wordt
er terug naar het vorige blok gegaan om het aan te passen.
Planning
Risico analyse
Communicatie
met klant Engineering
Klant evaluatie
Constructie
Het spiraal model (figuur 1.2) bevat de goede delen van het waterval model; daarnaast is
het element risico analyse toegevoegd. Dit model is zeer geschikt voor grote industriële software
projecten en bevat volgende deeltaken:
6 HOOFDSTUK 1. SYSTEEMONTWIKKELING EN SYSTEEMANALYSE.
Communicatie met de klant: zorgen voor een goede, effectieve communicatie tussen ontwer-
per en klant.
Planning: het definiëren van de doelstellingen, de hulpmiddelen en de tijdshorizon.
Risico analyse: het inschatten van technische en management risico’s: het identificeren van
potentiële problemen en het analyseren van alternatieve oplossingen.
Engineering: het ontwerp van de software.
Constructie en release: het bouwen, testen en installeren van de software; voorzieningen voor
gebruikersondersteuning (bijvoorbeeld documentatie en training).
Klant evaluatie: terugkoppeling van de klant omtrent de mogelijkheden van het software pro-
duct.
Elke versie doorloopt deze stappen, voorgesteld door de spiraal vertrekkend vanuit het centrum.
Voor elke nieuwe release zou een risico analyse moeten uitgevoerd worden om na te gaan of de
nieuwe (bijkomende) objectieven kunnen gerealiseerd worden binnen het budget (tijd en kost).
Dit model illustreert ook het evolutionaire aspect: de initiële oplossing kan erg beperkt zijn
(voldoende voor de basisvereisten van de klant); latere versies zijn uitgebreid met nieuwe faciliteiten
en een betere GUI.
Vanzelfsprekend moet bij de systeemanalyse en het systeemontwerp steeds rekening gehouden
worden met de menselijke factoren. Niet zelden gebeurt het dat goed ontworpen systemen falen
door het wantrouwen en misnoegen van de gebruikers. Een faktor die steeds vernoemd wordt, is
de resistance to change, waarbij het eventuele verlies van de job, de angst om overbodig te worden
of de nieuwe werkmethode niet aan te kunnen een belangrijke rol spelen. Deze weerstand kan
teruggebracht worden tot de primaire menselijke behoeften van veiligheid, erkenning, kompetitie
en sociaal kontakt. Vele moeilijkheden ontstaan dus door onzekerheid die gepaard gaan met de
introduktie van een nieuw systeem. Deze onzekerheid wordt echter verminderd door de toekomstige
gebruiker op ieder ogenblik in het ontwerp te betrekken. De gebruikers zijn geneigd om systemen
die ze zelf hielpen ontwerpen vlugger te aanvaarden temeer daar ze op die manier de nood aan het
nieuwe systeem gaan inzien.
één of andere manier een nieuw element ter sprake komt, hierop verder ingegaan worden. Wanneer
de vraag dubbelzinnig is, kan de interviewer ze verduidelijken en uitleggen wat er gewenst wordt.
Vragenlijsten kunnen ook gebruikt worden om feedback te krijgen bij een postimplementatie audit.
8 HOOFDSTUK 1. SYSTEEMONTWIKKELING EN SYSTEEMANALYSE.
Hoofdstuk 2
Objectgeoriënteerde
systeemontwikkeling
2.1 Objecttechnologie
De manier waarop software gestructureerd wordt, is in de loop der jaren zeer verschillend geweest.
Het varieerde van structurering op basis van de functie van een bepaald (deel)programma en het
functionele ontwerpen tot structurering op basis van de benodigde data en het gegevensgerichte
ontwerpen.
Objecttechnologie is een nieuw paradigma (denkraam). Het kenmerk van objecttechnologie
is dat data en functies die deze data bewerken, samengevoegd worden in een eenheid die object
genoemd wordt. Elk object is een zelfstandige entiteit binnen het totale systeem. De structuur
van het systeem bestaat uit objecten die met elkaar verbonden zijn en met elkaar communiceren.
Tijdens de analysefase in de bouw van een softwaresysteem wordt een structuur of een model
geconstrueerd. Ieder object wordt gezien als een afspiegeling van een fysiek ding uit de werke-
lijkheid of van een concept dat gangbaar is in die werkelijkheid. Het resulterende model van een
deel van de werkelijkheid is altijd een vereenvoudiging. Een object verbergt zijn binnenkant (hoe
worden operaties uitgevoerd, wat wordt er precies opgeslagen en hoe, ...) voor andere objecten in
het systeem. Door middel van deze inkapseling is het mogelijk om aanpassingen in de software
in belangrijke mate te lokaliseren. Aanpassen betekent dus minder werk, maar vooral ook minder
kans op het introduceren van fouten door ongewenste neveneffecten. Dit resulteert in een flexibel
systeem dat snel genoeg kan meeveranderen met de behoeften van de organisatie en gebruikers.
Belangrijk bij het structureren van software is een goede verdeling van alle activiteiten of taken
binnen het systeem. Ieder object heeft een duidelijk afgebakende, meestal beperkte verantwoorde-
lijkheid voor het uitvoeren van bepaalde activiteiten in het systeem. Deze verdeel-en-heers tactiek
maakt het mogelijk om fouten gemakkelijker te lokaliseren. Daarnaast zijn ook veranderingen
makkelijker te plaatsen en de consequenties ervan makkelijker te doorgronden.
9
10 HOOFDSTUK 2. OBJECTGEORIËNTEERDE SYSTEEMONTWIKKELING
Business rules
Sequence en/of
in OCL
communicatie diagram
Klassediagram
plus OCL en operaties
Toestandsdiagram
Compleet
klassendiagram
Figuur 2.1 geeft een overzicht van de samenhang van de verschillende diagrammen. Een pijl van
een diagram naar een ander geeft aan dat het tweede diagram informatie uit het eerste diagram
nodig heeft. Een gestippelde lijn betekent dat het eerste diagram wel invloed heeft op het tweede,
zonder dat delen van het tweede diagram direct uit het eerste voortkomen. Het klassediagram
dat in verschillende stadia langs de dikke pijl wordt ontwikkeld, is het centrale diagram in de
methode. In de figuur wordt ook onderscheid gemaakt tussen structurele en gedragsaspecten
van het softwaresysteem. De structurele aspecten worden weergegeven in het klassediagram. De
gedragsaspecten in de overige diagrammen, met uitzondering van de component en deployment
diagrammen. Uiteindelijk worden beide zijden geı̈ntegreerd in het klassediagram.
In Deel I van deze cursus werden het klasse- en objectdiagramma al bondig ingeleid. Deze sectie
gaat hier nu wat dieper op in.
eigenaar eigenaar
Persoon Computer Persoon Computer
bezit bezit
heeftToegangTot heeftToegangTot
Richting van een associatie. Het is niet altijd nodig om een associatie in twee richtingen te im-
plementeren. Wanneer slechts één richting geı̈mplementeerd wordt, kunnen consistentieproblemen
vermeden worden. In een diagram kan de geı̈mplementeerde richting aangegeven worden door de
associatielijn van een pijlpunt te voorzien.
3.1.2 Zichtbaarheid
De zichtbaarheid van een attribuut of operatie geeft aan in hoeverre het attribuut of de operatie
aan de omgeving van het object bekend is. In principe verbergen objecten zoveel mogelijk van
hun attibuten en operaties voor hun omgeving.
15
16 HOOFDSTUK 3. KLASSE- EN OBJECTDIAGRAM (2)
3.1.4 Associatieklasse
Een associatieklasse is een klasse die gekoppeld is aan een associatie: de klasse wordt geı̈dentificeerd
met de associatie. Zodra er een link is tussen twee instanties, is er direct een instantie van de
betreffende associatieklasse. Zodra de link verdwijnt, verdwijnt ook de instantie van de klasse. Een
associatieklasse wordt gebruikt wanneer de associatie attributen en/of operaties heeft en wanneer
de associatie zelf weer associaties heeft met andere klassen.
In UML wordt een associatieklasse aangegeven door het klassesymbool, dat door middel van
een onderbroken lijn gekoppeld is met de bijhorende associatie.
echtgenoot echtgenote
Man Vrouw
Huwelijk
datum
isAfgeslotenIn Gemeente
Fiets Fiets
Aggregatierelatie Compositierelatie
2 2
Wiel Frame Wiel Frame
3.1. GEAVANCEERDE CONCEPTEN 17
3.1.6 Constraints
Een constraint is een beperking op één of meer elementen in het klassediagram. Om constraints
te noteren wordt binnen UML de Object Constraint Language (OCL) gebruikt. Als een OCL-
constraint in een diagram vermeld moet worden, dan wordt de constraint tussen accolades ({}) in
een note-box geplaatst.
Er bestaan ook verschillende voorgedefinieerde constraints die als een symbool in het klassedi-
agram aangegeven kunnen worden:
• {ordered}: het geordend zijn van een verzameling objecten die gedefinieerd wordt door een
associatie met multipliciteit groter dan één;
• {xor} met een stippellijn naar twee of meer associaties geeft aan dat er slechts één van de
associaties geı̈nstantieerd kan zijn.
• ...: het feit dat niet alle subklassen in een generalisatie herkend zijn; waarschijnlijk zijn er
meer dan opgegeven.
* * Persoon
Boek auteurs
Pagina * 1 titel {xor}
{ordered} * 1 Organisatie
ISBN
eigenaar
• Een abstracte klasse is een klasse waarvan geen instanties kunnen bestaan. Een abstracte
klasse is altijd een superklasse van andere klassen en dient om een gezamenlijke interface te
definiëren, door middel van overerving.
Figuur {abstract}
positie: Punt
teken()
• Meervoudige overerving: een klasse kan meer dan één superklasse hebben.
18 HOOFDSTUK 3. KLASSE- EN OBJECTDIAGRAM (2)
TelecommunicatieApparaat
beantwoordOproep()
Fax Telefoon
beantwoordOproep() beantwoordOproep()
Telefax
beantwoordOproep()
• Een stereotype is een indeling van modelelementen die niet voort komt uit het conceptuele
domein; maar bijvoorbeeld uit de verdeling op basis van het stadium (domein, applicatie of
implementatie).
<<applicatie>> <<domein>>
⊳ wordtGetoondIn
TextWindow Document
• Een enumeratie is een type waarvoor een vast aantal waarden gedefinieerd is en wordt aange-
geven door het klassesymbool met bovenin het stereotype <<enumeration>>. De mogelijke
waarden van de enumeratie staan in het gedeelte waar normaal de attributen staan.
<<enumeration>> <<enumeration>>
GeslachtType FunctieType
man piloot
vrouw stewardess
• Een interface definieert een aantal services die door een klasse geı̈mplementeerd kunnen
worden. Een interface wordt nooit zelf geı̈nstantieerd. In plaats daarvan worden objecten
geı̈nstantieerd uit klassen die de interface geı̈mplementeerd hebben.
<<interface>>
Verrijdbaar Fiets
Ladenblok
Auto rijden() Verrijdbaar
• Een package is een groepering van modelelementen (zoals klassen, associaties, aggregaties,
generalisaties). Werken met packages is een generiek mechanisme om een opdeling te maken
van een softwaresysteem.
3.2. WERKWIJZE 19
Systeem
DomeinPackage
UserInterfacePackage DatabasePackage
• Een dependency relatie geeft aan dat een bepaald modelelement andere modelelementen
nodig heeft om goed te kunnen functioneren. Een object is bijvoorbeeld van andere objecten
afhankelijk.
• Een geparametriseerde klasse of template is een klasse waarin een aantal zaken afhankelijk
zijn van één of meer parameters.
voegToe(elem: Type1)
verwijder(elem: Type1) Lijst<Punt,200>
elemOpPositie(index:integer): Type1
Figuur 3.1 is een aangepaste versie van figuur ??. Er is een associatieklasse Bemanning
toegevoegd die zelf een associatie heeft met de klasse Bemanningslid. Daarnaast is ook de klasse
Passagier toegevoegd met een voorgedefinieerde constraint ({ordered} ). Bij de klasse Vlucht is
een constraint toegevoegd om rondvluchten te verbieden.
3.2 Werkwijze
In de volgende subsecties wordt een stappenplan beschreven waarbij de nadruk ligt op een domein-
versie van het klassediagram. Om een applicatie- of implementatieversie te maken kan hetzelfde
stappenplan gebruikt worden waarbij wel andere accenten gelegd worden.
Bemanningslid
Luchtvaartmaatschappij
bemanningsleden naam
naam: String
∗ functie: FunctieType
eigenaar
∗
bezit Bemanning
{vertrekpunt <> bestemming}
∗ kisten
Vliegtuig Vlucht
naam: String vluchtnummer: Integer
capaciteit: Integer vertrektijd: Tijd
vluchten
landt() ∗ aankomsttijd: Tijd
voertUit
start() /duur: Tijdsduur
vertrek()
vertrekkende ∗ ∗ binnenkomende
Vluchten Vluchten
Propellervliegtuig Straalvliegtuig ...
{ordered} ∗
Passagier
naam: String
vertrekpunt bestemming
leeftijd: Integer
assistentieNodig: Boolean Luchthaven
geslacht: GeslachtType naam: String
bepaalBelasting(): Real
te benoemen, mag niemand commentaar geven op de kandidaatklassen die door andere deelnemers
aangebracht worden. Er mag wel uitleg over gevraagd worden maar een mening of het wel of niet
een goede klasse is, mag niet te kennen gegeven worden.
Het resultaat van deze stap is een grote lijst van kandidaatklassen. De meeste uit deze lijst
zullen uiteindelijk geen klasse in het systeem worden. Het zijn wel merendeels termen die binnen
het probleemdomein van belang zijn en daarom in een apart deel van de modeldictionary terecht
zullen komen.
Dit heeft dus te maken met het bepalen van de grenzen van het probleemdomein. In
twijfelgevallen kan met de term als klasse aannemen: dit betekent meer werk, maar de
aanpasbaarheid van het systeem in de toekomst zal toenemen. Het niet meenemen als
klasse is vaak eenvoudiger, maar het systeem wordt ook minder flexibel.
In dit stadium is het niet zo erg om wat extra klassen te bepalen. In een volgende fase kan
besloten worden om het ontwerp en de implementatie van bepaalde delen van het systeem
uit te stellen.
3. Vage klassen: een klasse moet een duidelijke betekenis hebben. Wanneer het moeilijk blijkt
om een definitie op papier te krijgen, betekent dit meestal dat het om een vage klasse gaat.
4. Niet kwantificeerbare zaken: zaken als water of geld zijn minder vaag, maar kunnen niet
gekwantificeerd worden. “Eén water” of “drie geld” zijn onzinnige uitspraken.
5. Attributen: dingen waarvan alleen de waarde interessant is. Attributen hebben geen eigen
verantwoordelijkheid en zijn dus geen instanties van een klasse. Het is wel zo dat dezelfde
term in de ene context een object kan zijn, maar in een andere context slechts een attribuut.
Hierbij kan ook de vraag gesteld worden of <naam van de kandidaatklasse> een aspect is
van een andere klasse of is de kandidaat een zelfstandig begrip.
6. Operaties: zaken waarvan alleen (het resultaat van) het gedrag interessant is. Soms wordt
een operatie als een zelfstandig naamwoord geschreven en is daardoor een kandidaatklasse.
7. Rollen: worden vaak verward met klassen. Ieder object blijft gedurende zijn gehele levens-
loop van dezelfde klasse. De naam van de klasse moet iets aangeven van een object, dat
altijd zo blijft. Het gaat om de intrinsieke eigenschappen en verantwoordelijkheden die een
object heeft. Vaak speelt een object gedurende een beperkte periode een bepaalde rol. Een
belangrijk hulpmiddel om het onderscheid te maken is om na te gaan of een object gedu-
rende zijn levensloop van klasse zou moeten kunnen veranderen. Is dit het geval, dan is er
sprake van een rol.
8. Constructies uit andere stadia van ontwikkeling: alle termen die niets met het probleemdo-
mein te maken hebben, maar wel met de implementatie van een geautomatiseerd systeem,
zijn in het domeinmodel niet relevant.
Voor iedere term uit de kandidaatklasselijst wordt nagegaan of het een klasse is of niet. De
uiteindelijke beslissing voor iedere term wordt genoteerd. Voor een groot aantal termen is het
snel duidelijk en is weinig discussie nodig. Er blijven bijna altijd een aantal termen over waarvoor
het niet zo evident is om te bepalen of het klasse is of niet. Bij deze termen moet, naast de
definitie, ook alle argumenten voor en tegen opgeschreven worden. Uiteindelijk moet toch een
keuze gemaakt worden; tijdens volgende iteraties over het klassediagram zal dan wel blijken of de
keuze juist was.
gedurende langere tijd gelden. Eenmalige relaties worden in het dynamisch model als ac-
ties weergegeven. Eventueel kunnen ze in het klassediagram als een dependency tussen de
betrokken klassen weergegeven worden.
3. Afgeleide associaties: kan beschreven worden als een combinatie van bestaande associaties.
De afgeleide associatie is dus redundant en tijdens analyse wordt gestreefd naar een mini-
maal model dat de werkelijkheid zo goed mogelijk beschrijft. (Er zijn wel allerlei redenen
om redundantie toe te voegen tijdens het ontwerp en de implementatie.)
Een eerste klassediagram met klassen en associaties kan nu getekend worden. Dit diagram zal
in een later stadium waarschijnlijk nog aangepast worden. Belangrijk is dat dit model uitstekend
dienst doet als terugkoppeling naar de gebruikers en/of experts.
Het klassediagram kan nog verder uitgewerkt worden door aan de associaties meer informatie
toe te voegen: rollen en multipliciteiten. Het toevoegen van rollen geeft veel meer informatie over
de betekenis van de associatie. De multipliciteit geeft aan hoeveel instanties aan elkaar gerelateerd
kunnen zijn. Het geeft dus de mogelijkheden, maar ook de beperkingen van het klassediagram
aan.
4.1 Achtergrond
De Object Constraint Language (OCL) is een tekstuele taal om extra informatie aan UML-
diagrammen toe te voegen. OCL is bedoeld om constraints, allerlei beperkingen, condities en
regels, die gelden in het model weer te geven.
Visuele modellen kunnen veel inzicht geven in de structuur en het gedrag van een software-
systeem, maar ze staan open voor verschillende interpretaties. Constraints voegen precisie en
eenduidigheid toe aan de diagrammen.
De volgende vormen van constraints worden veel gebruikt:
• Een invariant is een constraint op een klasse die altijd waar moet zijn voor alle instanties
van die klasse. Indien dit niet geval is, gedragen objecten uit die klasse zich niet correct.
• Een pre-conditie is een constraint die altijd waar moet zijn direct voor de executie van een
operatie.
• Een post-conditie is een constraint die altijd waar moet zijn direct na de executie van een
operatie.
• Een guard is een constraint op een toestandsovergang van een object.
Elk van deze constraints kan weergegeven worden met een OCL-expressie. In dit hoofdstuk
worden alleen invarianten behandeld. Voorbeelden van pre- en post-condities en guards zijn terug
te vinden in volgende hoofdstukken.
In de UML-standaard is vastgelegd dat OCL-expressies altijd gekoppeld zijn aan een UML-
diagram, bijvoorbeeld een klassediagram of een toestandsdiagram.
4.2 Overzicht
4.2.1 Expressiecontext
Om de onafhankelijke identiteit van elk object in een objectgeoriënteerd softwaresysteem te bena-
drukken, is elke constraint altijd gebonden aan een bepaald object: de expressiecontext. Vanuit
dit object wordt de omgeving bekeken en expressies geschreven voor objecten uit deze omgeving.
In een diagram is de context duidelijk doordat de constraint in een notebox geschreven wordt die
door middel van een onderbroken lijn met het object verbonden is. Constraints kunnen echter ook
in een apart dokument naast het diagram beschreven worden. De context wordt dan aangegeven
door het sleutelwoord context, gevolgd door de naam van de klasse, gevolgd door een aanduidig
van de intentie van de expressie (bijv. inv voor invariant).
Voorbeeld van een invariant op elke instantie van de klasse Passagier:
25
26 HOOFDSTUK 4. OBJECT CONSTRAINT LANGUAGE
4.2.2 Standaardtypes
Normale standaardtypes zoals Integer, Real, Boolean en String kunnen gebruikt worden in OCL-
expressies. Op de types kunnen de klassieke operatoren (+, -, *, and, =, <>) gebruikt worden.
Daarnaast zijn er twee specifieke operatoren op Booleans.
De implies operator combineert twee Boolean-expressies. De resulterende expressie is waar als,
wanneer de eerste expressie waar is, de tweede expressie ook waar is. Wanneer de eerste expressie
niet waar is, dan is het resultaat altijd waar onafhankelijk van de waarde van de tweede expressie.
context Passagier inv:
leeftijd > = 90 implies assistentieNodig = true
Omdat bij het evalueren van een OCL-expressie het type van het resultaat altijd duidelijk moet
zijn, mag het else-deel van een if-then-else expressie nooit weggelaten worden. Bovendien moet
het resulterende type van het then-deel gelijk zijn aan het type van het else-deel.
context Passagier inv:
if geslacht = GeslachtType::man then
naam.substring(1,4) = ’Dhr.’
else
naam.substring(1,3) = ’Mv.’
endif
De constructie “type::waarde” wordt gebruikt om de waarde van een enumeratietype aan te
geven.
Vlucht Tijd
Tijdsduur
aankomsttijd: Tijd sec: Integer
aantalSec: Integer
vertrektijd: Tijd min: Integer
aantalMin: Integer
/duurtijd: Tijdsduur uren: Integer
aantalUren: Integer
nu(): Tijd
+(t: Tijdsduur): Tijdsduur
na(t: Tijd): Boolean
<(t: Tijdsduur): Boolean
voor(t: Tijd): Boolean
>(t: Tijdsduur): Boolean
verschil(t: Tijd): Tijdsduur
vergelijkt en de waarde waar terug geeft als het aangeroepen object een tijdstip representeert
4.2. OVERZICHT 27
dat later is dan het parameter object, kan volgende invariant op de Vlucht klasse neergeschreven
worden.
In de constraints kunnen ook alle attributen en query operaties van geassocieerde objecten
gebruikt worden.
In de volgende invariant wordt verondersteld dat bepaalBelasting een query operatie is van
de klasse Luchthaven.
Een voorgedefinieerde operatie op een collectie moet voorafgegaan worden door een pijl “− >”
(in plaats van een punt) om het verschil te kunnen maken met eigen gedefineerde operaties met
dezelfde naam.
Operatie notEmpty: geeft waar terug als de Set niet leeg is. Elke luchtvaartmaatschappij
moet minstens één vliegtuig hebben:
Operatie collect: elke luchtvaartmaatschappij moet minstens één vliegtuig hebben dat een
vlucht uitvoert:
Hierbij wordt van de verzameling self.kisten voor ieder vliegtuig de verzameling vluchten ge-
nomen. Dit kan ook in een kortere versie (omdat deze constructie veel voorkomt):
Operatie forAll: levert waar op als de expressie tussen de haken geldt voor elk element van
de verzameling. Voor alle KLM vluchten moet de naam van de vertrek- of aankomstluchthaven
Amsterdam zijn.
Hier resulteert de self.passagier in een Sequence vanwege de {ordered} constraint in het dia-
gram. De complete constraint stelt dat het aantal passagier objecten dat assistentie nodig heeft
kleiner is dan 10.
De expressie Tijd::nu() levert de waarde van de klasse-operatie op, dit is de huidige tijd.
kist.isTypeOf(Vliegtuig) = false
kist.isKindOf(Vliegtuig) = true :Vliegtuig
kist.isTypeOf(Straalvliegtuig) = true
kist.isKindOf(Straalvliegtuig) = true
kist.isTypeOf(Propellervliegtuig) = false
Operatie allInstances: kan alleen worden toegepast op een klasse en niet op een object. Het
resultaat is een verzameling met alle instanties uit de klasse. Hierboven is aangegeven dat het
totaal aantal instanties van de klasse Luchthaven ten hoogste gelijk is aan tachtig.
context Vlucht::passagier
init: OrderedSet{}
4.3 Werkwijze
Veelal worden constraints gebruikt om zogenaamde business rules vast te leggen. Het belangrijkste
daarbij is het vinden van de juiste business rules. Omdat dit zeer afhankelijk is van de “business”
waarin het systeem moet functioneren, is hiervoor geen algemene werkwijze te geven. In wat volgt
worden twee algemene richtlijnen beschreven.
context Vlucht::duur
derive: aankomsttijd.verschil(vertrektijd)
Er wordt gesteld dat de doorsnede van de vertrekkende en aankomende vluchten moet leeg
zijn. Dit is een complexere constraint en dus is Vliegveld een minder geslaagde context keuze.
3. Het aantal passagiers op een vlucht is ten hoogste gelijk aan de capaciteit van het vliegtuig.
Keuzes voor de context zijn Vlucht en Vliegtuig. Passagier ligt niet voor de hand, omdat de
constraint niets zegt over een enkele passagier.
De tweede mogelijkheid lijkt de eenvoudigste. Omdat Vlucht ook het object is dat de relatie
tussen Vliegtuig en de Passagiers tot stand brengt, is Vlucht het meest aangewezen object
om de verantwoording voor deze constraint te dragen.
4. Een vlucht kan alleen gevlogen worden door een bemanningslid met de functie piloot.
Interactie diagrammen
31
32 HOOFDSTUK 5. INTERACTIE DIAGRAMMEN
<<actor>>
Baliemedewerker
openRekening()
stortOpRekening()
Baliemedewerker neemOpVanRekening()
interacties tussen het systeem en één of meerdere actoren, totdat het einde van de use-case bereikt
is.
Voor het maken van een use-case wordt een template gebruikt (zie tabel 5.1).
Omdat de use-case zich richt op de interactie tussen de actoren en het systeem, onderschei-
den we in de beschrijving interactiestappen, aangegeven met cijfers tussen haakjes (). Deze in-
teractiestappen worden gebruikt om het verband te leggen tussen een use-case en sequence- en
communicatiediagrammen.
Er zijn twee soorten relaties tussen use-cases:
• include-relatie: verbinding tussen een use-case en een sub-case. Een sub-case is een deel
van een use-case, dat op zichzelf weer als use-case beschouwd wordt. Een sub-case kan
door een willekeurig aantal use-cases gebruikt (of beter, geı̈ncludeerd, omvat) worden. Het
vertoont veel overeenkomst met een subroutine. Iedere use-case kan zelf ook als sub-case in
een andere use-case gebruikt worden.
• extends-relatie: verbinding tussen een use-case en een tweede use-case, die optioneel kan
uitgevoerd worden binnen de eerste use-case. De eerste use-case definieert een aantal uit-
5.1. USE-CASE DIAGRAM 33
5.1.4 Werkwijze
1. Identificeer de grens van het systeem en vind de actoren.
De grenzen van het systeem worden bepaald door wat wel en niet onder de verantwoorde-
lijkheid van het systeem valt. Daarna wordt gezocht naar mensen en andere systemen die
direct met het systeem communiceren. Hiervoor worden de rollen bepaald die ze spelen ten
opzichte van het systeem. Eén mens of systeem kan meerdere rollen spelen. Iedere gevonden
rol is een actor.
Actoren Baliemedewerker.
Beschrijving (1) De baliemedewerker maakt aan het systeem bekend dat een nieuwe
rekening aangemaakt moet worden en geeft de NAW-gegevens van de
klant. Als de klant een bedrijf is, wordt ook de kamer van koophandel
nummer ingevuld.
(2) Het systeem checkt of de klant al bekend is. Is dit het geval, dan
worden de klantrekeningen gecontroleerd op roodstaan. Als de klant
roodstaat, treedt een uitzondering op. Het systeem maakt het nieuwe
rekeningnummer aan de baliemedewerker bekend.
Uitzonderingen [Roodstaan] Als één rekening van de klant roodstaat, dan wordt hiervan
door het systeem melding gegeven. De baliemedewerker kan naar de
use-case Storten overgaan om de klant de gelegenheid te geven het saldo
aan te vullen. Als het saldo aangevuld is, dan wordt de rest van deze
use-case uitgevoerd.
Banksysteem
conditie: {klant is reeds bekend}
extension point: klantgegevens
Rekening Klantgegevens
toevoegen <<extends>> opvragen
Baliemedewerker
<<include>> Vind
Opnemen
rekening
<<include>>
Storten
Klant
1. Een interactie is een reeks van gebeurtenissen die plaats vinden tijdens één specifieke (deel)
sessie met het systeem. Uitgaande van de interactie tussen de actor en het systeem in een
use-case, worden nu ook de interactie met behulp van boodschappen tussen objecten in het
systeem beschreven. Iedere input van een actor in een use-case is nu input voor een specifiek
object in het systeem. Dit object kan op zijn beurt weer boodschappen sturen naar andere
objecten in het systeem.
3. Een boodschap (beter dan event) is een stimulus die van een object naar een ander object
gestuurd wordt, bijvoorbeeld operatie-aanroepen en het sturen van signalen. Een interactie
is een serie boodschappen.
<<actor>>
:Gebruiker :Wekker
aan
Gebruiker zet wekker aan t1
zoem
Wekker laat zoem horen t2
{t2-t1<24 uur}
36 HOOFDSTUK 5. INTERACTIE DIAGRAMMEN
5. Een interactiediagram kan als geheel in een frame geplaatst worden. Linksboven in het frame
staat dan het keyword sd, gevolgd door de naam van het interactiediagram. Door middel van
deze naam kan in een interactiediagram naar een ander interactiediagram verwezen worden:
een intern frame met het keyword ref gevolgd door de naam.
6. Een asynchrone event is een event (operatie aanroep) die niet op het moment van verzending
verwerkt wordt door het ontvangende object.
7. Een conditionele event is een boodschap die alleen kan voorkomen onder bepaalde condities.
⇁
⇀
[not local] 1:getData()
mijnPC:Client :DatabaseServer
[local] 1:getData()
:LocalDatabase
Een speciaal geval van conditionele boodschap is een keuzemogelijkheid in een sequencedia-
gram door middel van een frame met keyword alt.
[local] getData()
8. Iteratie van events. Vaak komt het voor dat een boodschap meerdere keren naar een object
gestuurd wordt, bijvoorbeeld met een andere parameter.
1: show
:MainWindow :LijstWindow 2 : ∗[i := 1..10] geefElem(i) :Lijst
3: hide
9. Activering van een object. In een sequence diagram kan aangegeven worden dat een object
gedurende een bepaalde tijd actief is, bijvoorbeeld tijdens de executie van een operatie. Een
object dat uit zichzelf acties kan uitvoeren of events kan versturen, is een actief object. De
tijdsperiode gedurende welke het object een actie uitvoert, direct of indirect via aanroep van
een andere operatie, wordt aangegeven door een witte balk.
:Luchthaven v:Vlucht :Vliegtuig
In een communicatiediagram kan de tijd dat een object actief is, niet worden aangegeven.
getData()
getData()
10. Recursie of zelfaanroep. Het aanroepen door een object van een operatie op zichzelf wordt
in beide diagrammen weergegeven met een kromme lijn.
11. Ook creatie en verwijdering van objecten kan weergegeven worden. (Object wordt tijdens de
interactie gecreëerd.)
12. Soms is het relevant om het resultaat van een operatie-aanroep in de diagrammen op te
nemen.
:Window
sequence diagram:
create
:IntegerLijst
geefMaximum
∗[i := 1..aantalElementen]
vergelijk(elem[i], elem[i + 1])
p
communicatiediagram:
2 : ∗[i := 1..aantalElementen]
:Window 1: p:=geefMaximum :IntegerLijst{transient} vergelijk(elem[i], elem[i + 1])
<<self>>
Voorstelling:
38 HOOFDSTUK 5. INTERACTIE DIAGRAMMEN
5.2.2 Voorbeelden
Een sequence diagram is weergegeven in figuur 5.3. De tijdsvolgorde is van boven naar beneden.
sd afgaan alarm
wektijd()
wektijd()
aan
aan
start
hetIsTijd
start
Zoem
uit
uit
stop
stopZoem
Exact dezelfde informatie wordt weergegeven in het communicatiediagram (figuur 5.4). Het
tijdsaspect is echter minder visueel zichtbaar. Door middel van een decimaal nummering systeem
kan duidelijk gemaakt worden welke boodschap welke andere boodschap tot gevolg heeft.
5.2. SEQUENCE- EN COMMUNICATIEDIAGRAM 39
sd afgaan alarm
1:wektijd() 3.1:uit()
:InvoerController :Alarm
2:aan() 1.1:wektijd()
3:uit() 2.1:aan()
↓2.2:start()
2.4:start()
2.3:hetIsTijd() ↑
2.5:Zoem() 3.2:stop()
Het communicatiediagram kan ook gebruikt worden als overzicht van alle boodschappen die
tussen objecten van bepaalde klassen plaatsvinden. Het diagram dient als verzamelplaats voor
alle events uit de sequence en/of communicatiediagrammen. Zo’n diagram kan zelfs bij een klein
aantal klassen al behoorlijk onoverzichtelijk worden. In dat geval kan een communicatiediagram
per klasse opgesteld worden. De klasse wordt in het midden getekend met alle andere klassen
die ermee communiceren in een cirkel eromheen. In dit diagram worden alleen de uitgaande
boodschappen van en de binnenkomende boodschappen naar de middelste klasse getekend.
Sequence- en communicatiediagrammen zijn semantisch equivalent: ze representeren dezelf-
de informatie. Het sequencediagram benadrukt de volgorde van de interacties in de tijd. Het
communicatiediagram legt de nadruk op de context en de globale organisatie van de objecten die
interactie voeren. Of, het sequencediagram wordt gerangschikt op tijd, het communicatiediagram
op ruimte.
5.2.3 Werkwijze
Om een compleet systeem te modelleren zijn altijd meerdere sequence- of communicatiediagram-
men nodig. Het is belangrijk om het aantal diagrammen dat nodig is, juist in te schatten. Teveel
diagrammen maken voegt geen extra kennis over het systeem toe, maar kost wel tijd. Te weinig
diagrammen maken betekent dat er niet genoeg kennis over het systeem is vastgelegd om verder
te kunnen gaan met het ontwikkelingstraject. Enkele richtlijnen voor het juist aantal diagram-
men:
• voor elke use-case minstens één diagram;
• voor elke keuze in een use-case die een relevant verschil in het vervolg van de use case
betekent, een apart diagram;
• wanneer verschillende diagrammen veel op elkaar gelijken, wordt één diagram gemaakt met
daarbij als commentaar welke boodschappen of boodschappenseries anders zouden zijn bij
de andere diagrammen.
Het stappenplan:
Dit is het object dat het verzoek van de gebruiker voor een service aanneemt. Gedurende de
domeinanalyse kan de user interface buiten beschouwing gelaten worden. De boodschap die
van de actor naar het aannemende object gaat, kan direct naar een domeinobject gestuurd
worden. Het is ook mogelijk om in deze fase een pseudo-object te introduceren dat de user
interface voorstelt. In een latere fase zal een werkelijk interface object de boodschap van de
actor moeten aannemen.
3. Bepaal de beantwoording.
Wanneer het aangeroepen object de gevraagde service zonder hulp van andere objecten kan
uitvoeren, moet nog een boodschap van het object naar de gebruiker toegevoegd worden om
de interactie compleet te maken.
Heeft het object informatie nodig van andere objecten of is de gevraagde service duidelijk
iets dat onder de verantwoordelijkheid van een ander object valt, dan stuurt het object op
zijn beurt weer een boodschap naar een ander object. Er gaat dus een pijl van het eerste
object naar dit tweede object.
4. Herhaal de vorige stap voor elk object dat in de interactie aangeroepen wordt. Elk nieuw
object dat nodig blijkt om de interactie te kunnen vervolgen, wordt toegevoegd aan het
diagram, inclusief de boodschap die ernaar gestuurd wordt.
5. Voeg extra informatie toe.
Bepaal nu of timing constraints of asynchrone boodschappen en dergelijke van toepassing
zijn. Voeg deze informatie in de gepaste vorm aan het sequence- of communicatiediagram
toe.
Klassenaam Verantwoordelijkheden
...
Samenwerking ...
... ...
...
...
(objecten die een object uit deze klasse nodig heeft (zaken die aan objecten uit deze
om aan zijn verantwoordelijkheden te kunnen voldoen) klasse kunnen gevraagd worden)
CRC-kaarten worden meestal tijdens een workshopsessie gebruikt. De deelnemers aan de sessie
zijn domeinexperts, toekomstige gebruikers en systeemontwerpers. Bij deze techniek wordt voor
iedere klasse uit het model een kaartje gemaakt, met daarop de naam van de klasse. Tijdens de
sessie zullen hierop ook de verantwoordelijkheden en de objecten waarmee objecten uit deze klasse
samenwerken, genoteerd worden. Iedere deelnemer krijgt één of meer kaartjes en vereenzelvigt
zich dus met de klasse van het kaartje. Vervolgens worden de interactiestappen gespeeld.
De spelleider speelt de externe actor en begint. Hij geeft aan tot wie (welk object dus) hij zijn
vraag stelt. In de interactie van figuur 5.3 wordt dus de vraag zet wektijd aan de InvoerController
gesteld. De persoon die het kaartje met InvoerController heeft, bepaalt nu of hij de vraag zelf kan
beantwoorden, of dat hij hulp van andere klassen nodig heeft. Als hij zelf het antwoord weet, dan
5.2. SEQUENCE- EN COMMUNICATIEDIAGRAM 41
geeft hij dat terug aan de vrager. Zo niet, dan stelt hij op zijn beurt weer een vraag aan een ander
object. Het object dat bevraagd wordt, neemt vervolgens de controle over.
Iedere vraag die aan een bepaald object gesteld wordt, wordt door de persoon die het kaart met
de desbetreffende klasse heeft, onder “verantwoordelijkheden” opgeschreven. Iedere klasse die een
vraag stelt aan een ander object, zet de naam van dat object onder “samenwerking”. Na afloop
van een sessie staan bij iedere klasse twee lijsten, een lijst met verantwoordelijkheden (zaken die
aan objecten uit die klasse gevraagd kunnen worden) en een lijst met samenwerkers (objecten die
het object nodig heeft om aan zijn verantwoordelijkheden te kunnen voldoen).
Tijdens een sessie kan het voorkomen dat een vraag gesteld wordt, maar dat de verantwoor-
delijkheid voor het beantwoorden van de vraag bij geen van de aanwezige klassen te plaatsen
is. Dit betekent dat een nieuwe klasse moet toegevoegd worden aan het klassediagram. Voor
iedere use-case kan een sessie gedaan worden. Naar het einde toe zullen steeds minder nieuwe
verantwoordelijkheden en samenwerkingen ontdekt worden.
Alarm Verantwoordelijkheden
− zetten van wektijd
Samenwerking
− activeren van wekker
− Timer
− Zoemer − stopzetten van wekgeluid
Toestands- en activiteitsdiagram
6.1 Toestandsdiagram
6.1.1 Concepten
1. Een toestand is een stabiele staat waarin een object zich gedurende enige tijd bevindt.
Een toestand wordt in het diagram aangegeven door middel van een recht-
hoek met afgeronde hoeken met daarin de naam van de toestand. leeg
Een object van klasse Beker kan in twee toestanden zijn: leeg en vol.
2. Een transitie is een toestandsovergang, meestal van één toestand naar een andere toestand.
Maar een transitie kan ook naar dezelfde toestand leiden (zelftransitie). Een transitie wordt
veroorzaakt door een event, behalve bij een automatische transitie. Een event is een gebeur-
tenis die geen tijd kent; voorbeelden zijn een synchrone operatieaanroep (call event) en het
ontvangen van een asynchroon signaal (signal event). Wanneer de event schenkIn gebeurt,
gaat het object van toestand leeg naar toestand vol.
Een toestandsovergang wordt aangegeven met een pijl tussen twee toestanden met de naam
van de veroorzakende event naast de pijl.
3. Er zijn twee speciale toestanden. Een begintoestand is de toestand waarin het object zich
bevindt wanneer het gecreëerd wordt. Er zijn alleen transities van de begintoestand naar
een andere toestand. Een eindtoestand is de toestand waarin het object niet meer bestaat.
Er komen alleen transities voor die naar de eindtoestand gaan.
nieuw
schenkIn
leeg vol
drinkOp
gooiWeg
Een begintoestand wordt aangegeven door een zwart gevulde cirkel, een eindtoestand met
een zwart gevulde cirkel met eromheen een andere cirkel.
4. Aan het toestandssymbool kunnen details toegevoegd worden.
De rechthoek met afgeronde hoeken wordt in drie gebie- Naam
den verdeeld. Het bovenste gebied bevat de naam van
toestandsvariabelen
de toestand, het middeldste gebied bevat toestandsva-
riabelen, zoals tellers en timers, en het onderste gebied activiteiten
activiteiten.
5. Een activiteit is een operatie die uitgevoerd wordt binnen de tijd dat een object zich in
één toestand bevindt. Er is altijd maar één activiteit binnen één toestand mogelijk. Een
activiteit kan onderbroken worden.
43
44 HOOFDSTUK 6. TOESTANDS- EN ACTIVITEITSDIAGRAM
begin
witZet
witAanZet zwartAanZet [schaakmat]
zwartZet
[schaakmat]
Een guard kan ook in combinatie met een event bij een transitie opgegeven worden. De
transitie kan dan plaats vinden wanneer de guard waar oplevert op het moment dat de event
plaats vindt.
7. Een automatische transitie is een transitie die plaats vindt wanneer de activiteit in een
toestand is afgerond. Er gebeurt dus geen event.
lekEnVol
Een automatische transitie komt altijd voor in do/ druppel
combinatie met een activiteit of een guard. leeg
vloeistof eruit
8. Een actie is een atomaire operatie, vraagt dus logisch gezien geen tijd en kan nooit on-
derbroken worden. Net als een event, is een actie òf uitgevoerd, òf moet nog uitgevoerd
worden. Een actie is altijd een neveneffect van een transitie, bijvoorbeeld het zenden van
een boodschap naar een ander object of het aanpassen van de waarde van een attribuut.
inbreker/∧sirene.start
wachtend actief
Een actie wordt weergegeven door een schuine streep achter de event waar hij bij hoort,
gevolgde door de naam van de actie. Het ∧ symbool voor de actienaam geeft aan dat een
boodschap gezonden wordt naar een ander object.
In het voorbeeld wordt de boodschap start naar het object sirene gestuurd.
9. Volgende acties komen alleen in toestandsdiagrammen voor en worden binnen de toestand
aangegeven door een label exit/ of entry/ met daarachter de actie.
Een exit-actie bij een toestand is een actie die uitgevoerd
wordt wanneer de toestand verlaten wordt, ongeacht via bellend
welke transitie. Een entry-actie bij een toestand is een actie entry/ startRing
die uitgevoerd wordt op het moment dat het object in die exit/ endRing
toestand komt.
10. Complete event/transitie notatie: eventnaam (parameters) [guard] / actie.
De totale beschrijving van een event, met alle mogelijke zijeffecten, bestaat uit de eventnaam,
een guard en een actie. Een event kan ook nog parameters hebben.
11. Een subtoestand is een toestand binnen een andere toestand. Transities van buiten de hoofd-
toestand direct naar een subtoestand zijn toegestaan en worden weergegeven met een pijl
van een toestand buiten de hoofdtoestand eindigend bij de subtoestand. In het geval dat de
transitie naar de hoofdtoestand gaat, moet binnen de hoofdtoestand een begin(sub)toestand
gedefinieerd zijn en komt het object in die begin(sub)toestand.
6.1. TOESTANDSDIAGRAM 45
drinkOp(hoeveelheid)
ondrinkbaar [hoeveelheid = inhoud]
nieuw
leeg drinkbaar
vol
schenkIn lekt(hoeveelheid)
gooiWeg
[hoeveelheid < inhoud]
halfVol
drinkOp(hoeveelheid)
[hoeveelheid < inhoud]
6.1.2 Voorbeeld
Een toestandsdiagram van een bepaalde klasse beschrijft de levensloop (of levenscyclus) van objec-
ten uit die klasse. Een toestandsdiagram wordt ook aangeduid met de term state machine. Zo’n
diagram geeft inzicht in hoe het gedrag van een object wijzigt in de tijd gedurende zijn levensloop.
Er wordt per klasse één toestandsdiagram gemaakt.
Het gebruik van toestandsdiagrammen is een bekende techniek, vooral bij real-time systemen.
Zo’n traditioneel toestandsdiagram beschrijft de toestand van het systeem als geheel en worden
vaak alleen maar gebruikt voor relatief dynamische systemen zoals procesautomatisering. De
toestandsdiagrammen binnen UML beschrijven ieder slechts de toestand van objecten uit één
klasse. In de praktijk blijken deze toestandsdiagrammen ook erg nuttig te zijn bij zogenaamde
“saaie” administratieve systemen.
Een voorbeeld van de klasse Bankrekening met attributen positiefSaldo en negatiefSaldo is
gegeven in figuur 6.1.
open
pasGeopend stort(bedrag)
[negatiefSaldo > bedrag]
stort(bedrag)
stort(bedrag)
positiefSaldo [negatiefSaldo < bedrag] negatiefSaldo
do/berekenSaldo neemOp(bedrag) do/berekenSaldo
[positiefSaldo <= bedrag]
stort(bedrag)
neemOp(bedrag)
hefOp/betaalUit(saldo)
[positiefSaldo >= bedrag]
6.1.3 Werkwijze
Eerst moet bepaald worden voor welke klassen wel en voor welke klassen geen toestandsdiagram
gemaakt zal worden. Er zijn meestal een groot aantal nogal passieve objecten die geen enkel
interessant dynamisch gedrag vertonen. De bijhorende triviale toestandsdiagrammen kunnen beter
weggelaten worden.
Het stappenplan voor het maken van één toestandsdiagram:
1. Vind de toestanden waarin een object zich kan bevinden.
Uitgangspunt is de verzameling events die bij het object kunnen aankomen. Deze verzameling
kan uit het sequence- of communicatiediagram gehaald worden.
46 HOOFDSTUK 6. TOESTANDS- EN ACTIVITEITSDIAGRAM
Een binnenkomende event is voor een object ofwel een boodschap (een aanvraag van een
bepaalde service) ofwel het antwoord op een eerder verstuurde boodschap. Bij elke event
dat bij een object kan binnenkomen, moet men zich afvragen of het object in een specifieke
toestand moet zijn om de juiste service te kunnen leveren of om juist met de binnenkomende
informatie om te gaan.
In figuur 6.2 is nog een tweede voorbeeld van een toestandsdiagram gegeven.
6.2 Activiteitsdiagram
6.2.1 Concepten
1. Een activiteit is een proces, dat eventueel samengesteld kan zijn uit andere activiteiten.
Een activiteit die niet opgedeeld wordt, is een atomaire activiteit en wordt soms ook actie
genoemd. Een samengestelde activiteit wordt opgedeeld in subactiviteiten en deze opdeling
kan verder beschreven worden in een apart activiteitsdiagram. Atomaire en samengestelde
activiteiten kunnen in een diagram naast elkaar voorkomen. Het bijhorende symbool heeft
een rechte boven- en onderkant en ronde zijkanten met een activiteitsexpressie erin.
6.2. ACTIVITEITSDIAGRAM 47
Scherm
beveiligen
[isTimeout] toetsaanslagOfMuisbeweging
Werken
2. Een externe activiteit is een activiteit die niet uitgevoerd wordt door het (software)systeem
dat beschreven wordt, maar door een entiteit daarbuiten. Net als actoren in use-cases
kunnen deze entiteiten mensen zijn, maar ook externe (software)systemen. Het stereotype
<<external>> geeft aan dat het over een externe activiteit gaat.
3. Flow of control: de volgorde van activiteiten in een activiteitsdiagram; zodra een activiteit
beëindigd is, zal de volgende activiteit starten. Voorstelling: een pijl van een activiteit naar
een volgende activiteit.
Voor het begin en het eind van het diagram worden dezelfde symbolen als in een toestands-
diagram gebruikt.
<<external>>
ontvangBestelling maakLevering leverAf
5. Een beslispunt is een punt waar mogelijke transities door guards bewaakt worden en waar
dus meerdere uitgaande (automatische) transities van een activiteitstoestand mogelijk zijn.
De plaats waar een keuze weer bij elkaar komt, heet een samenkomst punt.
48 HOOFDSTUK 6. TOESTANDS- EN ACTIVITEITSDIAGRAM
f berekenRisico
[risico groot]
vraagAutorisatie
[risico klein]
geefLening
f gaDoor
6. Een splitsing is een transitie die resulteert in twee of meer activiteiten. In tegenstelling tot
een keuzetransitie worden bij een splitsing beide nieuwe activiteiten actief en is er sprake
van parallellisme.
Een synchronisatie is een transitie vanuit twee of meer activiteiten welke eindigt in één
toestand. Parallelle activiteiten, geı̈ntroduceerd door een splitsing kunnen zo weer bij elkaar
komen.
7. Een activiteitsdiagram kan opgedeeld worden in swimlanes om aan te geven wie er verant-
woordelijk is voor het uitvoeren van een activiteit.
reserveerGeld maakContract
doeAanbod
Een activiteitsdiagram is een variatie op een toestandsdiagram: alle toestanden zijn activi-
teitstoestanden. In zo’n activiteitstoestand voert het object een activiteit uit, waarna het in een
volgende toestand terecht komt. De verschillen zijn dat (1) in activiteitsdiagrammen alleen acti-
viteitstoestanden voorkomen en dus voornamelijk automatische transities (dit zijn transities die
plaats vinden wanneer de activiteit in een toestand is afgerond), en dat (2) een activiteitsdiagram
toestanden van meer dan één object kan beschrijven. Een groot nadeel van activiteitsdiagrammen
is dan ook dat de koppeling activiteit-object niet duidelijk is.
6.2.2 Werkwijze
Op hoog niveau kunnen activiteitsdiagrammen gebruikt worden voor het beschrijven van be-
drijfsprocessen. In dit geval zijn de verantwoordelijke eenheden in de swimlanes de verschillende
afdelingen van een bedrijf en is er geen directe relatie met de andere UML-diagrammen en met de
objecten uit het klassediagram. Met dit type wordt workflow modelering mogelijk, bijvoorbeeld
het weergeven van parallellisme van activiteiten.
Ook op gedetailleerd niveau kunnen activiteitsdiagrammen gebruikt worden als beschrijving
van een proces of een algoritme. In deze vorm kan het diagram gebruikt worden om een operatie
van een klasse te definiëren. Het niveau van het diagram moet natuurlijk wel hoger blijven dan
de programmacode. Volgend stappenplan kan gebruikt worden:
6.2. ACTIVITEITSDIAGRAM 49
1. Selecteer operaties.
Alleen van operaties van de klassen uit het klassediagram die werkelijk complex zijn, worden
activiteitsdiagrammen gemaakt. Meestal is dit een relatief klein aantal.
2. Vind de activiteiten en de bijhorende flow.
Schrijf de activiteiten op in volgorde waarin ze uitgevoerd moeten worden. Wanneer de
volgorde niet van belang is, gebruik dan een splitsing waarbij de verschillende activitei-
ten parallel gedaan worden. Voor een duidelijker diagram kunnen eventueel connectoren
gebruikt worden.
3. Bepaal per activiteit welk object verantwoordelijk is.
Het verantwoordelijke object is het object dat de activiteit uitvoert, nogal dikwijls het object
dat de operatie uitvoert. Maar dit is niet noodzakelijk omdat een activiteit kan gedelegeerd
worden naar een ander object.
4. Splits activiteiten indien nodig.
Indien in vorige stap geen enkel verantwoordelijk object kan gevonden worden, dan moet
die activiteit opgesplitst worden in deelactiviteiten waarvoor wel verantwoordelijke objecten
te vinden zijn. Deze opsplitsing kan binnen hetzelfde activiteitsdiagram plaatsvinden, maar
kan eventueel ook leiden tot een subactiviteitsdiagram waarin de samengestelde activiteit
beschreven wordt.
50 HOOFDSTUK 6. TOESTANDS- EN ACTIVITEITSDIAGRAM
Hoofdstuk 7
Applicatie- en
implementatiestadium
7.1 Beschrijving
In de domeinanalysefase is de focus gericht op wat er dient te gebeuren. De opgestelde modellen
richten zich op het probleemdomein; er worden geen veronderstellingen gedaan over de implemen-
tatie. In de ontwerpfase is de aandacht juist wel gericht op hoe zaken gerealiseerd moeten worden.
De aandacht verschuift van het probleemdomein naar computeraspecten.
Voordat een applicatie- of implementatieversie van de diagrammen kan gemaakt worden, moe-
ten een aantal beslissingen over de omgeving waarbinnen het systeem geı̈mplementeerd wordt,
duidelijk gedocumenteerd zijn, inclusief argumentatie en verworpen alternatieven. Zaken zoals
de keuze van de programmeertaal, besturingssysteem, klassebibliotheken (o.a. voor de GUI), da-
tabase en hardware moeten vastgelegd zijn. In verband met het gegevensbeheer moet bepaald
worden welke objecten persistent moeten zijn. Dit zijn objecten die na het beëindigen van een
sessie bewaard moeten blijven. Er moet ook geweten zijn op welke manier deze objecten moeten
worden opgeslagen.
Een andere voorwaarde voor de start van een volgend stadium is dat het huidige model stabiel
is, d.w.z. dat het de verwachting is dat de structuur en dynamiek van de objecten die tot dan
toe herkend zijn niet meer significant zullen wijzigen. Indien het domeindeel van de diagrammen
gewijzigd wordt, dan zullen ook alle beslissingen over applicatieklassen en implementatiestructuren
opnieuw bezien moeten worden. Sommige daarvan zullen nog steeds valide zijn, maar de kans is
groot dat er beslissingen bij zijn die anders uit gaan vallen.
In de ontwerpfase worden de bestaande diagrammen verder uitgewerkt tot een applicatie-
model en vervolgens tot een implementatiemodel. Gedurende dit proces worden nieuwe klas-
sen toegevoegd en bestaande klassen nader gedetailleerd. Bovendien wordt de informatie uit
alle diagrammen met elkaar geı̈ntegreerd in het klassediagram. Het uiteindelijke resultaat is een
implementatie-klassediagram, een complete beschrijving van alle klassen in het systeem. Dit is de
blauwdruk voor de implementatie. Het stelt de programmeurs in staat om rechttoe, rechtaan het
systeem te coderen.
51
52 HOOFDSTUK 7. APPLICATIE- EN IMPLEMENTATIESTADIUM
7.2 Werkwijze
Om tot een applicatie- of implementatiemodel te komen, worden de stappen die tot de domeinversie
van de diagrammen geleid hebben, simpelweg herhaald, maar nu met de aandacht gericht op
applicatie- of implementatieaspecten. De informatie die over een aantal diagrammen verspreid is,
moet in één diagram geı̈ntegreerd worden.
nog niet gebeurd is). Associaties tussen de nieuwe klassen en de oude klassen worden gelegd.
De modeldictionary voor alle oude klassen wordt gecontroleerd en eventueel verbeterd.
Uit de sequence- of communicatiediagrammen blijkt welke objecten boodschappen versturen
naar andere objecten. Om een boodschap te kunnen sturen moet het ontvangende object
wel bekend zijn bij de zender. Hiervoor bestaan in het algemeen drie manieren:
• De zender heeft een link met de ontvanger, dus de klasse van de zender heeft een
associatie met de klasse van de ontvanger (zie figuur 7.1).
• De zender krijgt een referentie naar de ontvanger (de identiteit ervan) mee als para-
meter bij een boodschap. Gedurende het uitvoeren van die boodschap kent de zender
dan de ontvanger (zie figuur 7.2).
• De zender kan vanuit een object dat hem bekend is (op één van bovenstaande ma-
nieren) via één of meer links het ontvangende object vinden.
Indien de zenders uit de interactiediagrammen de ontvangende objecten niet kunnen berei-
ken, moet het klassediagram aangepast worden.
2. Leid attributen uit de interactie- en toestandsdiagrammen af (stap 5).
Hier kunnen bijvoorbeeld toestandsattributen worden afgeleid, die aangeven in welke toe-
stand een object zich bevindt.
3. Voeg operaties aan het klassediagram toe (stap 6).
Binnenkomende boodschappen uit een interactiediagram en binnenkomende events uit een
toestandsdiagram worden operaties bij de betreffende klasse in het klassediagram. Een even-
tuele returnwaarde, die in het interactiediagram aangegeven is, moet meegenomen worden
als resultaattype van de operatie. Alle operaties die zo uit boodschappen/events ontstaan,
zijn publieke operaties.
Voor iedere actie en activiteit uit een toestandsdiagram wordt een corrsponderende operatie
bij de betreffende klasse gemaakt. Omdat dit allemaal zaken zijn die het object intern
uitvoert, worden deze operaties in het algemeen privé-operaties binnen de klasse.
4. Vervolledig het klassediagram (stap 7–10).
Het toevoegen van overerving, het schrijven van OCL-constraints en het model eventueel
opdelen.
tekenLijn()
Ook een associatie met een associatieklasse wordt omgezet naar attributen bij de betreffende
klassen. Bij een bidirectionele associatie zal de associatieklasse attributen hebben met als
type de klassen die met elkaar geassocieerd zijn. Deze beide klassen zullen attributen hebben
met als type de associatieklasse. Indien een associatie met een associatieklasse slechts in
één richting wordt geı̈mplementeerd, vervallen een aantal attributen.
Huwelijk
Man Vrouw
isGetrouwdMet
Wanneer een associatie in twee richtingen wordt geı̈mplementeerd, moet een strategie geko-
zen worden om ervoor te zorgen dat beide richtingen consistent met elkaar blijven. Meestal
betekent dit dat de operatie waarin de associatie (d.i. attribuut) wordt bijgewerkt, extra
acties zal uitvoeren om de consistentie ofwel te controleren ofwel af te dwingen.
2. Ontwerp attributen.
Er wordt bepaald hoe de objecten intern gerepresenteerd gaan worden: voor alle attributen
moet het type en het waardebereik gedefinieerd worden. Tijdens deze stap worden vaak
utilityklassen geı̈dentificeerd die als type van een attribuut nodig zijn, bijvoorbeeld Tijdstip,
Datum, Adres. Deze utilityklassen worden meestal niet opgenomen in het klassediagram
omdat ze van ondergeschikt belang zijn en het overzicht in het diagram verloren zou kunnen
gaan.
3. Ontwerp operaties.
Het type van de parameters en resultaat moeten worden toegevoegd. Ook pré- en postcon-
dities (in OCL) kunnen bij elke operatie in het klassediagram toegevoegd worden. Uit het
toestandsdiagram kan afgeleid worden welke events voor een object toegestaan zijn in een
bepaalde toestand. Hieruit volgen direct de voorwaarden om de bij een event horende ope-
ratie te mogen gebruiken: het object moet zich in een toestand bevinden waarin het event
is toegestaan (pré-conditie). Uit de toestandsdiagrammen kan ook afgeleid worden wat het
effect van een event is. Het object kan in een nieuwe toestand komen. Deze informatie
wordt opgenomen in de postconditie van de bij de event horende operatie.
7.2. WERKWIJZE 55
4. Overerving.
De overervingsrelaties moeten opnieuw gecontroleerd worden; waarschijnlijk zal weinig de-
tailinformatie toegevoegd worden.
5. OCL-constraints.
In eerdere stadia hebben deze veel inzicht gegeven in de exacte structuur en werking van
het systeem. Nu moet bepaald worden hoe deze constraints geı̈mplementeerd gaan worden.
Is het mogelijk dit te doen met behulp van een exceptiemechanisme of kunnen een paar
eenvoudige testen op het moment dat een operatie wordt aangeroepen, volstaan.
6. Packages.
Het (opnieuw) opdelen van het model is zinvol wanneer door de extra toegevoegde infor-
matie, een nieuwe of andere logische opdeling kan gemaakt worden.
cases dienen als basis, maar op dit moment worden o.a. boodschappen beschreven die uitgewisseld
worden tussen objecten in de userinterface. Van de sequencediagrammen zal er vaak een nieuwe
versie gemaakt worden. De bestaande toestandsdiagrammen blijven correct, maar er zullen vooral
voor controllerklassen nieuwe toestandsdiagrammen gemaakt worden.
Deze laatste stap is eigenlijk weer gelijk aan de eerste stap. Nieuwe kennis, nieuwe details, maar ook
compleet nieuwe klassen moeten op zorgvuldige wijze worden ingepast in het bestaande model.
Vaak blijkt in dit stadium dat de bestaande diagrammen structureel weinig gewijzigd worden,
terwijl er erg veel elementen (zowel operaties, attributen als klassen) aan toegevoegd worden.
Ook tijdens het implementeren kunnen kleine punten in het model bijgesteld moeten worden.
Hierbij moet steeds de uitgangspunten van het systeem in de gaten gehouden worden. Dit zijn
de verantwoordelijkheden die in de domeinklassen vastgelegd zijn. Verder is het zinvol om schei-
dingen zoals in een lagen-model te gebruiken. Deze leveren een bijdrage aan de flexibiliteit en
onderhoudbaarheid van het systeem. Als een lagen-model gebruikt wordt, is het belangrijk om de
scheidingen zuiver te houden. Databeheer hoort thuis op de datalaag en niet in bijvoorbeeld de
userinterfacelaag, ook al kost dit in eerste instantie meer werk. Dergelijke kosten worden tijdens
onderhoud terugverdiend.
Een component is een executeerbare eenheid, maar geen complete applicatie, met één of
meer goedgedefinieerde interfaces die binnen een componentensysteem bekend gemaakt
kunnen worden, en die binnen het systeem op onvoorspelbare wijze gebruikt wordt.
Over het algemeen heeft een node geheugen en vaak ook een processor. Een node wordt in
een diagram weergegeven als een kubus of balk. Een deployment diagram toont de configuratie
van nodes in het run-time systeem en de componentinstanties en objecten die daarop draaien. De
nodes zijn met elkaar verbonden door communicatiepaden (een doorgetrokken lijn van de ene node
naar de andere). Deployment diagrammen zijn alleen zinvol bij de bouw van een gedistribueerd
systeem.
58 HOOFDSTUK 7. APPLICATIE- EN IMPLEMENTATIESTADIUM
Internet
<<Processor>>
:ISP
<<Processor>>
<<Device>>
:mijnComputer
:Monitor
<<Device>> Linux
:Modem
<<Device>>
Netscape :Printer
UserInterface