Richtlinie: Assoziation
Assoziation stellt eine strukturelle Beziehung zwischen Objekten dar. Diese Richtlinie veranschaulicht, wie Sie diese Beziehung verwenden.
Beziehungen
Hauptbeschreibung

Assoziationen

Assoziationen stellen strukturelle Beziehungen zwischen Objekten unterschiedlicher Klassen dar. Sie stellen Verbindungen zwischen Instanzen von zwei oder mehr Klassen dar, die für eine gewisse Dauer existieren. Das Gegenstück hierzu sind transiente Verbindungen, die beispielsweise nur für die Dauer einer Operation existieren. Letztere Situationen können mit Kollaborationen modelliert werden, in denen die Verbindungen nur in einem bestimmten beschränkten Kontext verfügbar sind.

Sie können mit Assoziationen zeigen, dass Objekte über andere Objekte informiert sind. Manchmal müssen Objekte gegenseitige Referenzen enthalten, um miteinander interagieren zu können, z. B. Nachrichten aneinander senden. Somit können sich Assoziationen in manchen Fällen aus Interaktionsmustern in Ablaufdiagrammen oder Kommunikationsdiagrammen ergeben.

Assoziationsnamen

Die meisten Assoziationen sind binär (d. h. sie existieren zwischen exakt zwei Klassen) und werden als durchgezogene Pfade gezeichnet, die zwei Klassensymbole miteinander verbinden. Eine Assoziation kann einen Namen haben, oder die Assoziationsrollen können Namen haben. Rollennamen werden bevorzugt, weil sie mehr Informationen vermitteln. In den Fällen, in denen nur eine der Rollen benannt werden kann, sind Rollen Assoziationsnamen trotzdem vorzuziehen, sofern die Assoziation unidirektional und von dem Objekt ausgehen soll, dem der Rollenname zugeordnet ist.

Assoziationen werden häufig während der Analyse benannt, wenn noch nicht genügend Informationen verfügbar sind, um die Rollen ordnungsgemäß zu benennen. Wenn Assoziationsnamen verwendet werden, sollten diese den Zweck der Beziehung mit einem verbalen Ausdruck verdeutlichen. Der Name der Assoziation wird auf bzw. neben dem Assoziationspfad platziert.

Beispiel

In einem Geldautomatensystem wird im Geldausgabefach das Geld bereitgestellt, das der Geldausgabeautomat ausgibt. Damit der Geldausgabeautomat Geld ausgeben kann, muss er eine Referenz auf das Objekt Geldausgabefach verwalten. Wenn dem Geldausgabefach das Geld ausgeht, muss das Objekt Geldausgabeautomat benachrichtigt werden, d. h. das Geldausgabefach muss eine Referenz auf das Objekt Geldausgabeautomat verwalten. Diese Referenz wird mit einer Assoziation modelliert.

Beispiel für Assoziationsnamen

Eine Assoziation zwischen dem Objekt Geldausgabeautomat und dem Objekt Geldausgabefach mit dem Namen liefert den Wert.

Schlecht gewählte Assoziationsnamen können verwirrend und irreführend sein. Das folgende Beispiel veranschaulicht gute und schlechte Namensgebungen. Im ersten Diagramm werden Assoziationsnamen verwendet, und obwohl sie syntaktisch korrekt (verbale Ausdrücke) sind, liefern sie nicht viel Informationen über die Beziehung. Im zweiten Diagramm werden Rollennamen verwendet und diese liefern viel mehr Informationen über die Art der Assoziationsbeteiligung.

Im Begleittext beschriebenes Diagramm

Beispiele für gut und schlecht gewählte Assoziations- und Rollennamen

Rollen

Jedes Ende einer Assoziation stellt eine Rolle dar, die eine Klasse in der Assoziation spielt. Jede Rolle muss einen Namen haben, und die Rollen, die einer Klasse gegenüberstehen müssen eindeutig sein. Der Rollenname muss ein Substantiv sein, das die Rolle des zugeordneten Objekts in Relation zum zuordnenden Objekt zum Ausdruck bringt. Ein geeigneter Rollenname für Lehrer in einer Assoziation mit einem Kursabschnitt wäre beispielsweise Dozent. Vermeiden Sie Namen wie hat und enthält, weil sie keine Informationen zur Art der Beziehung zwischen den Klassen liefern.

