Wat is een klassendiagram

Het klassendiagram is een ontwerptechniek voor het modelleren van de zogenaamde structuur van een softwaresysteem. Het bevat informatie over de eigenschappen(attributen) en het gedrag (methoden) van de klassen in het systeem. Ook bevat het diagram informatie over de samenhang (relaties) tussen de diverse klassen.

Onderstaand diagram is een voorbeeld van een klassendiagram. Hierin zie je de structuur van een eenvoudig hotel softwaresysteem. Dit voorbeeld is netjes uitwerkt maar kan zijn ontstaan terwijl je met je collega’s bij een whiteboard stond.

classDiagram

class Hotel {
    +String naam
    +String locatie
    +geefKamers(bedrag)
}


class Kamer {
	+String kamerNummer
	+int aantalBedden
	+decimal prijsPerNacht
}

Hotel --> Kamer

Diagram 1: een eenvoudig voorbeeld van een klassendiagram

Onderstaande foto is het resultaat van een brainstorm op een whiteboard. Een nuttige toepassing als je nog in de ideeën fase bent.

Figuur 1: Een voorbeeld van een uitwerking op het whiteboard

Hoe zit het klassendiagram in elkaar

Klassendiagrammen kun je tegenkomen in een functioneel ontwerp en in een technisch ontwerp. In een functioneel ontwerp komt geen techniek voor. Je opdrachtgever of eindgebruiker zal een klassendiagram dat in een functioneel ontwerp is opgenomen kunnen begrijpen. Het beschrijft het domein waarvoor we een applicatie gaan maken. We noemen een dergelijk klassendiagram dan ook een domeinmodel.

Domeinmodel versus technisch klassendiagram

  • Door het opstellen van een domeinmodel krijg je inzicht in het domein(het probleemgebied) waarvoor je het systeem gaat ontwikkelen. (Bijvoorbeeld een hotelketen)
  • Door het opstellen van een technisch klassendiagram krijg je inzicht in de structuur van je applicatie. Dit gaat zowel over het domein als over de technische werking. (Bijvoorbeeld hoe de User Interface is gestructureerd of dat je Events gaat gebruiken)

Diagram 1 was een voorbeeld van een technisch klassendiagram. Hieronder vind je een voorbeeld van het bijbehorende domeinmodel.

classDiagram

class Hotel {
    naam
    locatie
}


class Kamer {
	kamernummer
	aantal bedden
	prijs per nacht
}

Hotel "1" -- "*" Kamer : heeft

*Diagram 2: een eenvoudig voorbeeld van een klassendiagram. In dit geval een domeinmodel. *

Hoe gebruik je het klassendiagram

Het klassendiagram kun je op verschillende manieren in je development cyclus gebruiken.

ToepassingToelichting
BrainstormHet klassendiagram maak je wellicht veelal digitaal maar de taal is veel breder toepasbaar. Als je met je collega’s zoekt naar de best passende oplossing voor een probleem is de syntax uitstekend geschikt om op een whiteboard toe te passen en zo ideeën uit te wisselen.
AnalyseBij het onderzoeken van je probleemdomein doe je allerlei inzichten op. Bijvoorbeeld welke informatie een rol speelt bij het probleemdomein. Het klassendiagram is dan een effectieve methode om dit vast te leggen.
Dit zelfde model kun je gebruiken om je ideeën aan te scherpen of bij te stellen om zo tot een beter model te komen.
AfstemmingHet klassendiagram is een effectief middel om af te stemmen tussen stakeholders. Een eenvoudig model(zoals het domeinmodel) gebruik je in gesprek met je klant. Complexere modellen gebruik je om af te stemmen met je collega developers.
RealisatieDoordat je al hebt nagedacht over je ontwerp ga je makkelijker de realisatie door. Het klassendiagram maakt het overdraagbaar en geeft inzicht. Tijdens de realisatie krijg je wellicht nieuwe inzichten. Gebruik het model om je ideeën aan te scherpen en af te stemmen.
DocumentatieDoor het klassendiagram op te nemen in je functionele (domeinmodel) en technische (technisch klassendiagram) documentatie biedt je snel inzicht in het domein en de werking van de applicatie. Zo hoef je niet eerst vele regels code te doorlopen om ongeveer te weten waar het over gaat.

Hoe maak je het klassendiagram

Het maken van een klassendiagram bestaat uit twee delen. Allereerst moet je weten welke bouwstenen een rol spelen in het klassendiagram. Dit zijn de elementen te je ook in je eigen diagrammen gebruikt voor het modelleren van je applicatie. Als je de bouwstenen weet ga je aan de slag met het modelleren. Hiervoor doorloop je een gestructureerd proces. Beide worden hieronder toegelicht.

