JGU Logo JGU Logo JGU Logo JGU Logo

Institut für Informatik

Michael Wand
David Hartmann
Sommersemester 2020DIGITAL

Blatt 07

Einführung in die Softwareentwicklung



Anlage UML-Klassendiagramme

Letzte Änderung: 01. June 2020, 14:09 Uhr
Ansicht:   |  


Was sind UML-Diagramme?

„Die Unified Modeling Language (vereinheitlichte Modellierungssprache), kurz UML, ist eine grafische Modellierungssprache zur Spezifikation, Konstruktion und Dokumentation von Software-Teilen und anderen Systemen.“ (Quelle: Wikipedia)


Sie bieten uns eine Visualisierung der abstrakten Strukturen und/oder des Verhaltens von Software im Allgemeinen, indem Sie eine genaue Semantik und Syntax definiert. UML fokusiert dabei häufig objekt-orientierte Entwürfe (und eignet sich daher für unser Setting). Auf diesem Blatt wollen uns den am häufigsten verwendeten Diagrammtyp der UML-Spezifikation anschauen: Klassendiagramme.


Klassendiagramme

Ein Klassendiagramm modelliert die statische Beziehung von Klassen und Schnittstellen, sozusagen das Bild, das der Compiler vom Code hat wenn er nur die Deklarationen kennt.


Beispiel:
Für die in den letzten Vorlesungen bereits verwendete Beispiel („Person, Angestellte, Managerin“) würde das zugehörige UML-Klassendiagramm folgendermaßen aussehen:

\umlclass{Person}{
name : string
}{
+ toString() : string
}

\umlclass[y=-3]{Angestellte}{
gehalt : int 
abteilung : string
}{
+ berechneGehalt() : int 
+ arbeiteMonate(anz : int) : void
}

\umlclass[y=-6]{Managerin}{
bonus : double
}{
+ berechneGehalt() : int
}

\umlinherit{Angestellte}{Person}
\umlinherit{Managerin}{Angestellte}

Syntax

Die Syntax einer Klasse ist wie folgt aufgebaut: In der ersten Zeile einer Klasse steht dabei der Klassenname, in der zweiten Zeile werden die Attribute untereinander aufgelistet, und in der dritten die Methoden. Die Syntax der Auflistungen, name : string, ist stets gleich aufgebaut; erst wird der Name genannt, dann, durch ein Doppelpunkt getrennt, der Typ (bei Attributen) bzw. der Rückgabetype (bei Methoden). Bei Übergabeparameter verhält es sich gleich. Die Sichtbarkeiten der Auflistungsobjekte kann hierbei (optional) durch ein „+“ (public), „#“ (protected) oder „-“ (private) gekennzeichnet werden.

Beziehungen zwischen Klassen

Neben der oben verwendeten Vererbungsbeziehung gibt es auch noch weitere. Die auf die wir uns Konzentrieren werden sind die folgenden:


Vererbung/Generalisierung
Die Generalisierung zeigt an inwiefern eine Klasse eine Spezialisierung einer andern Klasse ist. (Der Pfeil zeigt dabei auf die Oberklasse.)


\umlclass{A1}{}{}
\umlclass[x=3]{A2}{}{}
\umlinherit{A2}{A1}


Assoziation
Die Assoziation ist die allgemeinste und auch schwächste Form der Beziehung und beschreibt welche Objekte zu einander in Beziehung stehen. Diese können sich Beispielsweise per Referenz/Pointer kennen. (Der Peif zeigt dabei auf die Klasse, die Referenziert wird.)


\umlclass{Bestellung}{}{}
\umlclass[x=3]{Adresse}{}{}
\umluniassoc{Adresse}{Bestellung}


Aggregation
Die Aggregation beschreibt die Beziehung eines „Ganzen“ zu seinen „Teilen. Die Aggregation ist damit selbst eine Assoziation, bei der das referenzierte Objekt teil des „Ganzen“ ist. Die Bestandteile müssen dabei nicht für alle Objekte vorhanden sein. (Siehe Multiplizitäten weiter unten). (Der Peif zeigt dabei auf die Klasse, die Referenziert wird.)


\umlclass{Vorlesung}{}{}
\umlclass[x=3]{Student}{}{}
\umlaggreg{Vorlesung}{Student}


Komposition
Die Komposition ist ein Spezialfall der Aggregation und zeigt and, dass die „Teile“ nicht ohne das „Ganze“ existieren können. Die Bestandteile müssen dabei vorhanden sein. (Der Peif zeigt dabei auf die Klasse, die Referenziert wird.)


\umlclass{Gebaeude}{}{}
\umlclass[x=3]{Raum}{}{}
\umlcompo{Gebaeude}{Raum}

Multiplizitäten und Rollenbezeichnungen

Multiplizitäten können an den Enden der Assoziationen angegeben werden, um zu kennzeichnen wieviele Objekte dem jeweils anderen bekannt sind. Die Syntax dafür ist die folgende:


Zusätzlich können die Namen unter denen die jeweiligen Klassen untereinander bekannt sind, angegeben werden. Die Sichtbarkeiten „+“,„#“, „-“ können auch hier vor den Namen angegeben werden.


\umlclass{Abteilung}{}{}
\umlclass[x=7]{Angestellte}{}{}
\umluniassoc[%
arg2=arbeitsplatz,mult2=1,%
arg1=mitglied,mult1=1..*%
]{Angestellte}{Abteilung}

\umlclass[y=-2]{Personenliste}{}{}
\umlclass[y=-2,x=7]{Person}{}{}
\umlaggreg[%
mult2=0..*,%
arg2=listItems,mult1=1%
]{Personenliste}{Person}

Interfaces und Abstrakte Klassen

Interfaces und Abstrakte Klassen können ebenfalls gekennzeichnet werden. Abstrakte Klassen sind hierbei solche, von denen keine Instanz angelegt werden kann (daher ist abstrakt in UML als Eigenschaft definiert, befindet sich unter dem Namen). Interfaces / Schnittstellen hingegen sind „Schablonen“ für Klassen mit vordefinierten Methoden (daher wird das Schlüsselwort „interface“ in UML häufig als Typ über dem Klassennamen). Der Unterschied zwischen Interfaces und Abstrakten Klassen sind jedoch in vielen Sprachen, insbesondere in C++, eher homöopathisch. Generell besteht der Unterschied darin, dass Abstrakte Klassen bereits Teile implementieren können, während Interfaces explizit nur Methodenköpfe beinhaltet. Im Falle von Interfaces sieht man häufig in UML Spezifikationen eine spezialisierte „gestrichelte“ Vererbung, als Kennzeichnung, dass ein Interface implementiert wird und keine vollwertige Klasse ist.


\umlclass[type=interface]{GUI}{}{+ draw() : void}

\umlclass[tags=abstract, y=-3]{GenericWindow}{}{}

\umlimpl{GenericWindow}{GUI}