# &UML; Grundlagen

## Über &UML;

Dieses Kapitel gibt einen kurzen Überblick über die &UML; Grundlagen. Man sollte sich aber bewusst sein, dass es keine vollständige &UML; Anleitung ist. Wenn man mehr über die Unified Modelling Language, oder allgemein über Software Analyse und Design, lernen will, dann sollte man eines der vielen zu diesem Thema publizierten Bücher lesen. Man kann natürlich die vielen Einführungen im Internet zum Thema als Ausgangspunkt wählen.

Die Unified Modelling Language (&UML;) ist eine Diagrammnotation zum spezifizieren, visualisieren und dokumentieren von Modellen objektorientierter Softwaresysteme. &UML; ist kein Vorgehensmodell, d.h. es sagt nichts über die einzelnen Schritte aus, die nötig sind, um ein System zu gestalten. Aber &UML; hilft ihnen ihr Design zu visualisieren und mit anderen zu kommunizieren. Der &UML; Standard wird von der Object Management Group (OMG) gepflegt und ist der Industriestandard zur Beschreibung von Softwaremodellen.

&UML; wurde für das objektorientierte Softwaredesign entwickelt und ist daher nur von begrenztem Nutzen bei anderen Programmierparadigmen.

&UML; setzt sich zusammen aus vielen Modellelementen, die für sich einen bestimmten Sachverhalt des Softwaresystems repräsentieren. Diese Elemente werden zu Diagrammen kombiniert, die einen Ausschnitt oder einen bestimmten Blickpunkt auf das System darstellen. Folgende Diagrammtypen werden von &umbrello; unterstützt:

- Anwendungsfalldiagramm , stellt Akteure (Menschen oder andere Nutzer des Systems), Anwendungsfälle (Szenario, wie die Akteure das System nutzen) und die Beziehungen dazwischen dar

- Klassendiagramm, stellt Klassen und ihre Beziehungen untereinander dar

- Sequenzdiagramm, stellt Objekte und ihre Beziehungen dar, wobei der Schwerpunkt auf dem chronologischen Nachrichtenaustausch zwischen den Objekten liegt

- Kollaborationsdiagramm , stellt Objekte und ihre Beziehungen dar, wobei der Schwerpunkt auf Objekten liegt, die am Nachrichtenaustausch beteiligt sind

- Zustandsdiagramm , stellt Zustände, Zustandsänderungen und Ereignisse in einem Objekt oder Teilsystem dar

- Aktivitätsdiagram , stellt die Aktivitäten, Zustände und Zustandsänderungen von Objekten und die Ereignisse in Teilsystemen dar

- Komponentendiagramm , stellt die höheren Programmierkomponenten (wie KParts und Java Beans) dar.

- Verteilungsdiagramm , stellt die Instanzen der Komponenten und ihre Beziehungen dar.

## &UML; Elemente

### Anwendungsfalldiagramm

Anwendungsfalldiagramme beschreiben die Beziehungen und Abhängigkeiten zwischen einer Gruppe von Anwendungsfällen und den teilnehmenden Akteuren in einem Prozess.

Dabei ist zu beachten, dass ein Anwendungsfalldiagramm nicht das Systemdesign wiederspiegelt und damit keine Aussage über die Systeminterna trifft. Anwendungsfalldiagramme werden zur Vereinfachung der Kommunikation zwischen Entwickler und zukünftigen Nutzer bzw. Kunde erstellt. Sie sind vorallem bei der Festlegung der benötigten Kriterien des zukünftigen Systems hilfreich. Somit treffen Anwendungsfalldiagramme eine Aussage, was zu tun ist, aber nicht wie wie das erreicht wird.

ein beispielhaftes Anwendungsfalldiagramm. &umbrello; bei der Darstellung eines Anwendungfalldiagrammes

&umbrello; bei der Darstellung eines Anwendungfalldiagrammes

#### Anwendungsfall

Ein Anwendungsfall beschreibt, aus der Sicht des Akteur, eine Reihe von Aktivitäten im System, die ein konkret fassbares Ergebnis liefern.

Anwendungsfälle dienen als Beschreibung von typischen Interaktionen zwischen Nutzer und dem System. Sie stellen die externe Schnittstelle dar und spezifizieren damit die Anforderungen, was das System zu tun hat (nur das was, aber nicht das wie!).

Bei der Arbeit mit Anwendungsfällen, sollte man folgende einfache Regeln beachten:

- jeder Anwendungsfall ist mindestens mit einem Akteur verbunden