Die Verwendung von Assoziationsnamen und Rollennamen schließt sich gegenseitig. Rollennamen sind Assoziationsnamen generell vorzuziehen. Ausnahmen sind solche Fälle, in denen nicht genügende Informationen vorhanden sind, um die Rollen angemessen zu benennen. (Dies ist häufig bei der Analyse der Fall. Beim Design müssen auf jeden Fall Rollennamen verwendet werden.) Die Verwendung ungeeigneter Rollennamen ist ein Hinweis auf ein unvollständiges oder mangelhaftes Modell.

Der Rollenname wird neben das Ende der Assoziationslinie platziert.

Beispiel

Schauen Sie sich die Beziehungen zwischen Klassen in einem Auftragserfassungssystem an. Ein Kunde kann zwei Arten von Adressen haben: eine Adresse, an die Rechnungen gesendet werden, und eine Reihe von Adressen, an die Bestellungen gesendet werden. Somit gibt es, wie im Folgenden gezeigt, zwei Assoziationen zwischen Kunde und Adresse. Die Assoziationen sind mit der Rolle beschriftet, die die zugeordnete Adresse für den Kunden spielt.

Beispiele für Assoziationen

Assoziationen zwischen Kunde, Adresse und Auftrag, die mit Rollennamen und Multiplizitäten beschriftet sind

Multiplizität

Sie können für jede Rolle die Multiplizität ihrer Klasse anzeigen, d. h. wie viele Objekte der Klasse einem Objekt der anderen Klasse zugeordnet werden können. Multiplizität wird durch einen textbasierten Ausdruck zur Rolle angegeben. Der Ausdruck ist eine durch Kommata getrennte Liste von Integer-Bereichen. Ein Bereich wird wie folgt angegeben: Integer (der untere Wert), zwei Punkte, ein Integer (oberer Wert). Ein einzelner Integer ist ein gültiger Bereich, und das Symbol '*' steht für "viele", d. h. eine unbegrenzte Anzahl von Objekten. Das Symbol '*' selbst entspricht '0..*', d. h. jede beliebige Zahl einschließlich der Null. Dies ist der Standardwert. Eine optionale skalare Rolle hat die Multiplizität 0..1.

Beispiel

Im vorherigen Beispiel wurden Multiplizitäten für die Assoziationen zwischen Auftrag und Kunde und zwischen Kunde und Adresse gezeigt. Die Interpretation des Diagramms ergibt, dass einem Auftrag ein Kunde zugeordnet sein muss (die Multiplizität ist 1..1 auf der Seite von Kunde), aber ein Kunde keine Aufträge haben muss (die Multiplizität ist 0..* auf der Seite von Auftrag). Außerdem hat ein Kunde eine Rechnungsadresse, aber eine oder mehrere Lieferadressen. Wenn Multiplizitäten aus Gründen der Übersichtlichkeit weggelassen werden, kann von einer Multiplizität von 1..1 ausgegangen werden.

Navigierbarkeit

Das Merkmal Navigierbarkeit einer Rolle zeigt an, dass es möglich ist, mit der Assoziation von einer zuordnenden Klasse zur Zielklasse zu navigieren. Dies kann auf mehrere Arten implementiert werden: durch direkte Objektreferenzen, durch assoziative Arrays, Hash-Tabellen oder andere Implementierungstechniken, mit denen ein Objekt ein anderes referenzieren kann. Navigierbarkeit wird durch einen offenen Pfeil angezeigt, der am Zielende der Assoziationslinie neben der Zielklasse (das Navigationsziel) platziert wird. Das Navigierbarkeitsmerkmal ist standardmäßig aktiviert.

Beispiel

Im Beispiel mit dem Auftragserfassungssystem ist die Assoziation zwischen Auftrag und Kunde in beide Richtungen navigierbar: Ein Auftrag muss wissen, welcher Kunde den Auftrag aufgegeben hat, und der Kunde muss wissen, welche Aufträge er aufgegeben hat. Wenn keine Pfeilspitzen angezeigt werden, ist die Assoziation in beide Richtungen navigierbar.

