Assoziationen und Multiplizitäten
Lösung geprüft
Die Aufgabe der heutigen Stunde sind Assoziationen und Multiplizitäten! Kein Code diesmal, sondern UML. Es geht um die Frage, wie viele Objekte einer Klasse mit einem Objekt einer anderen Klasse in Beziehung stehen – und die Antwort steht als kleine Zahl am Ende des Strichs.
Übung Multiplizitäten: Tragen Sie die korrekten Multiplizitäten ein. Gegeben ist ein Diagramm mit den Klassen Direktor, Sekretaerin, Lehrer, Schueler und Hausmeister, die durch Assoziationen verbunden sind.
Die vier Schreibweisen
Bevor es losgeht – das ist alles, was man kennen muss:
| Notation | Bedeutung |
|---|---|
1 | Dem Objekt ist immer genau ein anderes Objekt zugeordnet |
0..1 | Immer kein oder ein anderes Objekt – die Beziehung ist optional |
* | Kein, ein oder mehrere Objekte |
1..* | Ein oder mehrere, aber mindestens eins |
a..b | Mindestens a, höchstens b |
Im OneNote stehen alle vier Schreibweisen an einem einzigen Beispiel zusammen. Daran sieht man am besten, dass an jedem Ende eine eigene Zahl steht:
classDiagram
Direktor "1" -- "*" Sekretaerin
Direktor "1" -- "1..*" Lehrer
Schulsozialarbeiter "0..1" -- "1..*" Lehrer
Meine Lösung
| Beziehung | Multiplizität | Gelesen als |
|---|---|---|
| Direktor — Sekretaerin | 1 … * | Ein Direktor hat keine, eine oder mehrere Sekretärinnen. Jede Sekretärin hat genau einen Direktor. |
| Direktor — Lehrer | 1 … 1..* | Eine Schule hat genau einen Direktor und mindestens einen Lehrer. |
| Sekretaerin — Schueler | 1..* … * | Das Sekretariat betreut alle Schüler; jeder Schüler hat mindestens eine Ansprechpartnerin. |
| Lehrer — Schueler | 1..* … 1..* | Ein Lehrer unterrichtet mehrere Schüler, ein Schüler hat mehrere Lehrer. |
| Schueler — Hausmeister | * … 1 | Eine Schule hat einen Hausmeister, der für alle Schüler zuständig ist. |
Wie man darauf kommt
Der Trick ist, die Beziehung in beide Richtungen als Satz auszusprechen. Nimm Direktor und Sekretärin:
- „Ein Direktor hat … Sekretärinnen." – keine, eine oder mehrere, also
* - „Eine Sekretärin hat … Direktoren." – genau einen, also
1
Und jetzt aufpassen, das ist die Stelle, an der fast alle einen Fehler
machen: die Zahl steht auf der gegenüberliegenden Seite.
Die * gehört an die Seite der Sekretärin, weil es um die
Frage geht „wie viele Sekretärinnen hat ein Direktor". Wer die Zahlen
vertauscht, hat das Diagramm genau falsch herum gelesen.
Der Unterschied zwischen * und 1..*
Beide heißen „mehrere". Der Unterschied ist die Null:
*erlaubt auch keins. Ein Direktor ohne Sekretärin ist denkbar.1..*verlangt mindestens eins. Eine Schule ohne einen einzigen Lehrer gibt es nicht.
Das ist keine Haarspalterei, sondern hat später eine direkte Folge im
Code. Bei 1..* muss der Konstruktor dafür sorgen, dass
beim Erzeugen schon ein Objekt dabei ist. Bei * darf die
Liste leer anfangen.
Assoziation, gerichtet oder nicht
Der Strich zwischen zwei Klassen ist die Assoziation, also die kennt-Beziehung. Hat er an einem Ende eine offene Pfeilspitze, ist er gerichtet und nur in Pfeilrichtung lesbar.
In der Praxis heißt gerichtet: die eine Klasse hat ein Attribut vom Typ
der anderen, umgekehrt aber nicht. Ein Schüler, der ein Auto kennt, hat
ein Attribut auto. Das Auto weiß nichts von seinem
Schüler – deshalb zeigt der Pfeil nur in eine Richtung. In der
objektorientierten Modellierung arbeitet man meistens mit gerichteten
Assoziationen, weil sonst beide Klassen voneinander wissen müssten und
man sich schnell einen Knoten baut.
classDiagram
class Schueler {
-String nachname
-String vorname
-String geburtsdatum
-boolean führerschein
+machePrüfung() void
}
class Auto {
-String kfzKennzeichen
-int kilometerstand
-int tankvolumen
-float kraftstoffverbrauch
-float kraftstoffmenge
+tanken(float) void
+fahren(float) boolean
}
Schueler --> Auto : fährt
Der Beziehungsname fährt steht an der Strecke und sagt, was die Beziehung inhaltlich bedeutet. Ohne ihn wüsste niemand, warum die beiden Klassen überhaupt verbunden sind.