Archyno
UMLStrukturdiagramme

UML-Klassendiagramme

Das Strukturdiagramm, das den grössten Teil des UML-Vokabulars trägt: Typen, ihre Attribute und Operationen, und die sechs Linienarten, die sie verbinden. Wer dieses richtig lernt, bekommt die sechs übrigen Strukturdiagramme fast geschenkt.

11 Min. LesezeitUML 2.5.14 von 35

Die kurze Antwort

  • Aggregation und Komposition bedeuten beide hat-ein. Der einzige Unterschied ist, ob die Teile das Ganze überleben: hohle Raute ja, gefüllte nein.
  • Generalisierung ist eine durchgezogene Linie mit hohlem Dreieck, Realisierung eine gestrichelte mit demselben Dreieck. Durchgezogen heisst ist-eine-Art-von, gestrichelt erfüllt-den-Vertrag-von.
  • Multiplizität steht am Ende einer Assoziation, nicht in der Mitte: 1, 0..1, 1..*, und ein blosser Stern als Kurzform von 0..*.
  • Ein Klassendiagramm modelliert Typen mit Verhalten, ein ER-Diagramm gespeicherte Daten. Eine Domäne hat oft beides, ohne dass sie einander Element für Element entsprechen.
UML-Klassendiagramm einer Zahlungsdomäne. Merchant ist mit Payment assoziiert, eins zu vielen. Payment besteht aus einem Money und null oder mehr Refund und ist mit einer Schnittstelle PaymentMethod assoziiert, die sowohl Card als auch BankTransfer realisieren.
Ein Klassendiagramm einer Zahlungsdomäne. Jedes Zeichen darauf wird unten erklärt, und dieselbe Domäne taucht in jedem weiteren Artikel dieser Reihe wieder auf.

01Den Kasten lesen#

Eine Klasse ist ein Rechteck mit bis zu drei übereinander gestapelten Abschnitten. Nur der erste ist Pflicht.

  • Name. Der Typname, zentriert und fett. Ist die Klasse abstrakt, steht der Name kursiv. Ein Schlüsselwort in Guillemets darüber - «interface», «enumeration» - engt ein, um welche Art Klassifizierer es sich handelt.
  • Attribute. Eines pro Zeile, geschrieben als Sichtbarkeit Name: Typ [Multiplizität] = Vorgabe. Ausser dem Namen ist alles optional.
  • Operationen. Eine pro Zeile, geschrieben als Sichtbarkeit Name(Parameter): Rückgabetyp.

Das führende Zeichen an jedem Element ist seine Sichtbarkeit: + öffentlich, - privat, # geschützt und ~ Paket. Ein unterstrichenes Element ist statisch - es gehört der Klasse, nicht einer Instanz.

02Die sechs Linien#

Fast die gesamte Bedeutung eines Klassendiagramms steckt in den Linien, und nur sechs lohnen das Auswendiglernen. Das Ende, das die Verzierung trägt, ist in jedem Fall entscheidend.

ElementNotationWas es bedeutet
AssoziationEine strukturelle Verbindung. Instanzen der einen wissen von Instanzen der anderen. Die Multiplizität an jedem Ende sagt, wie viele.
Gerichtete AssoziationDasselbe, aber nur in Pfeilrichtung navigierbar. Payment erreicht seine PaymentMethod; die Methode nicht zurück.
AggregationEine Ganzes-Teil-Verbindung, bei der das Teil das Ganze überlebt. Die hohle Raute sitzt am Ganzen.
KompositionEine Ganzes-Teil-Verbindung, bei der das Teil mit dem Ganzen stirbt. Gefüllte Raute am Ganzen. Ein Teil hat genau einen Eigentümer.
GeneralisierungVererbung. Das hohle Dreieck zeigt auf den Elternteil. Lesen Sie es als „ist eine Art von“.
RealisierungImplementierung einer Schnittstelle. Gestrichelte Linie, hohles Dreieck an der Schnittstelle.
AbhängigkeitDie schwächste Verbindung: eine nutzt die andere, typisch als Parameter oder lokale Variable. Sparsam einsetzen, sonst ist am Ende jede Klasse mit jeder verbunden.

Durchgezogene Linien ohne Dreieck sind strukturell; gestrichelte Linien sind immer schwächer als durchgezogene.

03Multiplizität#

