Ga naar hoofdinhoud

Voorbeelden

Voorbeeld: Klok display

Dit voorbeeld is geïnspireerd op het voorbeeld in hoofdstuk 3 (§3.1 t/m §3.11) van het boek "Objects First with Java".

Hieronder zie je een plaatje van een digitale klok. We kunnen deze klok opdelen in twee displays: één voor uren en één voor minuten.

klokdisplay

De klok kan de tijd met één minuut ophogen. Als de minuten daardoor op 60 zouden komen te staan moet het aantal uren met 1 worden opgehoogd en de minuten op 0 worden gezet. Als de uren daardoor op 24 zouden komen te staan, moet de klok op 0:00 worden gezet.

Hieronder zie je een mogelijk klassendiagram van het domein.

4aa8a1ade0d6bc0e345c475e96442279

PlantUML broncode voor "Klassendiagram NumerDisplay"
@startuml

left to right direction
skinparam linetype ortho
skinparam classAttributeIconSize 0
hide circle

class KlokDisplay {
- display: String
+ tikTijd(): void
+ updateDisplay(): void
}

class NummerDisplay {
- limiet: int
- waarde: int
+ increment():void
+ getWaarde(): int
+ getDisplayWaarde(): String
}

KlokDisplay "1" ---> "-minuten 1" NummerDisplay
KlokDisplay "1" ---> "-uren 1" NummerDisplay

@enduml

Klassendiagram met 2 klasse(n) en 2 relatie(s).

Klassen:

  • Klasse KlokDisplay met:
    • publieke methode 'tikTijd', zonder parameters, return type void
    • publieke methode 'updateDisplay', zonder parameters, return type void
    • private attribuut 'display' van type String
  • Klasse NummerDisplay met:
    • publieke methode 'increment', zonder parameters, return type void
    • publieke methode 'getWaarde', zonder parameters, return type int
    • publieke methode 'getDisplayWaarde', zonder parameters, return type String
    • private attribuut 'limiet' van type int
    • private attribuut 'waarde' van type int

Relaties:

  • KlokDisplay heeft een associatie-relatie met naam '-minuten 1' met NummerDisplay
  • KlokDisplay heeft een associatie-relatie met naam '-uren 1' met NummerDisplay

De klasse NummerDisplay heeft twee attributen en drie methoden (de constructor is niet aangegeven). Voor elke attribuutnaam of methodenaam staat een + of een -; + betekent public en - private.

Elk KlokDisplay-object maakt gebruik van twee NummerDisplay-objecten: de ene voor het weergeven van de uren en de andere voor de minuten. Elk KlokDisplay-object is dus gerelateerd met twee NummerDisplay-objecten. Deze relaties, in UML spreekt men van associaties, geven we in het klassendiagram weer door een lijn te tekenen van KlokDisplay naar NummerDisplay.

We bekijken drie facetten van dit klassendiagram:

  • rollen en rolnamen
    Het uiteinde van een associatie wordt dan ook wel een rol genoemd. De rol die NummerDisplay in de ene associatie speelt wordt uren genoemd. De rol die NummerDisplay in de andere associatie speelt noemen we minuten. In code corresponderen deze rollen met attributen van de klasse KlokDisplay.

  • multipliciteiten
    De multipliciteiten geven aan hoeveel instanties van de ene klasse gerelateerd zijn aan een instantie van de andere klasse. Een KlokDisplay heeft dus 1 NummerDisplay voor de uren en 1 NummerDisplay voor de minuten. Dit wordt in het diagram aangegeven met het getal 1 bij de associaties. Andersom kun hoort een specifieke NummerDisplay bij één KlokDisplay.

  • navigatie
    Bij beide associaties wijst een pijl richting de klasse NummerDisplay. De associatie contains hours loopt van KlokDisplay naar NummerDisplay. Dit heet navigatie en betekent voor deze situatie dat een instantie van KlokDisplay de bijbehorende instantie van NummerDisplay (uren) kent en 'm een opdracht kan geven door een methode aan te roepen. Omgekeerd kent een instantie van NummerDisplay niet de KlokDisplay-instantie waar hij bij hoort (daarom is er ook geen rol aangegeven).