- jeder Anwendungsfall hat einen Auslöser (also einen Akteur)

- jeder Anwendungsfall führt zu einem relevanten Ergebnis (messbar und wirtschaftlich relevant)

Anwendungsfälle können untereinander in Verbindung stehen. Die 3 gebräuchlichsten Beziehungen zwischen Anwendungsfällen sind:

- <<include>>, wodurch ausgesagt wird, dass ein Anwendungsfall in einem anderen Anwendungsfall stattfindet.

- <<extends>>, wodurch ausgesagt wird, dass in einer bestimmten Situation (oder einem bestimmten Erweiterungspunkt) der Anwendungsfall durch einen anderen erweitert wird.

- Verallgemeinerung, wodurch ausgesagt wird, dass ein Anwendungsfall die Eigenschaften eines Superanwendungsfall (übergeordneten) erbt und diese überschreiben oder erweitern kann, ganz ähnlich wie bei der Vererbung zwischen Klassen.

#### Akteur

Ein Akteur ist ein externes Objekt (außerhalb des Systems), welches mit dem System durch die Teilnahme und Auslösung von Anwendungsfällen in Kontakt tritt. Akteure können echte Menschen (z.B. der Nutzer des Systems), Computersysteme oder externe Ereignisse sein.

Akteure stellen somit nicht die physische Person oder System dar, sondern vielmehr die Rollen dieser Objekte. Steht eine physische Person auf verschiedenen Wegen (z.B. durch verschiedene Rollen) mit dem System in Kontakt, dann wird sie durch verschiedene Akteure dargestellt. So würde eine Person, die im Kundensupport genauso wie in der Auftragsannahme tätig ist, einmal als Akteur Supportmitarbeiter und einmal als Akteur Vertriebsmitarbeiter dargestellt werden.

#### Anwendungsfallbeschreibung

Eine Anwendungsfallbeschreibung legt in Textform den Anwendungsfall dar. Normalerweise werden dazu Notizen oder sonstwie mit dem Anwendungsfall verlinkte Dokumente dargestellt und beschreiben die Prozesse oder Aktivitäten, die im Anwendungfall stattfinden.

### Klassendiagramm

Klassendiagramme zeigen die verschiedenen Klassen, aus denen das System besteht, und wie diese untereinander in Abhängigkeit stehen. Die Klassendiagramme werden als statisch bezeichnet, da sie lediglich die Klassen mit ihren Methoden und Attributen sowie die statischen Verbindungen zwischen ihnen darstellen. Dabei wird gezeigt, welche Klassen von anderen Klassen etwas wissen und welche Klassen ein Teil von anderen Klassen sind. Es wird aber nicht der Nachrichtenaustausch (Methodenaufrufe) zwischen den Klassen dargestellt.

ein beispielhaftes Klassendiagramm &umbrello; bei der Darstellung eines Klassendiagrammes

&umbrello; bei der Darstellung eines Klassendiagrammes

#### Klasse

Eine Klasse definiert die Attribute und Methoden einer Menge von Objekten. Alle Objekte dieser Klasse (die Instanzen) haben das gleiche Verhalten und die selben Attribute (aber mit unterschiedlichen Werten). Der Begriff Typ wird manchmal synonym für Klasse verwendet, aber es muss beachtet werden, dass Typ allgemeiner ist und daher die beiden Begriffe nicht identisch in ihrer Bedeutung sind.

In der &UML; werden Klassen als Rechtecke mit dem Klassennamen dargestellt. Sie können die Attribute und Operationen der Klasse in 2 extra abgetrennten Bereichen innerhalb des Rechteck enthalten.

eine Klasse in der &UML; visuelle Darstellung einer Klasse in der &UML;

visuelle Darstellung einer Klasse in der &UML;

##### Attribut

In der &UML; werden Attribute mindestens mit ihrem Namen dargestellt, es können aber noch der Typ, der Anfangswert und weitere Eigenschaften mit angezeigt werden. So kann man z.B. die Sichtbarkeit von Attributen mit darstellen:

- `+`, steht für public (öffentliche) Attribute

- `#`, steht für protected (geschützte) Attribute

- `-`, steht für private Attribute

##### Operation

Operationen (Methoden) müssen ebenfalls mindestens mit ihrem Namen dargestellt werden und können weiterhin die Parameter und die Rückgabewerte in der Darstellung enthalten. Wie bei Attributen, ist die Sichtbarkeit ebenfalls darstellbar:

- `+`, steht für public (öffentliche) Operationen

- `#`, steht für protected (geschützte) Operationen

