UML einfach erklärt: Diagramme lesen und erstellen
Mit UML (Unified Modeling Language, „vereinheitlichte Modellierungssprache“) lernst du, Aufbau und Abläufe von Programmen darzustellen.
Kurz gesagt
UML ist eine gemeinsame Sprache für Modelle: vereinfachte Beschreibungen eines Systems. Ein Klassendiagramm zeigt Klassen als Baupläne; ein Sequenzdiagramm zeigt den Nachrichtenaustausch zwischen Objekten, also einzelnen Dingen nach diesen Bauplänen.
Bevor du ein Programm umsetzt, kannst du seinen Aufbau und wichtige Abläufe planen. Ein Diagramm ist eine Zeichnung, die ausgewählte Teile und Verbindungen zeigt. Hier arbeitest du mit erfundenen Modellen; ihre Annahmen legen fest, was gelten soll.
Deine Lernziele
UML stellt gemeinsame Zeichen und Regeln bereit, mit denen du Modelle beschreiben kannst. Das erleichtert es, einen Programmentwurf zu besprechen. Ein UML-Modell ist selbst kein ausführbares Programm.
Ein Strukturdiagramm zeigt den Aufbau eines Modells. Dazu gehört das Klassendiagramm: Es zeigt Klassen, ihre Eigenschaften und ihre Beziehungen. Ein Verhaltensdiagramm beschreibt dagegen Abläufe. Dazu gehört das Sequenzdiagramm: Es zeigt, wie einzelne Objekte Nachrichten austauschen.
Eine Klasse ist ein Bauplan für gleichartige Objekte. Ein Objekt ist ein einzelnes Ding nach diesem Bauplan. Ein Attribut beschreibt eine Eigenschaft, für die ein Objekt einen Wert haben kann. Eine Operation beschreibt eine angebotene Tätigkeit. Im Klassendiagramm steht eine Klasse in einem Rechteck. Oben steht ihr Name. Darunter können getrennte Bereiche für Attribute und Operationen folgen; diese Bereiche dürfen auch fehlen. In unseren Entwürfen kennzeichnet ein Klammerpaar eine Operation. Leere Klammern bedeuten, dass du beim Aufruf keine Eingabewerte übergibst.
Zum Entwerfen einer Klasse bestimmst du ihren Zweck, gibst ihr einen Namen und wählst passende Eigenschaften und Tätigkeiten. Halte ausdrücklich fest, welche Annahmen für deinen Entwurf gelten.
Klasse und Objekt
Die Klasse beschreibt einen gemeinsamen Bauplan. Ein einzelnes Objekt kann eigene Attributwerte haben und die angebotenen Operationen nutzen.
Beispiel: Eine erfundene Klasse für einen Wecker
- 1Annahme: Unser Wecker speichert eine Weckzeit und kann eingeschaltet werden.
- 2Oberer Bereich: Klassenname „Wecker“.
- 3Mittlerer Bereich: Attribute „weckzeit“ und „aktiv“.
- 4Unterer Bereich: Operation „einschalten()“.
- 5Ein einzelnes Wecker-Objekt kann für „weckzeit“ den Wert „07:15“ und für „aktiv“ den Wert „ja“ haben.
Merke: Ein Klassendiagramm beschreibt die Struktur. Ein Sequenzdiagramm beschreibt den Nachrichtenaustausch in einem Ablauf. Eine Operation im Klassenkasten zeigt noch nicht, wie das Programm sie ausführt.
Teste dich
Eine Assoziation beschreibt eine Beziehung zwischen Klassen. Du zeichnest sie als durchgezogene Linie. Eine Beschriftung kann erklären, was die Verbindung bedeutet, etwa „nutzt“. Daraus folgt noch keine Beziehung zwischen einem Ganzen und seinen Teilen.
Eine Aggregation ist eine besondere Assoziation. Sie beschreibt ein Ganzes mit Teilen. Eine leere Raute steht am Ende beim Ganzen. Aus dieser Raute allein folgt keine allgemeine Regel darüber, was beim Löschen des Ganzen mit den Teilen passiert. Solche Annahmen musst du zusätzlich festlegen.
Eine Komposition ist die stärkere Form dieser Ganzes-Teile-Beziehung. Ihre Raute ist ausgefüllt und steht ebenfalls beim Ganzen. Ein Teil darf gleichzeitig zu höchstens einer solchen Komposition gehören. Beim Löschen des Ganzen werden seine noch enthaltenen Teile gewöhnlich mitgelöscht. Ein Teil kann aber aus der Komposition entfernt werden, ohne das Ganze zu löschen. Es gilt also keine ausnahmslose Löschregel.
Eine Generalisierung verbindet eine speziellere Klasse, die Unterklasse, mit einer allgemeineren Klasse, der Oberklasse. Die Unterklasse erbt deren Attribute, Operationen und Beziehungen. Das ist eine „ist eine Art von“-Beziehung. Eine durchgezogene Linie mit einem hohlen Dreieck zeigt von der spezielleren zur allgemeineren Klasse. Bei den hier behandelten Generalisierungen verbindest du Klassen mit Klassen.
| Beziehung | Zeichen | Bedeutung |
|---|---|---|
| Assoziation | Durchgezogene Linie | Eine Beziehung zwischen Klassen |
| Aggregation | Leere Raute beim Ganzen | Ein Ganzes mit Teilen |
| Komposition | Ausgefüllte Raute beim Ganzen | Ein Teil gehört gleichzeitig zu höchstens einem solchen Ganzen. |
| Generalisierung | Hohles Dreieck bei der allgemeineren Klasse | Die speziellere Klasse erbt von der allgemeineren Klasse. |
Beispiel: Vier erfundene Modellentscheidungen
- 1Assoziation: Ein „Techniker“ wartet eine „Maschine“. Die Beziehung heißt „wartet“.
- 2Aggregation: Eine „Musikgruppe“ wird als Ganzes mit „Musiker“-Objekten als Teilen modelliert. Die leere Raute steht bei „Musikgruppe“.
- 3Komposition: Eine „Zeichnung“ enthält „Form“-Objekte. Jedes Form-Objekt gehört gleichzeitig zu höchstens einer Zeichnung. Die ausgefüllte Raute steht bei „Zeichnung“.
- 4Generalisierung: „Lastenrad“ ist eine besondere Art von „Fahrrad“. Das hohle Dreieck zeigt zu „Fahrrad“.
Merke: Begründe die Beziehung mit deinen Modellannahmen. Die Raute steht beim Ganzen; das hohle Dreieck der Generalisierung zeigt zur allgemeineren Klasse.
Teste dich
Eine Multiplizität ist eine Anzahlvorgabe an einem Ende einer Assoziation. Sie legt fest, wie viele Objekte dieser Klasse mit einem einzelnen Objekt der gegenüberliegenden Klasse verbunden sein dürfen. Du liest beide Enden getrennt.
Die Schreibweise nennt eine Untergrenze und eine Obergrenze, getrennt durch zwei Punkte. Bei 0..1 sind null oder ein Objekt erlaubt. Sind beide Grenzen gleich, genügt eine Zahl: 1 bedeutet genau ein Objekt. Der Stern \ast steht als Obergrenze dafür, dass keine feste obere Anzahl angegeben ist. 0..\ast erlaubt daher null oder mehr Objekte; dafür kannst du auch kurz \ast schreiben. 1..\ast verlangt dagegen mindestens ein Objekt. Die Angabe „viele“ allein lässt offen, ob auch null erlaubt ist.
Zum Lesen hältst du gedanklich ein Objekt der einen Klasse fest. Dann liest du die Anzahl am anderen Ende. Zum Entwerfen fragst du in beiden Richtungen: Wie wenige Objekte dürfen verbunden sein? Wie viele höchstens? Die Antworten müssen zu den Annahmen deines Modells passen.
Multiplizität
Die Angabe bei einer Klasse zählt deren verbundene Objekte pro einzelnem Objekt der anderen Klasse.
| Angabe | Erlaubte Anzahl |
|---|---|
| 0..1 | Null oder eins |
| 1 | Genau eins |
| 0..\ast | Null oder mehr, ohne feste Obergrenze |
| \ast | Kurzform für 0..\ast |
| 1..\ast | Mindestens eins, ohne feste Obergrenze |
| 2..4 | Zwei, drei oder vier |
Beispiel: Ein erfundenes Modell für Depots und Leihräder
- 1Annahmen: Ein Depot darf leer sein oder mehrere Leihräder aufnehmen. Jedes Leihrad ist keinem oder einem Depot zugeordnet.
- 2Am Ende bei „Leihrad“ steht 0..\ast: Ein einzelnes Depot hat null oder mehr Leihräder.
- 3Am Ende bei „Depot“ steht 0..1: Ein einzelnes Leihrad gehört zu keinem oder einem Depot.
- 4Prüfung: Ein leeres Depot ist erlaubt. Ein Leihrad in zwei Depots gleichzeitig widerspricht dem Modell.
Teste dich
Ein Sequenzdiagramm beschreibt den Nachrichtenaustausch zwischen beteiligten Objekten. In unserer vereinfachten Darstellung stehen ihre Namen oben nebeneinander. Unter jedem Objekt verläuft eine senkrechte gestrichelte Lebenslinie. Sie hilft dir, Nachrichten dem jeweiligen Objekt zuzuordnen.
Ein beschrifteter Pfeil stellt eine Nachricht dar. Er führt vom Sender zum Empfänger; die Pfeilspitze zeigt zum Empfänger. Die Beschriftung nennt die Nachricht, zum Beispiel eine angeforderte Tätigkeit. Unsere Nachrichtennamen sind frei gewählte Bezeichnungen und kein ausführbarer Programmcode.
In allen hier verwendeten Abläufen laufen keine Vorgänge gleichzeitig ab. Lies ihre Nachrichten von oben nach unten: Eine weiter oben gezeichnete Nachricht steht früher im Ablauf. Der senkrechte Abstand gibt keine Dauer an. Du kannst daraus also keine Sekunden oder Wartezeiten ablesen. Die waagerechte Anordnung verteilt die beteiligten Objekte; sie legt ihre Reihenfolge im Ablauf nicht fest.
Zum Beschreiben eines solchen Ablaufs nennst du für jede Nachricht den Sender, den Empfänger und die Nachricht. Halte dabei die dargestellte Reihenfolge ein.
Lebenslinie
Die senkrechte gestrichelte Linie unter einem Objekt zeigt dessen Beteiligung am dargestellten Ablauf. An ihr erkennst du, welche Nachrichten dieses Objekt sendet oder empfängt.
Beispiel: Punkte laden in einem erfundenen Spiel
- 1Annahme: Die Objekte „Spielansicht“, „Spielsteuerung“ und „Punktespeicher“ tauschen nacheinander Nachrichten aus.
- 2Oberster Pfeil: Spielansicht → Spielsteuerung: „ladePunkte“.
- 3Darunter: Spielsteuerung → Punktespeicher: „liesPunkte“.
- 4Darunter: Punktespeicher → Spielsteuerung: „lieferePunkte“.
- 5Unterster Pfeil: Spielsteuerung → Spielansicht: „zeigePunkte“.
Merke: Lies in unseren Abläufen ohne gleichzeitige Vorgänge von oben nach unten. Prüfe an jeder Pfeilspitze den Empfänger. Die Abstände liefern keine Zeitmessung.
Teste dich
Alles auf einen Blick
UML
Gemeinsame Zeichen und Regeln helfen beim Beschreiben und Besprechen eines Modells.
Der Bauplan kann Attribute für Eigenschaften und Operationen für Tätigkeiten enthalten.
Das hohle Dreieck zeigt von der spezielleren zur allgemeineren Klasse.
Ein Teil gehört gleichzeitig zu höchstens einem solchen Ganzen. Beim Löschen des Ganzen werden enthaltene Teile gewöhnlich mitgelöscht; Teile können vorher entfernt werden.
Die Angabe an einem Ende zählt die dortigen Objekte pro einzelnem Objekt am anderen Ende.
In unseren Abläufen ohne Gleichzeitigkeit liest du Nachrichten von oben nach unten; Abstände sind keine Zeitangaben.
Ein erfundenes Modell für Futterautomaten entwerfen und prüfen
- 1Aufgabe: Entwirf Klassen und eine Beziehung. Annahmen: Jeder Futterautomat nutzt genau einen Napf. Ein Napf darf unverbunden sein und ist höchstens einem Futterautomaten zugeordnet.
- 2Lege die Klasse „Futterautomat“ an: Das Attribut „vorrat“ beschreibt die vorhandene Futtermenge. Die Operation „ausgeben()“ bietet die Tätigkeit der Futterausgabe an.
- 3Lege die Klasse „Napf“ an: Das Attribut „farbe“ beschreibt seine Farbe. Die Operation „leeren()“ bietet das Leeren an.
- 4Verbinde die Klassen durch eine Assoziation mit der Beschriftung „nutzt“. Die Annahmen legen keine Löschregel für die Objekte fest.
- 5Schreibe 1 an das Ende bei „Napf“: Pro Futterautomat ist genau ein Napf erforderlich.
- 6Schreibe 0..1 an das Ende bei „Futterautomat“: Pro Napf sind null oder ein Futterautomat erlaubt.
- 7Prüfe den Entwurf: Ein Futterautomat mit einem zugeordneten Napf und ein weiterer, unverbundener Napf erfüllen beide Anzahlvorgaben.
Fehler finden
Fehler in Zeile 3Die Anzahl bei „Fahrer“ muss die Fahrer pro einzelner Lieferung zählen. Die Angabe 0..2 zählt dagegen Lieferungen pro Fahrer. Richtig: Am Ende bei „Fahrer“ steht 1.
Lückentext
Du möchtest die Eigenschaften von Klassen und ihre Beziehungen darstellen. Dafür passt ein . In einem erfundenen Modell darf ein Drucker keinen oder einen Druckauftrag haben. Am Ende bei „Druckauftrag“ steht deshalb . Eine Verbindung, bei der eine speziellere Klasse von einer allgemeineren Klasse erbt, heißt .