Die Zahl am Ende einer Linie sagt, wie viele Instanzen beteiligt sind. Sie steht am entfernten Ende von der Klasse, die sie einschränkt, und genau das verwirrt: liest man Merchant 1 —— 0..* Payment, bedeutet 0..* neben Payment, dass ein Händler null oder mehr Zahlungen hat.

  • 1 - genau eine. Die Vorgabe, wenn nichts dasteht, auch wenn es klarer ist, sie hinzuschreiben.
  • 0..1 - optional. Das ist die Notation für eine Referenz, die leer sein darf.
  • * oder 0..* - beliebig viele, auch keine.
  • 1..* - mindestens eine. Eine sinnvolle und häufig vergessene Einschränkung.
  • 2..4 - ein expliziter Bereich.

Multiplizität ist der billigste Korrektheitsgewinn der ganzen Notation. „Darf das leer sein?“ und „kann es mehr als eines geben?“ sind die beiden Fragen, die in einem Entwurfsreview echte Meinungsverschiedenheiten hervorholen, und die Antwort braucht drei Zeichen.

04Assoziation, Aggregation, Komposition#

Diese drei sind dieselbe Beziehungsform in drei Stärken, und der Unterschied betrifft den Lebenszyklus, nicht wie stark sich die beiden Dinge zusammengehörig anfühlen.

Zwei gegenübergestellte Diagramme. Links hat Payment eine gefüllte Raute zu Money, beschriftet mit Komposition: das Money kann ohne das Payment nicht existieren. Rechts hat Team eine hohle Raute zu Person, beschriftet mit Aggregation: eine Person überlebt das Team.
Der Test ist das Löschen. Links Komposition: zerstören Sie das Ganze, und das Teil wird mit zerstört. Rechts Aggregation: das Teil macht weiter.

Eine schlichte Assoziation behauptet nichts über Eigentum. Zwei Dinge sind verbunden. Das ist alles, und es ist die richtige Vorgabe.

Aggregation - die hohle Raute - behauptet eine Ganzes-Teil-Beziehung, bei der das Teil unabhängig ist. Ehrlicher Rat: Aggregation trägt in UML 2.5.1 fast keine formale Semantik, und die Leser sind sich uneins, was sie impliziert. Sind Sie zwischen Assoziation und Aggregation unsicher, zeichnen Sie die Assoziation.

Komposition - die gefüllte Raute - ist die, die etwas Starkes und Prüfbares sagt. Das Teil gehört genau einem Ganzen und wird mit ihm zerstört. Im Zahlungsmodell existiert ein Refund nur als Teil eines Payment; eine frei schwebende Erstattung gibt es nicht. Das ist eine echte Einschränkung, die es zu notieren lohnt, und sie bildet sich direkt auf ein kaskadierendes Löschen oder eine besessene Collection im Code ab.

05Wann eines zu zeichnen ist#

Dazu greifen, wenn

  • Das Domänenvokabular mit Leuten abstimmen, die den Code nicht lesen werden
  • Die Beziehungen haben echte Einschränkungen - Optionalität, Kardinalität, Eigentum
  • Jemanden in ein Subsystem einarbeiten, dessen Form der Dateibaum nicht verrät
  • Ein Schema, einen API-Vertrag oder irgendetwas mit persistierter Struktur entwerfen

Zu etwas anderem greifen, wenn

  • Sie würden nachzeichnen, was eine IDE mit einem Klick aus dem Quelltext erzeugt
  • Die Frage betrifft Reihenfolge oder Zeit - zeichnen Sie ein Sequenz- oder Aktivitätsdiagramm
  • Die Klassen sind reine Framework-Installation ohne Domänenbedeutung
  • Sie sind versucht, jede Klasse des Systems auf eine Fläche zu packen

Die nützlichsten Klassendiagramme sind in der Praxis klein. Sieben bis zwölf Klassen, Attribute nur bei denen, über die gerade gesprochen wird, überall sonst weggelassen, und jede Linie trägt eine Multiplizität. So ein Diagramm wird in einer Besprechung gelesen und beendet Streit. Ein Klassendiagramm mit hundert Kästen ist ein Artefakt, keine Kommunikation.