- `-`, steht für private Operationen

##### Klassen-Templates

Klassen können als Klassen-Templates genutzt werden um zu zeigen, dass es sich um eine unspezifizierte Klasse oder Typ handelt. Der Klassentyp wird während der Instanzbildung (also Objekt wird angelegt) bestimmt. Template-Klassen gibt es in modernen Sprachen wie C++ und ab Java 1.5, wo sie Generics genannt werden.

#### Klassenassoziation

Klassen können sich auf unterschiedlichen Wegen aufeinander beziehen (assoziieren):

##### Verallgemeinerung

Die Vererbung ist ein Basiskonzept der objektorientierten Programmierung. Ein Klasse erhält dabei alle Attribute und Operationen der Klasse, von der sie abgeleitet wird. Die Klasse kann diese Operationen/Attribute überschreiben und ändern, sowie neue hinzufügen.

In der &UML; wird durch die Assoziation Verallgemeinerung zwischen 2 Klassen eine Hierarchie aufgebaut, die das Konzept von abgeleiteter Klasse und Basisklasse verkörpert. Die Verallgemeinerung zwischen 2 Klassen wird in der &UML; durch eine Linie zwischen den 2 Klassen dargestellt, wobei sich ein Pfeil auf der Seite der Basisklasse befindet. Verallgemeinerung visuelle Darstellung der Verallgemeinerung in &UML;

visuelle Darstellung der Verallgemeinerung in &UML;

##### Assoziation

Eine Assoziation stellt den Zusammenhang zwischen Klassen dar und beschreibt damit die allgemeine Bedeutung und Struktur verschiedenster Typen von Verbindungen zwischen Objekten.

Assoziationen sind der Mechanismus, der es den Objekten erlaubt untereinander zu kommunizieren. Sie beschreiben die Verbindungen zwischen verschiedenen Klassen (die Verbindung zwischen den eigentlichen Objekten werden als Objektverbindungen oder als Link bezeichnet).

Assoziationen können Rollen haben, die den Zweck der Verbindung beschreiben und entweder uni- oder bidirektional sind (ob die Verbindung zwischen den Objekten ein- oder zweiseitig ist). Beide Enden einer Assoziation verfügen über einen Multiplizitätswert, der angibt, wieviele Objekte auf der einen Seite mit wieviel Objekten auf der anderen Seite verbunden sein können.

In der &UML; wird die Assoziation durch eine Linie zwischen den in der Beziehung teilnehmenden Klassen dargestellt. Dabei kann die Rolle und die Multiplizität ebenfalls angezeigt werden. Multiplizität wird als Bereich [min..max] von nicht negativen Werten dargestellt, wobei der Stern (`*`) auf der Maximumseite einen unendlichen Wert repräsentiert. &UML; Assoziation visuelle Darstellung einer &UML; Assoziation

visuelle Darstellung einer &UML; Assoziation

##### Aggregation

Aggregationen sind eine Spezialart von Assoziationen. Dabei haben die verbundenen Klassen nicht den gleichen Status, sondern es wird eine Teil eines Ganzes Beziehung dargestellt. Ein Aggregation beschreibt, wie die Klasse, die die Rolle des Ganzen vertritt, sich aus anderen Klassen, die die Rollen des Teil innehaben, zusammensetzt. Bei Aggregationen hat die Klasse mit der Rolle des Ganzen immer eine Multiplizität von 1.

In der &UML; werden Aggregationen durch Assoziationen dargestellt, wobei auf der Seite des Ganzen ein Rhombus ist. Aggregation visuelle Darstellung einer Aggregationsbeziehung in der &UML;

visuelle Darstellung einer Aggregationsbeziehung in der &UML;

##### Komposition

Kompositionen sind Assoziationen, die eine sehr starke Aggregation darstellen. Das bedeutet, dass Kompositionen ebenfalls eine Teil eines Ganzen Beziehung darstellen, wobei die Beziehung aber so stark ist, dass die Teile nicht allein existieren können. Sie bestehen nur innerhalb des Ganzen und werden zerstört, wenn das Ganze zerstört wird.

In der &UML; werden Kompositionen durch ein ausgefülltes Rhombus auf der Seite des Ganzen dargestellt.

Komposition visuelle Darstellung einer Kompositionsbeziehung in der &UML;

#### Andere Klassendiagramm Elemente

Neben Klassen können weitere Elemente in einem Klassendiagramm dargestellt werden.

##### Schnittstelle

