Assoziationen
Video-Tutorial
Wenn Sie das Video nur anschauen, werden Sie kaum etwas lernen. Arbeiten Sie für den besten Lerneffekt am Rechner direkt mit und vollziehen Sie die Beispiele nach.
Beim Laden werden Daten an YouTube (Google) übertragen. · Auf YouTube ansehen
Folien
Falls keine PDF-Präsentation zu sehen ist: Direktdownload der PDF-Präsentation
Ein gutes Tool, um Klassendiagramme inkl. Assoziationen herzustellen, ist das eUML2 Free-Plugin für eclipse (Anleitung).
Unter Assozationen verstehen wir Beziehungen zwischen Objekten/Klassen. Wir betrachten nur Beziehungen zwischen zwei Klassen.
Die programmiertechnische Implementierung von Assoziationen ist hier beschrieben: Implementierung von Assoziationen in Java. Das dort Gesagte gilt auch für andere Programmiersprachen.
Als Beispiel betrachten wir diese Beziehung zwischen Hund und Laus:
Jeder Hund hat Läuse im Fell sitzen, diese Läuse spielen die Rolle "Parasit". Jede Laus sitzt auf einem Hund, er hat für sie die Rolle "Wirt". Die Pfeile zeigen an, dass der Hund die Laus kennt (d.h. er weiß z.B., wie viele Läuse in seinem Pelz sitzen), die Laus weiß, auf welchem Hund sie sitzt.
Das war's schon! Nun etwas genauer:
1) Multiplizitäten
Die Schreibweise ähnelt der in ER-Diagrammen. Die kleine Zahl (oder Stern) bei einer Klasse zeigt an, wie viele zugeordnete Elemente die andere Klasse jeweils hat. Im Beispiel also: Jede Laus sitzt genau (und höchstens) auf einem Hund (sie kann ohne Hund nicht leben). Jeder Hund hat mehrere Läuse (evtl. auch keine oder nur eine).
Wir unterscheiden:
| Multiplizität | Bedeutung | Beispiel |
|---|---|---|
| 0...1 | dem Objekt ist immer kein oder ein anderes Objekt zugeordnet | Ein Artikel befindet sich in keinem Einkaufswagen (= noch im Regal) oder in maximal einem. |
| 1 | dem Objekt ist immer genau ein anderes Objekt zugeordnet | Jede Laus sitzt immer auf genau einem Hund (ohne Hund kann sie nicht leben) |
| * | dem Objekt ist kein, ein oder mehrere andere Objekte zugeordnet | Auf jedem Hund sitzt keine, eine oder mehrere Läuse. |
| 1...* | dem Objekt ist ein oder mehrere andere Objekte zugeordnet | Auf jeder Rechnung steht ein oder mehrere Artikel (eine Rechnung ohne Artikel ist sinnlos). |
Übung Multiplizitäten
Tragen Sie die korrekten Multiplizitäten ein:
Lösungsvorschlag
Jeder Hund hat einen oder mehrere Besitzer (Familienhund). Natürlich könnte man auch sagen, dass jeder Hund nur EINEN Besitzer hat, dann stünde links unten bei Besitzer eine 1 (und nicht 1...*). Jeder Besitzer hat einen oder mehrere Hunde (hätte er keinen Hund, wäre er kein Besitzer).
Jeder Hund hat mehrere Läuse (evtl. auch keine, deshalb nicht 1...*, sondern nur *), jede Laus sitzt genau auf einem Hund. Wenn eine Laus auch ohne Hund existieren könnte, dann stünde bei Hund 0...1.
Jede Laus besitzt mehrere Mützen (oder auch keine). Jede Mütze befindet sich im Besitz von höchstens einer Laus (möglicherweise liegt sie aber noch im Kaufladen und ist noch keiner Laus zugeordnet.
2) Navigierbarkeit
Die Navigierbarkeit sagt etwas darüber aus, ob die eine Klasse auf die andere zugreifen kann bzw. Objekte dieser Klasse KENNT.
Navigierbarkeit, Beispiel 1:
Es führt ein Pfeil von Rechnung zu Artikel. Die Rechnung "weiß", welche Artikel draufstehen, oder: Wenn ich eine Rechnung anschaue, sehe ich, welche Artikel sie enthält, oder: Ich möchte die Rechnung verändern können, indem ich Artikel hinzufüge, entferne. Kurz: Wenn ich ein Objekt der Klasse Rechnung habe, kann ich über dieses Objekt auf die zugehörigen Objekte der Klasse Artikel zugreifen.
Es führt KEIN Pfeil von Artikel zu Rechnung. Bei Rechnung ist sogar ein Kreuz, das bedeutet, dass Artikel Rechnung nicht kennen soll. Wenn kein Kreuz und kein Pfeil dasteht, bedeutet das, dass die Navigierbarkeit unspezifiziert ist, d.h. das Klassendiagramm trifft keine Aussage darüber.
Wenn ich einen Artikel anschaue, sehe ich nicht, auf welcher Rechnung er sich befindet, oder: Es ist nicht notwendig, dass ich den Zustand einer Rechnung durch Manipulation des Artikels verändere. Kurz: Wenn ich ein Objekt der Klasse Artikel habe, dann kann ich darüber nichts über irgendwelche Rechnungen in Erfahrung bringen (wäre ja auch unnötig, dass sich die Luftmatratze die 10.000 Rechnungen merkt, auf der sie vorhanden ist).
Navigierbarkeit, Beispiel 2
(Dieses Beispiel nach Heide Balzert: Lehrbuch Der Objektmodellierung: Analyse und Entwurf mit der U.M.L. 2, S. 284)
Die Abteilung muss auf die Angestellten zugreifen, um die Gehaltsliste drucken zu können (dazu braucht sie bspw. den Namen der Angestellten)
Der Angestellte greift nicht auf die Abteilung zu, da er für korrektes Funktionieren keine Informationen braucht. (Welcher Angestellte wo arbeitet, kann man ja über Abteilung herausbekommen)
Es ist jedoch auch die Situation vorstellbar, dass der Angestellte einen Ausweis drucken können muss; auf dem Ausweis steht dann u.a. der Abteilungsname und das Gebäude, in dem sich die Abteilung befindet. Deshalb muss die Assoziation nun auch in diese Richtung navigierbar sein:
Unidirektionale und bidirektionale Assoziationen
unidirektional: nur in eine Richtung navigierbar
bidirektional: in beide Richtungen navigierbar
Übung zur Navigierbarkeit (1)
Das eclipse-Plugin eUML2 weigert sich, Assoziationen anzulegen, die an beiden Seiten nicht navigierbar sind. Warum?
Übung zur Navigierbarkeit (1)
Erstellen Sie zwei uni- und zwei bidirektionale Assozationspaare. Das Thema ist Ihnen freigestellt.
3) Rollen
Betrachten wir noch einmal das Beispiel von Hund und Laus:
Der Hund hat in Bezug auf die Laus die Rolle "Wirt"; Die Laus hat in Bezug auf den Hund die Rolle "Parasit"
Um zur korrekten Bezeichnung zu kommen, fragen wir: Welche Rolle spielt die eine Klasse für die andere?
Dabei sind die von eUML2 vorgeschlagenen Defaultwerte (nämlich einfach der Klassenname) meistens in Ordnung.
Die Rollennamen sind optional, d.h. sie können weggelassen werden. In der aktuellen Version (Stand 03/2013) erlaubt eUML2 das Weglassen von Rollen nicht; sofern die Rollenbezeichnung keine weiteren Implikationen auf die Umsetzung hat (siehe folgender Abschnitt), kann man einfach die Defaultwerte lassen. Auch den Default-Zugriffsmodifikator (private) kann man lassen, da man ja auf assoziierte Attribute über Getter und Setter zugreift.
Warum Rollenbezeichnungen wichtig sein können
Im Beispiel sehen wir zweimal die Assoziation von Laus und LausMuetze.
Je nach Rolle, die die LausMuetze für die Laus spielt, unterscheidet sich hier auch die Multiplizität!
Beispiel 1: LausMuetze hat Rolle "besitztum" - Jede Laus kann mehrere Mützen haben.
Beispiel 2: LausMuetze hat die Rolle "kopfbedeckung" - Jede Laus kann maximal eine Mütze auf dem Kopf haben!
Übungen
Zusätzliche Dateien (Bilder, Klassendiagramme, HTML-Vorlagen) finden Sie in der Materialsammlung. Diese Übungen können Sie als txt-Datei herunterladen.
Übungen: OOA/OOD Klassenmodellierung/Klassenbeziehungen: Assoziationen
Java_32-Assoziationen - [1] Multiplizitäten
Tragen Sie in dieses Klassendiagramm die korrekten Multiplizitäten ein:
/16java/java32b_uebungen/1-schulsystem-multiplizitaeten.png
Java_32-Assoziationen: [2] Navigierbarkeit 1, Grundlagen
Das eclipse-Plugin eUML2 weigert sich, Assoziationen anzulegen, die an beiden Seiten nicht navigierbar sind (die also an beiden Seiten ein Kreuz hätten). Warum?
Java_32-Assoziationen - [3] Navigierbarkeit 2
Diskutieren Sie, ob die Navigierbarkeit hier korrekt angegeben ist:
/16java/java32b_uebungen/2-lehrer-schueler-navigierbarkeit.jpg
Java_32-Assoziationen - [4] Navigierbarkeit 3
Ergänzen Sie im folgenden Klassendiagramm die Navigierbarkeit:
/16java/java32b_uebungen/3-navigierbarkeit-ergaenzen.png
Java_32-Assoziationen - [5] Navigierbarkeit 4
Erstellen Sie im Klassendiagramm zwei uni- und zwei bidirektionale Assoziationspaare. Das Thema ist Ihnen freigestellt.
Java_32-Assoziationen - [6] Zusammenfassende Übung "Firma"
Zeichnen Sie im folgenden Klassendiagramm die korrekten Assoziationen ein (Rollen, Multiplizitäten und Navigierbarkeit).
/16java/java32b_uebungen/4-assoz_firma_uebung_leer.png
ERGÄNZENDE ÜBUNGEN
Java_32-Assoziationen: [7] Multiplizitäten bestimmen (Laus)
Tragen Sie in dieses Klassendiagramm die Multiplizitäten ein:
/16java/java32b_uebungen/5a_assoziationen_laus_multiplizitaet.png