Im Fall der Assoziationen zwischen Kunde und Adresse muss der Kunde seine Adressen kennen, aber die Adressen wissen nicht, welche Kunden (oder anderen Klassen, da viele Dinge Adressen haben können) der Adresse zugeordnet sind. Deshalb ist das Navigierbarkeitsmerkmal auf der Kundenseite der Assoziation inaktiviert. Es ergibt sich folgendes Diagramm:

Beispiele für Navigierbarkeit in Assoziationen

Diagramm mit aktualisierten Klassen für Auftragserfassungssystem, das die Navigierbarkeit von Assoziationen zeigt.

Selbstassoziationen

Manchmal hat eine Klasse eine Assoziation mit sich selbst. Dies bedeutet nicht zwingenderweise, dass eine Instanz dieser Klasse eine Assoziation zu sich selbst hat, sondern häufiger, dass eine Instanz der Klasse Assoziationen zu anderen Instanzen derselben Klasse hat. Bei Selbstassoziationen sind Rollennamen von entscheidender Bedeutung, um den Zweck der Assoziation abzuleiten.

Beispiel

Schauen Sie sich die folgende Selbstassoziation mit der Klasse Mitarbeiter an.

Beispiel für eine Selbstassoziation

In diesem Fall kann ein Mitarbeiter eine Assoziation zu anderen Mitarbeitern haben. Wenn dies so ist, handelt es sich um Vorgesetzte, und die anderen Mitarbeiter gehören zu ihrem Personalstamm. Die Assoziation ist in beide Richtungen navigierbar, da Mitarbeiter in der Regel ihre Vorgesetzten kennen und umgekehrt.

Mehrere Assoziationen

Wenn Sie zwei Assoziationen zwischen Klassen zeichnen, bedeutet dies, dass Objekte doppelt verbunden sind: Ein Objekt kann durch jede Assoziation mit anderen Objekten verbunden werden. Jede Assoziation ist unabhängig und unterscheidet sich von der anderen durch den Rollennamen. Wie zuvor gezeigt, kann ein Kunde Assoziationen zu mehreren Instanzen derselben Klasse haben, die jeweils einen anderen Rollennamen besitzen.

Rollen ordnen

Wenn die Multiplizität einer Assoziation größer als eins ist, können die zugeordneten Instanzen geordnet sein. Das Merkmal geordnet einer Rolle bedeutet, dass die Instanzen, die an der Assoziation beteiligt sind, geordnet sind. Standardmäßig bilden sie eine ungeordnete Menge. Das Modell gibt nicht an, wie die Ordnung verwaltet wird. Die Operationen, die eine geordnete Assoziation aktualisieren, müssen angeben, wo die aktualisierten Elemente eingefügt werden.

Verbindungen

Die einzelnen Instanzen einer Assoziation werden Verbindungen genannt. Eine Verbindung ist somit eine Beziehung zwischen Instanzen. Nachrichten können in Verbindungen gesendet werden, und Verbindungen können Referenzen und Aggregationen zwischen Objekten bezeichnen. Weitere Informationen finden Sie in Technik: Kommunikationsdiagramm.

Assoziationsklassen

Eine Assoziationsklasse ist eine Assoziation, die auch Klassenmerkmale (z. B. Attribute, Operationen und Assoziationen) besitzt. Sie wird als gestrichelte Linie ausgehend vom Assoziationspfad zu einem Klassensymbol gezeichnet, das die Attribute, Operationen und Assoziationen für die Assoziation enthält. Die Attribute, Operationen und Assoziationen gelten für die ursprüngliche Assoziation. Jede Verbindung in der Assoziation hat die angezeigten Merkmale. Assoziationsklassen werden sehr häufig für die Abbildung von N:M-Beziehungen (siehe obiges Beispiel) verwendet. Grundsätzlich sollten der Name der Assoziation und der Name der Klasse identisch sein, aber es können auch unterschiedliche Namen verwendet werden, sofern dies erforderlich ist. Eine degenerierte Assoziationsklasse enthält lediglich Attribute für die Assoziation. In diesem Fall können Sie den Namen der Assoziationsklasse weglassen, um die Trennung zu verbergen.

Beispiel