Schnittstellen (Interfaces) sind abstrakte Klassen. Das bedeutet, von der Klasse können keine Instanzen direkt gebildet werden. Schnittstellen können Operationen aber keine Attribute beinhalten. Klassen können durch eine Realisierungsassoziation von Schnittstellen abgeleitet werden und von der Klasse können dann Instanzen gebildet werden.

##### Datentypen

Datentypen sind Primitive, die normalerweise in den Programmiersprachen verfügbar sind wie Integer und Boolean. Sie können keine Beziehung zu Klassen haben, aber Klassen zu ihnen.

##### Aufzählungen

Aufzählungen sind eine einfache Liste von Werten. Ein typisches Beispiel für eine Aufzählung sind die Wochentage. Die einzelnen Einträge in der Aufzählung werden als Aufzählungswert bezeichnet. Wie Datentypen können sie keine Beziehung zu Klassen haben, aber Klassen können Beziehungen zu ihnen haben.

##### Pakete

Pakete stehen für Namensräume (Namespace) in Programmiersprachen. In einem Diagramm stehen sie stellvertretend für Teilsysteme, die aus mehr als einer Klasse, manchmal hunderte, bestehen können.

### Sequenzdiagramm

Sequenzdiagramme zeigen den Nachrichtenaustausch (also Methodenaufruf) zwischen Objekten in einem spezifischen Zeitrahmen. Dabei wird besondere Betonung auf die Reihenfolge und die Zeiten gelegt, in denen die Nachrichten an die Objekte gesendet werden.

Im Sequenzdiagramm wird das Objekt durch eine vertikal verlaufende gestrichelte Linie gekennzeichnet. Der Objektname befindet sich am oberen Ende. Die Zeitachse verläuft ebenfalls vertikal, wobei sie sich nach unten hin erhöht. Nachrichten zwischen den Objekten werden als Pfeile mit den Operationen- und Parameternamen gekennzeichnet.

Sequenzdiagramm
&umbrello; bei der Darstellung eines Sequenzdiagrammes

&umbrello; bei der Darstellung eines Sequenzdiagrammes

Nachrichten können synchron oder asynchron sein. Bei synchronen Nachrichten erfolgt ein normaler Nachrichtenaufruf und die Kontrolle wird an das gerufene Objekt übergeben. Asynchrone Aufrufe geben sofort die Kontrolle an das rufende Objekt zurück. Synchrone Nachrichten haben eine vertikale Box auf der Seite des gerufenen Objektes um den Programmverlauf darzustellen.

### Kollaborationsdiagramm

Kollaborationsdiagramme zeigen die Interaktionen zwischen Objekten, die an einer spezifischen Situation teilnehmen. Dies entspricht im Wesentlichen den Informationen aus dem Sequenzdiagramm, wobei bei diesen der Schwerpunkt auf dem zeitlichen Auftreten liegt. Bei Kollaborationsdiagramm wird hingegen vordergründig die Verbindung zwischen Objekten und ihrer Topologie gelegt.

Die Nachrichten zwischen den Objekten werden in Kollaborationsdiagrammen durch Pfeile dargestellt, an denen Name, Parameter und die Nachrichtensequenz steht. Die Kollaborationsdiagramme sind hervorragend dafür geeignet eine spezielle Programmabfolge oder Situation zu zeigen. Man kann damit sehr leicht und schnell einen Teil der Programmlogik demonstrieren und erklären.

Kollaboration
&umbrello; bei der Darstellung einnes Kollaborationdiagrammes

&umbrello; bei der Darstellung einnes Kollaborationdiagrammes

### Zustandsdiagramm

Zustandsdiagramme zeigen Objekte in ihren verschiedenen Zuständen während ihres Lebens und sie zeigen die Einflüsse, die die Objekte in einen anderen Zustand bringen.

Zustandsdiagramme betrachten Objekte als Zustandsmaschinen oder endliche Automaten, die in einer endlichen Anzahl von Zuständen sein können und die ihren Zustand durch eine endliche Anzahl von Einflüssen verändern. So kann sich zum Beispiel das Objekt NetServer während seines Lebens in folgenden Zuständen befinden:

- bereit

- wartend

- arbeitend

- angehalten

und die Ereignisse, die eine Zustandsänderung des Objektes auslösen, könnten sein:

- Objekt ist angelegt

- Objekt erhält Nachricht zu warten

- ein Client fordert eine Verbindung über ein Netzwerk an

- ein Client beendet eine Anforderung

- eine Anforderung wird bearbeitet und beendet

- Objekt empfängt Nachricht anhalten