De java-code van de klasse KlokDisplay, die correspondeert met het bovenstaande klassendiagram, ziet er als volgt uit:

public class KlokDisplay {

private NummerDisplay uren;
private NummerDisplay minuten;

private String display;

public KlokDisplay() {
...
}

public void tikTijd() {
...
}

public void updateDisplay() {
...
}

public String getDisplay() {
...
}
}

public class NummerDisplay {
private int waarde;
private final int limiet;

public NummerDisplay(int limiet) {
...
}

public void increment() {
...
}

public int getWaarde() {
...
}

public String getDisplay() {
...
}
}

Je ziet in de Java-code dat de klasse KlokDisplay twee attributen heeft van het type NummerDisplay: uren en minuten. Het attribuut uren correspondeert met de gelijknamige navigeerbare rol (d.w.z. de rol aan de pijlkant) van de associatie contains hours. Net zo correspondeert het attribuut minutes met de rol minuten van de associatie contains minuten.

Voorbeeld SB

In het onderstaande klassendiagram zie je een associatie tussen de klassen Docent en Student. De multipliciteiten bij deze associatie geven aan dat een docent SB'er is van nul of meer studenten en dat een student precies één docent als SB-docent heeft. De access modifiers zijn weggelaten.

8c69e5875515a4649fd58b31e77038d4

PlantUML broncode voor "DocentStudent"
@startuml

left to right direction
skinparam linetype ortho
skinparam classAttributeIconSize 0
hide circle

class Docent {
code: String
}
class Student {
nummer: int
}

Docent "sbDocent\n1" ----- "sbStudenten \n 0..*" Student

@enduml

Klassendiagram met 2 klasse(n) en 1 relatie(s).

Klassen:

  • Klasse Docent met:
    • publieke attribuut 'code' van type String
    • geen methoden
  • Klasse Student met:
    • publieke attribuut 'nummer' van type int
    • geen methoden

Relaties:

  • Docent heeft een associatie-relatie met naam 'sbStudenten' met Student, multipliciteit 1 naar 0..*

Hieronder zie je een mogelijke implementatie in Java-code. De (0..*)-relatie wordt geimplementeerd door een List-type (bijvoorbeeld een ArrayList).

public class Docent {
private String code;
private List<Student> slbStudenten;
}

public class Student {
private int nummer;
private Docent slbDocent;
}

Je kunt een (0..*)-relatie op elke geschikte manier implementeren. Hieronder zie je een voorbeeld waarbij een Set gebruikt wordt in plaats van een List. Met dit datatype garandeer je dat een Docent niet twee keer dezelfde Student als SLB'er kan hebben (wat best toepasselijk is in dit voorbeeld).

public class Docent {
private String code;
private Set<Student> slbStudenten;
}

Voorbeeld Projectinzet

Een bedrijf heeft werknemers die worden ingezet bij projecten die worden uitgevoerd. Een van de werknemers speelt de rol van projectleider. Dit is in het onderstaande klassendiagram weergegeven.

e807ff4b88032261b84ff909db5c2fe1

PlantUML broncode voor "WerknemerProject"
@startuml

left to right direction
skinparam classAttributeIconSize 0
hide circle

class Werknemer

class Project

Project "0..*" ---> "medewerkers\n0..* " Werknemer
Project "\n0..*" ----> "projectleider\n0..1 " Werknemer

@enduml

Klassendiagram met 2 klasse(n) en 2 relatie(s).

Klassen:

  • Klasse Werknemer zonder methoden en attributen
  • Klasse Project zonder methoden en attributen

Relaties:

  • Project heeft een associatie-relatie met naam 'medewerkers' met Werknemer, multipliciteit 0..* naar 0..*
  • Project heeft een associatie-relatie met naam 'projectleider' met Werknemer, multipliciteit 0..* naar 0..1

Hieronder is een mogelijk Java-implementatie van de klassen Werknemer en Project. De klasse Werknemer heeft geen attribuut van het type Project omdat de navigatie-pijl in het klassendiagram naar Werknemer wijst.

public class Project {
private Set<Werknemer> medewerkers;
private Werknemer projectLeider;
}

public class Werknemer {
}