Schauen Sie sich anhand des Mitarbeiterbeispiels von vorher den Fall an, in dem ein Mitarbeiter (Personal) für einen anderen Mitarbeiter (Vorgesetzter) arbeitet. Der Vorgesetzte beurteilt seine Mitarbeiter in regelmäßigen Abständen und macht sich dabei Gedanken über ihre Leistung über einen bestimmten Zeitraum hinweg.

Die Beurteilung kann weder ein Attribut des Vorgesetzten oder des Personals allein sein, aber die Informationen können der Assoziation selbst zugeordnet werden, wie das folgende Beispiel zeigt:

Beispiel für eine Assoziationsklasse

Die Assoziationsklasse Beurteilung erfasst Informationen, die sich auf die Assoziation selbst beziehen.

Qualifizierte Assoziationen

Qualifikationsmerkmale werden verwendet, um die Gruppe der Instanzen, die einer anderen Instanz zugeordnet werden, weiter einzuschränken und zu definieren. Ein Objekt und ein Qualifikationsmerkmal bestimmen zusammen eine eindeutige Gruppe von Objekten in der Assoziation und bilden einen zusammengesetzten Schlüssel. Qualifizierung reduziert gewöhnlich die Multiplizität der gegenüberstehenden Rolle. Die reine Multiplizität zeigt die Anzahl der Instanzen der zugehörigen Klasse, die der ersten Klasse und einem bestimmten Qualifikationsmerkmal zugeordnet sind. Qualifikationsmerkmale werden als kleine Kästchen an dem Ende der Assoziation gezeichnet, das der qualifizierenden Klasse zugeordnet ist. Sie sind Teil der Assoziation, nicht die Klasse selbst. Ein Kästchen für ein Qualifikationsmerkmal kann mehrere Werte enthalten. Die Qualifizierung basiert auf der vollständigen Liste der Werte. Eine qualifizierte Assoziation ist eine Variante eines Assoziationsattributs.

Beispiel

Schauen Sie sich die folgende Präzisierung der Assoziation zwischen Position und Produkt an. Eine Position hat eine Assoziation zum bestellten Produkt. Jede Position verweist auf ein und nur ein Produkt, wohingegen ein Produkt in vielen Positionen bestellt werden kann. Indem Sie die Assoziation mit dem Qualifikationsmerkmal Produktschlüssel qualifizieren, geben Sie außerdem an, dass jedes Produkt einen eindeutigen Produktschlüssel hat und dass Positionen Produkten mit diesem Produktschlüssel zugeordnet sind.

Qualifizierte Assoziation

Die Assoziation zwischen Position und Produkt hat das Qualifikationsmerkmal Produktschlüssel.

n-gliedrige Assoziationen

Eine n-gliedrige Assoziation ist eine Assoziation zwischen drei oder mehr Klassen, in der eine Klasse mehrfach vorkommen kann. n-gliedrige Assoziationen werden als große Rauten mit einem Assoziationspfad zu jeder beteiligten Klasse gezeichnet. Dies ist das Symbol für ein traditionelles Entitätsbeziehungsmodell. Die binäre Form wird aus Gründen der besseren Übersicht ohne die Raute gezeichnet, da in einem echten Modell Massen von Assoziationen enthalten sind. n-gliedrige Assoziationen sind relativ selten und können auch modelliert werden, indem man sie zu Klassen hochstuft. n-gliedrige Assoziationen können auch eine Assoziationsklasse haben. Dies wird gezeigt, indem eine gestrichelte Linie von der Raute zum Klassensymbol gezeichnet wird. Rollen können Rollennamen haben, aber Multiplizität ist komplizierter und wird am besten durch Auflisten der geeigneten Schlüssel angegeben. Wenn eine Multiplizität angegeben ist, gibt sie die Anzahl der Instanzen an, die einem bestimmten Tupel der anderen N-1-Objekte entsprechen. Die Verwendung n-gliedriger Assoziationen kann meistens durch die Verwendung von qualifizierten Assoziationen oder Assoziationsklassen vermieden werden. Sie können auch durch herkömmliche Klassen ersetzt werden, obwohl damit die Vorgabe verloren geht, dass jeweils nur eine Verbindung für ein bestimmtes Tupel beteiligter Objekte erstellt werden kann.