De bouwstenen van het klassendiagram

In de basis bestaat een klassendiagram uit klassen, attributen, methoden en relaties. Het eerste diagram is al een eenvoudig voorbeeld dat al deze bouwstenen bevat.

Het klassendiagram wordt complexer door meer detail toe te voegen. Denk aan:

  • Welke attributen en methoden zijn public of private?
  • Welke types zijn de attributen en retourneren de methoden?
  • Is de klasse van een bepaald type zoals ‘abstract’ of een ‘interface’?
  • Welke soort relatie zit er tussen de klassen?

Voorbeelden van verschillende type klassen

Onderstaand diagram geeft drie voorbeelden van klassen. Persoon1 is een standaard klasse(class), Persoon2 is een abstract class en Persoon3 is een interface.


classDiagram

class Persoon1 {
    naam
    email
}


class Persoon2 {
<< abstract >>
	naam
    email
}

class Persoon3 {
<< interface >>
	naam
    email
}

Diagram 3: voorbeelden van veelgebruikte typen klassen

Voorbeelden van relaties

Een applicatie is opgebouwd uit verschillende klassen. Door middel van associates geef je de samenhang tussen klassen weer. Er zijn verschillende soorten associaties en in onderstaand diagram vind je de meest gebruikte associaties.

classDiagram
classI -- classJ : Link
Hotel --> Kamer : Directieve association
Dier <|-- Hond : Overerving
Persoon ..> Boek : Afhankelijkheid

Diagram 4: Voorbeelden van relaties

TypeToelichting
LinkDe standaard associatie geeft een algemene relatie weer tussen de twee klassen.
Directieve associationDit type relatie geeft richting aan tussen de klassen. Afhankelijk van de pijl kun je één of beide richtingen op navigeren.
In Diagram 4 kun je bijvoorbeeld wel navigeren van Hotel naar Kamer maar bij een Kamer kun je niet direct naar het gerelateerde Hotel navigeren.
OverervingDoor de overervingsrelatie te gebruiken geef je aan dat een klasse uitbreiding is van een andere klasse.
In Diagram 4 zie je bijvoorbeeld dat een Hond een overerving is van Dier. Een Kat zou dat net zo goed kunnen zijn.
AfhankelijkheidEen afhankelijkheid kun je gebruiken om relaties weer te geven die niet blijken uit de Attributen.
In Diagram 4 zie je dat een persoon afhankelijk is van een Boek. Dit is het geval omdat een Persoon in inhoud van een Boek moet kunnen lezen. Er ligt dan niet perse een directe relatie tussen Persoon en Boek maar we een afhankelijkheid.

Het proces om het diagram te maken

Je hebt al kennisgemaakt met de bouwstenen van het klassendiagram. De volgende stap is je te verdiepen in de context van het probleem en het feitelijke ontwerpproces.

Informatie verzamelen

Voordat je een klassendiagram kunt maken verzamel je alle relevante informatie. Dit bestaat in eerste instantie uit domeininformatie die je krijgt van de opdrachtgever (oftewel: welke informatie moet het systeem gaan verwerken). Op basis hiervan kun je het domeinmodel maken.

Naast het domeinmodel ga je beslissingen nemen over het type applicatie, de wijze waarop deze applicatie gaat werken en dus hoe de technische implementatie eruit gaat zien. Dit vertaald zich in zogenaamde architectuurkeuzes en ontwerpbeslissingen. Ook deze kun je gaan modelleren maar dan in het technische klassendiagram.

Het ontwerp realiseren

Om tot het feitelijke klassendiagram te komen ga je niet zomaar iets ontwerpen. Door dit gestructureerd te doen voorkom je onnodige fouten of dat je belangrijke zaken mist.

Het volgende stappenplan helpt je dit proces gestructureerd te doorlopen:

  1. Identificeer alle mogelijke klassen
  2. Selecteer de, voor het vraagstuk, relevante klassen
  3. Bepaal de relaties tussen de klassen (oftewel: wat is de samenhang)
  4. Verzamel per klasse alle attributen en hun types
  5. Maak een begin met het bepalen van de methoden op een klasse. Bedenkt dit vanuit de verantwoordelijkheid die een klasse heeft. Veel methoden zul je later in het ontwikkelproces pas identificeren.
  6. Onderzoek waar je gebruik kunt maken overervingsstructuren en OO concepten
  7. Stel vast hoe je de bedrijfsregels en beperkingen gaat verankeren in je model (applicatie)
  8. Kijk waar je klassen kunt groeperen naar logische clusters

Bronnen

Klassendiagram tutorial: https://www.visual-paradigm.com/guide/uml-unified-modeling-language/uml-class-diagram-tutorial/