UML
Die UML (Unified Modeling Language, englisch für vereinheitlichte Modellierungssprache) ist eine Modellierungssprache, um Softwarekomponenten und -systeme graphisch darzustellen und damit die Verständlichkeit zu erhöhen. Mittlerweile ist die UML ein Standardwerkzeug in der Projektplanung. Aber auch für Privatprojekte und zur Einarbeitung in Softwarearchitekturen und gutes Softwaredesign sollte man sich mit der UML auseinandersetzen.
Geschichte und Vorteile der UML
Die UML wurde in den 90er Jahren von Grady Booch, Ivar Jacobson und James Rumbaugh entwickelt, um objektorientierte Programmierung zu unterstützen. 1997 wurde die Sprache zur Pflege an die Object Management Group (OMG) übergeben. Dementsprechend ist die UML sowohl von der OMG als auch nach der ISO/IEC 19505 genormt. Zudem wird sie stetig weiterentwickelt und um neue Diagrammtypen erweitert. So wurde von 2000 bis etwa 2009 an der UML 2 gearbeitet. Im Dezember 2017 wurde die neuste Version, die UML 2.5.1 veröffentlicht.
Obwohl der ursprüngliche Zweck der UML die Softwareentwicklung ist, kann der Standard grundsätzlich auch für die Organisation anderer Projekte verwendet werden. Der größte Vorteil besteht darin, dass die Sprache es ermöglicht, besser über Anwendungsfälle, Strukturen und Abläufe innerhalb eines Systems oder Projektes zu diskutieren. Sowohl Techniker als auch Nicht-Techniker können die Modelle verstehen und daher eine gemeinsame Sprache verwenden. Zudem bieten die Modelle eine bessere Übersicht und erleichtern die Dokumentation, sodass die modellierten Systeme besser verständlich sind und Designprobleme frühzeitig erkannt werden können. All diese Vorteile sind insbesondere für große Projekt wichtig. Aber auch für private Projekte lohnt es sich, grundlegende Kenntnisse über UML zu haben, denn die graphische Darstellung bietet eine gute Grundlage für eine saubere Implementierung.
Bestandteile der UML
Die aktuelle UML 2 besteht aus vier Teilspezifikationen: Die UML 2.x Infrastructure Specification, die UML 2.x Superstructure Specification, die UML 2.x Object Constraint Language (OCL) und die UML 2.x Diagram Interchange-Spezifikation. Die UML Infrastructure Specification beschreibt die häufigsten Modellelemente, beispielsweise Klassen oder Assoziationen. Die UML Superstructure Specification baut auf dieser Basis auf und definiert Modellelemente für bestimmte Einsatzzwecke, wie Anwendungsfälle oder Zustandsautomaten. Die OCL ist eine Sprache, die die UML mit Randbedingungen bei der Modellierung eines Computerprogramms ergänzt. So können beispielsweise Wertebereiche für Variablen festgelegt werden.
Die Diagram Interchange-Spezifikation schlussendlich gibt es erst seit Einführung der UML 2. Sie beschäftigt sich nicht mit der Semantik der UML, sondern mit dem Diagramm-Layout. Während es in den UML 1.x-Versionen nicht möglich war, Diagramme zwischen verschiedenen Formaten zu übertragen ohne, dass Informationen wie Elementpositionen oder -größen verloren gingen, wird dieses Problem durch das das Diagram Interchange-Format behoben.
Übersicht über die Grundelemente von UML-Diagrammen
Ein Diagrammtyp ist eine Sammlung von Notationselementen und gewissen Regeln, wie diese Elemente zu verwenden und zu interpretieren sind. Grundsätzlich besteht das Diagramm aus einer rechteckigen Diagrammfläche und einem Diagrammkopf in der linken oberen Ecke. Im Diagrammkopf werden immer der Diagrammname und optional der Diagrammtyp sowie Parameter festgelegt. Innerhalb der Diagrammfläche werden dann die jeweiligen validen Diagrammelemente angeordnet und miteinander verbunden. Einige Notationselemente sind für mehrere Diagrammtypen zulässig.
Die UML 2 definiert mittlerweile 14 verschiedene Diagrammtypen, die sich grob in zwei Kategorien einteilen lassen: Zum einen Strukturdiagramme, die den statischen Aufbau der Programm- oder Systemteile beschreiben, und zum anderen Verhaltensdiagramme, die die Interaktion von Komponenten bzw. dynamische Aspekte des modellierten Systems beleuchten. Interaktionsdiagramme werden teilweise als eigene Klasse von den Verhaltensdiagrammen losgelöst betrachtet.
Die wichtigsten Elemente, die die UML kennt, sind:
- Klassen: Klassen sind der eigentliche Kern der UML, auf dem die grundlegenden Prinzipien der Modellierungssprache definiert sind. Eine Klasse beschreibt ein beliebiges Element. Sie kann als “Metaklasse” sogar Elemente der UML wiederum als eigene Klasse modellieren – das heißt, die komplette UML lässt sich als eigene Sammlung von UML-Diagrammen darstellen. Zwischen Klassen können Beziehungen und Abhängigkeiten definiert und zu den Klassen selbst Felder und Methoden hinzugefügt werden.
- Assoziation: Eine Assoziation beschreibt eine Beziehung zwischen zwei Klassen. Verweist eine Klasse mit einer Assoziation direkt auf sich selbst, wird die Assoziation als reflexiv bezeichnet. Zudem gibt es Sonderformen der Assoziation nämlich die Komposition (dargestellt, durch eine ausgefüllte Raute an einem Ender der Verbindung) und Aggregation (dargestellt durch eine unausgefüllte Raute). Beide Sonderformen bedeuten, dass ein Objekt fester Teil des anderen ist. Bei einer Komposition kann das eine Objekt ohne das andere aber nicht existieren. Ein Beispiel dafür ist eine Universität mit verschiedenen Lehrstühlen. Ohne die Universität existieren die Lehrstühle nicht, die Universität ist also eine Komposition aus den Lehrstühlen. Die Professoren der Lehrstühle sind zwar fester Bestandteil des Lehrstuhls, existieren ohne ihn aber weiter. Der Lehrstuhl ist daher eine Aggregation der Professoren.
- Multiplizität: Eine Multiplizität wird als Intervall in Form [n…m] an eine Assoziation geschrieben und gibt an, wie viele Objekte an der Beziehung beteiligt sind. n und m müssen dabei aus dem Bereich der natürlichen Zahlen kommen oder können mit * als unbeschränkt definiert werden.
- Aktionen: Eine Aktion ist ein elementarer Baustein, der Verhalten simuliert. Er besitzt Ein- und Ausgabepins, die das Input und Output der Aktion definieren. Dies kann man sich am Beispiel der Aktion “Suppe kochen” veranschaulichen – Input für die Aktion sind beispielsweise Wasser, Gemüse und Brühe. Nach der Aktion ist das Output die Suppe.
- Aktivitäten: Eine Aktivität dient ebenfalls der Darstellung von Verhalten und modelliert einen dynamischen Ablauf, der aus mehreren Aktionen besteht und mehrere möglichen Pfade abbildet. Sie wird als Graph, dessen Knoten Aktionen und dessen Kanten Daten- und Kontrollflüsse sind, dargestellt.
- Interaktionen: Eine Interaktion dient der Darstellung von Verhalten, wenn mehrere Klassen oder Objekte an diesem Verhalten beteiligt sind – im Gegensatz zur Aktivität, die auch für eine einzelne Klasse modelliert werden kann. Insbesondere die Kommunikation oder das Versenden von Nachrichten steht daher im Vordergrund.
- Informationsflüsse: Informationenflüsse sind verhaltensbeschreibende Elemente, die in der UML 2 neu hinzugefügt wurden. Ihr Zweck ist es, denn Zusammenhang und die Interaktion von Elementen auf einer abstrakteren Ebene als Aktionen und Aktivitäten zu spezifizieren.
- Komponenten: Komponenten sind schlussendlich modulare Teile des modellierten Systems, deren innerer Aufbau nach außen abgegrenzt oder verborgen ist. Sie enthalten beispielsweise Klassen und Assoziationen. Eine Komponente kann von einer gleichwertigen Komponente ausgetauscht werden, obwohl der innere Aufbau abweicht.
UML Diagrammtypen
Jede Software hat einen Lebenszyklus bestehend aus Analyse, Design, Implementierung, Test, Betrieb und Wartung. Die UML findet Anwendung fast ausschließlich in der Analyse- und Designphase. Während in der Analysephase meist nur das Problem oder der Anwendungsfall genauer betrachtet wird, wird in der Designphase dann auf Basis der Ergebnisse dieser Analyse die Grundstruktur der Software entwickelt. Es ist allerdings nicht genau festgelegt, welches Diagramm wann genau verwendet werden soll, denn die Anwendungsfälle können von Projekt zu Projekt variieren. An dieser Stelle soll daher kurz eine Übersicht über die wichtigsten UML-Diagramme gegeben werden.
Auswahl Verhaltensdiagramme
Insgesamt definiert die UML als Verhaltensdiagramme das Aktivitätsdiagramm, Anwendungsfalldiagramm, Interaktionsübersichtsdiagramm, Kommunikationsdiagramm, Sequenzdiagramm, Zeitverlaufsdiagramm und Zustandsdiagramm.
- Anwendungsfalldiagramm (Use Case Diagram): Das Anwendungsfalldiagramm ist ein Verhaltensdiagramm der Analysephase, das bestimmte Anwendungsfälle, sogenannte Use Cases, für verschiedene Akteure, also Personen, die mit dem System interagieren, darstellt. Ein Diagramm beschreibt das durch einen externen Beobachter wahrgenommene Verhalten des Systems unter bestimmten Anforderungen und während der Interaktion.
- Aktivitätsdiagramm (Activity Diagram): Aktivitätsdiagramme gehören ebenfalls zu den Verhaltensdiagrammen, werden aber im Gegensatz zu Anwendungsfalldiagrammen sowohl in der Analyse- als auch der Designphase verwendet. Das Aktivitätsdiagramm modelliert den Ablauf eines Anwendungsfalles, in dem die einzelnen Aktivitäten, die in einem System auftreten können, in eine Reihenfolge gebracht werden. Dazu werden die elementaren Aktionen mit Kontroll- und Datenflüssen verbunden. Mit einem Aktivitätsdiagramm können mehrere, unterschiedliche Abläufe abgedeckt werden.
- Kommunikationsdiagramm (Communication Diagram): Kommunikationsdiagramme wurden früher auch als Kollaborationsdiagramm bezeichnet. Sie dienen dazu, den Nachrichtenversand bzw. andere Arten der Kommunikation zwischen mehreren Klassen oder Objekten darzustellen. Mit Hilfe von Sequenzausdrücken ist es möglich, die einzelnen Nachrichten in eine Reihenfolge zu bringen und auch die Parallelität von Nachrichten abzubilden.
- Sequenzdiagramm (Sequence Diagram): Sequenzdiagramme gehören zur Designphase. Mit ihnen wird der zeitliche Ablauf der Kommunikation zwischen verschiedenen Objekten anhand der konkreten Benennung von Methodenaufrufen dargestellt. Jedes Objekt besitzt eine Lebenslinie, an denen die Pfeile, die die Nachrichten darstellen, verbunden werden. Das Modell enthält durch die Lebenslinien auch den Zeitpunkt der Neuerstellung bzw. der Zerstörung der Objekte. Jedes Sequenzdiagramm stellt einen möglichen Ablauf dar, wobei es Fragmente für alternative oder optionale Teilschritte gibt. Sollen mehrere Pfade dargestellt werden, ist es für die Übersichtlichkeit oft trotzdem besser, mehrere Sequenzdiagramme zu erstellen.
- Zustandsdiagramm (State Diagram): Ein Zustandsdiagramm stellt alle Zustände dar, die ein Objekt von der Erstellung bis zur Zerstörung annehmen kann und entspricht damit einem endlichen Automaten. Jeder Zustand wird gesondert dargestellt und mittels Pfeilen werden die Methoden und Zustandsübergänge verdeutlicht. Zudem wird ein Startzustand und einer oder mehrere Endzustände festgelegt.
Auswahl Strukturdiagramme
Zu den Strukturdiagrammen zählen das Klassendiagramm, Komponentendiagramm, Kompositionsstrukturdiagramm, Objektdiagramm, Paketdiagramm, Profildiagramm und das Einsatz- bzw. Verteilungsdiagramm.
- Klassendiagramm (Class Diagram): Das Klassendiagramm ist eines der wichtigsten und am häufigsten verwendeten UML-Diagramme und gehört zur Designphase. Es stellt das Domänenmodell dar und beinhaltet alle Komponenten, Klassen, Schnittstellen oder Pakete, die für das System bzw. die Domäne relevant sind. Für die Klassen werden zusätzlich Methoden und Felder festgelegt. Zudem werden Abhängigkeiten, Interaktionen und Assoziationen mit Multiplizitäten modelliert. Während der Modellierung kann entschieden werden, wie technisch das Modell sein soll. Grundsätzlich ist es beispielsweise erlaubt, abstrakte Klassen oder Modifizierer wie public und private zu verwenden. Mit der OCL können weitere Bedingungen hinzugefügt werden.
- Paketdiagramm (Package Diagram): Paketdiagramme gehören sowohl zur Analyse- als auch zur Designphase. Das modellierte System wird in für sich abgeschlossene Pakete, die weitere Pakete oder Unterteilungen beinhalten können, aufgeteilt. Die notwendigen Abhängigkeiten und Interaktionen werden ebenfalls modelliert.
- Komponentendiagramm (Component Diagram): Komponentendiagramme sind insbesondere während des Designs und der Planung von Interfaces notwendig. Einzelne Soft- und Hardwareteile werden gekapselt dargestellt und es wird eine klare, nach außen verfügbare Schnittstelle definiert. Zu einem vollständigen Modell gehört auch die Information, welche Interfaces miteinander interagieren oder von anderen Objekten benötigt werden. Zudem wird dargestellt, welche internen Komponenten die jeweilige Funktion des öffentlichen Interfaces implementieren.
- Einsatz- und Verteilungsdiagramm (Deployment Diagram): Ein Einsatz- und Verteilungsdiagramm stellt dar, wie das fertige System auf verschiedenen Rechnern oder in einem Netzwerk eingesetzt wird. Damit wird das Modell auf einer recht abstrakten Ebene des Systemdesigns verwendet. Einsatzdiagramme sind insbesondere für verteilte Systeme notwendig, bei denen eine Anwendung auf mehreren PCs eingesetzt wird, die gegebenenfalls miteinander interagieren müssen. Das Diagramm beinhaltet dann die verschiedenen Möglichkeiten zur Kommunikation und alle Stellen, an denen eine Zusammenarbeit zwischen mehrere Komponenten notwendig ist.
Fazit
Die Unified Modeling Language (UML) ist eine Modellierungssprache, die eine nicht-technische, gemeinsame Sprache zur Definition eines (Software)systems definiert. Dadurch wird die Übersichtlichkeit erhöht, die Dokumentation erleichtert und Designfehler können frühzeitig gefunden werden. Die UML wird hauptsächlich in der Analyse und Designphase eines Projektes verwendet und ist sowohl für die Projektplanung in Unternehmen als auch für private Projekte relevant.
In der UML 2 gibt es mittlerweile 14 Diagrammtypen, die sich in Verhaltens- und Strukturdiagramme einteilen lassen. Die wahrscheinlich wichtigsten Diagrammarten sind das Klassendiagramm, das den groben Aufbau und Zusammenhang aller Klassen des Systems mit Feldern und Methoden wiedergibt, oder das Sequenzdiagramm, das den Ablauf bestimmter Aktionen beschreibt.