06Fünf Fehler, die sich vermeiden lassen#

  1. Pfeile in die falsche Richtung. Generalisierung und Realisierung zeigen auf die Abstraktion. Sitzt Ihr Dreieck an der Unterklasse, sagt das Diagramm das Gegenteil von dem, was Sie meinten.
  2. Komposition für „stark verwandt“. Die gefüllte Raute ist eine Aussage über den Lebenszyklus. Nehmen Sie sie nur, wenn das Zerstören des Ganzen das Teil wirklich zerstört.
  3. Keine Multiplizitäten. Eine Linie mit nichts an beiden Enden hat die wertvollste Information weggeworfen, die das Diagramm tragen könnte.
  4. Höhen vermischt. Domänenklassen und Framework-Klassen auf einer Fläche. Teilen Sie auf; jedes Diagramm sollte für ein Publikum lesbar sein.
  5. Jeden Getter modelliert. Operationen gehören ins Diagramm, wenn sie Bedeutung tragen. getName() tut das nicht.

Wollen Sie ein Klassenmodell gegen die Wirklichkeit prüfen, zeichnen Sie ein Objektdiagramm - eine einzige konkrete Momentaufnahme von Instanzen. Multiplizitäten, die abstrakt in Ordnung aussahen, fallen erfahrungsgemäss sofort um, sobald man sie mit echten Werten füllen will.

In je einer Zeile

  1. 01Drei Abschnitte: Name, Attribute, Operationen. Lieber weglassen als leer lassen.
  2. 02Sichtbarkeitszeichen sind + - # ~; Unterstreichung heisst statisch, kursiver Name heisst abstrakt.
  3. 03Sechs Linien tragen die Bedeutung; das verzierte Ende ist immer entscheidend.
  4. 04Generalisierung und Realisierung zeigen auf die Abstraktion.
  5. 05Komposition ist eine Lebenszyklusaussage - das Teil stirbt mit dem Ganzen. Aggregation bedeutet kaum etwas; nehmen Sie lieber eine schlichte Assoziation.
  6. 06Multiplizität ist der billigste verfügbare Korrektheitsgewinn. Setzen Sie sie an jede Linie.

07Häufige Fragen#

Was ist der Unterschied zwischen Aggregation und Komposition?

Beide bedeuten hat-ein, und der Unterschied liegt darin, was beim Löschen des Ganzen geschieht. Aggregation, eine hohle Raute, heisst, die Teile überleben das Ganze: Löschen Sie eine Abteilung, und ihre Mitarbeiter existieren weiter. Komposition, eine gefüllte Raute, heisst, sie tun es nicht: Löschen Sie eine Bestellung, und ihre Positionen gehen mit.

Was bedeuten Plus, Minus und Raute im Klassendiagramm?

Es sind Sichtbarkeitsmarken an Attributen und Operationen, unmittelbar vor dem Namen des Members geschrieben. Plus ist öffentlich, Minus privat, die Raute geschützt, und die Tilde paketsichtbar.

Was bedeutet 0..* in UML?

Es ist eine Multiplizität und bedeutet null oder mehr. Multiplizität steht am Ende einer Assoziation und begrenzt, wie viele Instanzen dieses Endes teilnehmen dürfen: 1 ist genau eine, 0..1 ist optional, 1..* ist eine oder mehr, und ein blosser Stern ist die Kurzform von 0..*.

Was ist der Unterschied zwischen Generalisierung und Realisierung?

Generalisierung ist Vererbung zwischen zwei Klassen, gezeichnet als durchgezogene Linie mit hohlem Dreieck. Realisierung ist eine Klasse, die eine Schnittstelle implementiert, gezeichnet als gestrichelte Linie mit demselben hohlen Dreieck. Durchgezogen heisst ist-eine-Art-von, gestrichelt heisst erfüllt-den-Vertrag-von.

Wie unterscheidet sich ein UML-Klassendiagramm von einem ER-Diagramm?

Ein Klassendiagramm modelliert Typen mit Verhalten, deshalb gehören Operationen auf eine Klasse, und es beschreibt Objekte im Speicher. Ein ER-Diagramm modelliert die Daten, die ein System speichert, kennt keine Operationen, und seine Beziehungen beschränken sich auf das, was eine relationale Datenbank durchsetzen kann. Eine Domäne hat oft beides, und sie müssen einander nicht Element für Element entsprechen.

In dieser Reihe

Passend dazu

Alle Artikel