Einzigartigkeit der Assoziationsklasse

Sep 27 2020

Es fällt mir schwer, das in der UML 2.5-Spezifikation erläuterte Konzept der Assoziationsklasse zu verstehen. Was mich am meisten verwirrt, ist der folgende Satz von Seite 199:

HINWEIS. Selbst wenn alle Enden der AssociationClass isUnique = true haben, können mehrere Instanzen denselben Instanzensatz der Endklassen zuordnen.

Wie hier angegeben: https://issues.omg.org/issues/UMLR-757Dieser einzelne Satz scheint die Nützlichkeit des Konzepts zu untergraben. Gleichzeitig macht es so ziemlich jeden Text, der das vor der 2.5-Version der UML-Spezifikation geschriebene Konzept erklärt, überflüssig - siehe zum Beispiel die Diskussion hier: UML-Assoziationsklasse - Klarstellung

Aber wie kann das eigentlich konzeptionell funktionieren? Angenommen, alle Enden der Assoziationsklasse haben isUnique=true, wie kann man mehr als eine Instanz der Assoziationsklasse haben, die denselben Satz von Instanzen der Endklassen assoziiert, wenn das isUniqueEigentum der Mitgliederenden das Vorhandensein solcher Links eindeutig verbietet?

Ich habe immer gedacht, dass eine Assoziationsklasse nur eine reguläre Assoziation mit zusätzlichen Attributen und / oder Operationen ist. Diese Interpretation scheint jetzt ungültig zu sein. Was genau ist Assoziationsklasse? Wie kann es eine Einzigartigkeit haben, die unabhängig von der des Vereinsmitglieds ist? Irgendwo scheint eine unausgesprochene Vielfalt zu lauern (Einzigartigkeit ist eine irrelevante Eigenschaft ohne höhere maximale Vielfalt als 1), aber ich kann nicht herausfinden, wo.

Antworten

5 Christophe Sep 27 2020 at 07:40

Kurz gesagt

Dies ist in der Tat nicht sehr klar und verdient eine bessere Erklärung. Um es kurz zu machen: Es ist nur eine Folge der mangelnden Integration in die für die Assoziationsklasse definierte duale Semantik.

Ausführliche Erklärung

Was ist die Einzigartigkeit eines Vereins?

Gemäß UML 2.5.1 Abschnitt 11.5.3.1, Seite 197:

Wenn ein oder mehrere Enden der Zuordnung isUnique = false haben, können mehrere Links denselben Instanzensatz zuordnen.

Wir können mit logischer Gegenüberstellung ableiten, dass:

Wenn es nicht möglich ist, dass mehrere Links denselben Satz von Instanzen zuordnen, haben alle Enden der Zuordnung isUnique = true.

Wir würden also erwarten, dass dies auch für eine Zuordnungsklasse gilt, da die Zuordnungsklasse auch eine Zuordnung ist.

Assoziationsklassen sind zwei verschiedene Dinge gleichzeitig

Gemäß UML 2.5.1 Abschnitt 11.5.3.2:

Eine AssociationClass ist sowohl eine Association als auch eine Klasse und behält die statische und dynamische Semantik beider bei .

Eine Assoziationsklasse ist also nicht nur " eine Assoziation mit zusätzlichen Attributen ". Wenn es so einfach wäre, könnte die Assoziationsklasse durchaus eine Verallgemeinerung einer Assoziation sein: Die spezialisierte Assoziation würde nur die zusätzlichen Attribute erben. Dies ist jedoch ausdrücklich untersagt.

Eine AssociationClass kann keine Verallgemeinerung einer Association oder einer Klasse sein.

weil jede Spezialisierung auf eine Klasse die Assoziationssemantik verlieren würde und jede Spezialisierung auf eine Assoziation die Klassensemantik verlieren würde.

Und diese Dualität ist die Ursache unseres Problems.

Auswirkungen dieser Dualität auf Instanzen

Gemäß UML-Abschnitt 11.5.3.2, Seite 199 (Formatierung von mir):

Eine Instanz einer AssociationClass weist die Merkmale sowohl eines Links auf, der eine Instanziierung der AssociationClass als eine Art Assoziation darstellt , als auch eines Objekts, das eine Instanziierung der AssociationClass als eine Art Klasse darstellt .

Wenn isUnique=truefür alle Assoziationen endet , sind die Instanzen der Assoziation garantiert eindeutig. Erinnern Sie jedoch daran, dass es bei der Assoziation nur um Tupel geht, die aus den Assoziationsenden hergestellt wurden:

Eine Zuordnung erklärt, dass es Verknüpfungen zwischen Instanzen geben kann, deren Typen den zugeordneten Typen entsprechen oder diese implementieren. Ein Link ist ein Tupel mit einem Wert für jedes Mitglied der Vereinigung , wobei jeder Wert eine Instanz ist, deren Typ dem Typ am Ende entspricht oder diesen implementiert.

Nichts in den Spezifikationen erfordert jedoch, dass die Klasseninstanziierung (Objekt), die die Assoziationsinstanziierung darstellt, eindeutig sein muss.

Stellen Sie sich zum Beispiel, dass wir eine Assoziationsklasse zwischen Klasse Aund Klasse B, und aund bsind Instanzen dieser Klassen. Stellen Sie sich vor, die Vereinigung endet haben isUnique=true. Dies bedeutet, dass es nur ein Tupel geben kann, (a,b)da die Zuordnung garantiert eindeutig ist.

Sei P eine Eigenschaft der Assoziationsklasse und sei (a,b,p1)und (a,b,p2)zwei Instanzen der Klasse in der Assoziationsklasse. Die Klasse kennt keine Assoziationsenden: Aus Sicht der Klasse gibt es keine Einheitlichkeitsanforderungen. Und aus Sicht des Vereins haben wir nur ein Tupel (a,b), also ist es auch in Ordnung.

Der HINWEIS erklärt nur, dass diese (unglückliche und mehrdeutige) Situation möglich ist.

Gibt es Widersprüche oder Inkonsistenzen?

Formal gibt es keinen Widerspruch. Dies ist das Ergebnis der Art und Weise, wie die Assoziationsklasse definiert wird: eine Klasse und eine Assoziation gleichzeitig, ohne die Beziehung zwischen den jeweiligen Instanzen weiter zu definieren.

Dies wirft jedoch einige Probleme in Bezug auf die Semantik von Assoziationen mit nicht eindeutigen Zielen auf:

Wenn ein oder mehrere Enden der Assoziation vorhanden sind isUnique=false, können mehrere Links denselben Instanzensatz zuordnen. In einem solchen Fall tragen Links neben ihren Endwerten eine zusätzliche Kennung.

Genauer gesagt macht dies die Assoziationsklasse mit eindeutigen Zielen unbrauchbar, da das gleiche Ergebnis mit nicht eindeutigen Zielen erzielt werden kann:

  • Für eine einfache Zuordnung mit nicht eindeutigen Enden können Sie Duplikate haben, dh mehrere Links, die dieselben Instanzen der Zuordnungsenden zuordnen, die mit einem zusätzlichen Bezeichner unterschieden werden.
  • Für Assoziationsklassen mit eindeutigen Enden können Sie gemäß dem Hinweis Duplikate haben, dh mehrere Objekte (Klasseninstanzen), die einem Link aus eindeutigen Assoziationsenden (Assoziationsinstanzen) entsprechen.
  • Für eine Zuordnungsklasse mit nicht eindeutigen Enden können Duplikate vorhanden sein, dh mehrere Objektinstanzen entsprechen demselben Satz von Elementenden. Es macht keinen Unterschied, ob Sie dies als mehrere Links interpretieren, die dieselben Instanzen der Assoziationsenden zuordnen, die jeweils einem einzelnen Objekt zugeordnet sind, oder ob Sie dies als einen Link interpretieren, der eine eindeutige Menge von Instanzen des Assoziationsendes assoziiert jeweils mehreren Objektinstanzen zugeordnet sein.

IMHO, das ist unglücklich:

  • Es stimmt nicht mit unserem mentalen Modell überein, in dem eine Assoziationsklasse mit allen Assoziationsenden isUnique=trueeine eindeutige Objektinstanz der Klasse für eine eindeutige Kombination haben sollte. Dies widerspricht eindeutig dem Prinzip des geringsten Erstaunens: Ich begann mit Verleugnung und es dauerte eine Weile, bis ich dies akzeptierte, da es sich so schrecklich von den traditionellen Methoden zur Implementierung von Assoziationsklassen unterschied.
  • Zwei verschiedene Modelle, eines mit eindeutigen Assoziationsenden und eines ohne, könnten tatsächlich dieselbe Situation ausdrücken.

Eine einfache Lösung für dieses Problem besteht darin, dass eine eindeutige Klasseninstanz (Objekt, das der Zuordnungsklasse entspricht) einem Link entspricht, der die Zuordnungsende eindeutig zuordnet . Auf diese Weise würden eindeutige Zuordnungsende ein eindeutiges Zuordnungsobjekt implizieren, ohne dass andere Änderungen an den UML-Spezifikationen erforderlich wären.