- &etc;

Zustandsdiagramm Umbrello bei der Darstellung eines Zustanddiagrammes

Umbrello bei der Darstellung eines Zustanddiagrammes

#### Zustand

Zustände sind die Bausteine des Zustandsdiagrammes. Ein Zustand gehört zu genau einer Klasse und steht für eine bestimmte Konstellation der Attributwerte dieser Klasse. Somit beschreibt ein Zustand in der &UML; den internen Zustand eines Objektes einer bestimmten Klasse.

Wichtig ist dabei, dass nicht jede Attributveränderung im Objekt zu einem neuen Zustand führen soll, sondern lediglich Attributwerte mit spürbaren Auswirkungen als Zustand des Objektes zu vermerken sind.

2 besondere Zustände sind Start und Ende. So kann es kein Ereignis geben, dass ein Objekt in seinen Startzustand zurückversetzt und kein Ereignis kann ein Objekt in einen anderen Zustand versetzen, wenn dieses bereits seinen Endzustand erreicht hat.

### Aktivitätsdiagramm

Aktivitätsdiagramme beschreiben die Abfolge von Aktivitäten in einem System. Sie sind dabei eine spezielle Form der Zustandsdiagramme, indem sie fast ausschließlich Aktivitäten beinhalten.

ein beispielhaftes Aktivitätsdiagramm &umbrello; bei der Darstellung eines Aktivitätdiagrammes

&umbrello; bei der Darstellung eines Aktivitätdiagrammes

Aktivitätsdiagramme sind den prozeduralen Flussdiagrammen sehr ähnlich. Der Unterschied ist, dass Aktivitäten klar an Objekte gekoppelt sind.

Aktivitätsdiagramme gehören immer eindeutig zu Klassen, Operationen oder Anwendungsfällen.

In Aktivitätsdiagrammen können sowohl sequenzielle wie auch parallele Aktivitäten dargestellt werden. Parallele Bearbeitung wird mittels der Fork/Wait Symbole umgesetzt. Für parallel laufende Aktivitäten ist es dabei unerheblich, in welcher Reihenfolge sie ablaufen. Sie können zum gleichen Zeitpunkt aber auch nacheinander ausgeführt werden.

#### Aktivität

Eine Aktivität ist ein einzelner Schritt in einem Prozess. Somit ist eine Aktivität ein Zustand des Systems mit einer internen Aktivität und mindestens einem Übergang. Es sind allerdings mehrere Übergänge möglich, wenn die Aktivität unterschiedliche Bedingungen enthält.

Aktivitäten können eine Hierarchie bilden, indem man eine Aktivität aus anderen zusammensetzen kann. Dabei müssen die eingehenden und ausgehenden Übergänge mit den entsprechenden Übergängen in der Verfeinerung übereinstimmen.

### Hilfselemente

In der &UML; sind einige Elemente, die keine semantische Bedeutung für das Modell haben, aber Diagramme verständlicher machen können. Die Elemente sind:

- Textzeile

- Textnotiz und entsprechende Verbindung

- Rahmen

Mit der Textzeile kann eine Kurzinformation in das Diagramm eingefügt werden. Der Text ist freistehend und hat keine Bedeutung für das Modell.

Mittels der Textnotiz können detailierte Informationen über ein Objekt oder eine Situation eingefügt werden. Der große Vorteil der Textnotiz ist, dass sie mit einem &UML; Element verbunden werden kann und somit die Notiz zu diesem speziellen Objekt oder der speziellen Situation gehört.

Rahmen sind frei schwebende Rechtecke, die zur visuellen Gruppierung von Objekten in Diagrammen genutzt werden können. Sie machen ein Diagramm besser lesbar, haben aber keine logische Bedeutung für das Modell.

### Komponentendiagramm

Komponentendiagramme stellen die Software Komponenten (entweder Komponententechnologien wie KParts, CORBA Komponenten oder Java Beans oder klar abgrenzbare Systemeinheiten) dar und die Resultate wie Quelltextdateien, Programmbibliotheken oder relationale Datenbanktabellen.

Komponenten können Schnittstellen (also abstrakte Klasse mit Operationen) enthalten, mit denen Verbindungen zwischen Komponenten möglich werden.

### Verteilungsdiagramm

Verteilungsdiagramme zeigen die Laufzeitobjekte der Komponenten und ihre Beziehungen. Sie beinhalten Knoten als physische Ressourcen, typischerweise ein Computer. Weiterhin zeigen sie Schnittstellen und Objekte (Klasseninstanzen).