Einführung

Ich glaube, jeder hat schon einmal das Sprichwort „Zweimal messen, einmal schneiden“ gehört. Dieser Ratschlag gilt auch beim Programmieren. Es ist immer besser, über die Implementierung nachzudenken, bevor man sich daran macht, sie umzusetzen. Während der Implementierung musst du oft Klassen erstellen und dir überlegen, wie sie interagieren werden. Eine visuelle Darstellung kann dir dabei helfen, die richtige Lösung zu finden. Hier kommt uns die UML zu Hilfe.

Was ist die UML? Was ist ein UML-Diagramm?

Was bringt ein UML-Diagramm für Java? Wenn du dir einmal die Ergebnisse einer Bildersuche in einer Suchmaschine ansiehst, wirst du feststellen, dass die UML etwas mit Diagrammen, Pfeilen und Quadraten zu tun hat. UML steht für Unified Modeling Language. Unified (dt. vereinheitlicht) ist hier das wichtige Wort. Das bedeutet, dass unsere Bilder nicht nur von uns, sondern auch von jedem anderen, der sich mit der UML auskennt, verstanden werden. Es ist die Lingua franca für das Zeichnen von Diagrammen. Wikipedia hat dazu folgendes zu sagen:
„Die UML ist eine grafische Modellierungssprache zur Spezifikation, Konstruktion, Dokumentation und Visualisierung von Software-Teilen und anderen Systemen.“
Besonders interessant ist – und das würde nicht jeder vermuten –, dass die UML Spezifikationen besitzt. Und es gibt sogar eine UML 2-Spezifikation. Weitere Informationen über die Spezifikation findest du auf der Website der Object Management Group. Tatsächlich entwickelt diese Gruppe die UML-Spezifikationen. Interessant ist auch, dass sich die UML nicht darauf beschränkt, nur die Struktur von Klassen zu beschreiben. Es gibt zahlreiche Arten von UML-Diagrammen, z. B. das UML-Klassendiagramm, das UML-Objektdiagramm usw. In der Wikipedia findest du eine kurze Beschreibung verschiedener Arten von UML-Diagrammen: UML-Diagramme. Nicht nur ein Beispiel für ein UML-Klassendiagramm findest du in dem Buch Entwurfsmuster von Kopf bis Fuß, in dem UML-Diagramme zur Veranschaulichung von Entwurfsmustern verwendet werden. Insgesamt lässt sich sagen, dass die UML auch im realen Leben verwendet wird. Und es zeigt sich, dass es ziemlich hilfreich ist, sie zu kennen und zu verstehen, wie man sie benutzt.

Anwendung

Sehen wir uns an, wie man mit der UML in einer IDE arbeiten kann. Wir werden IntelliJ IDEA als unsere IDE verwenden. Wenn du IntelliJ IDEA Ultimate verwendest, dann ist das „UML Support“-Plugin schon standardmäßig installiert. Damit kannst du automatisch schöne Klassendiagramme erstellen. Verwende zum Beispiel Strg+N oder den Menüpunkt „Navigieren“ -> „Klasse“, um zur Klasse ArrayList zu gelangen. Wähle nun im Kontextmenü des Klassennamens die Option „Diagramm“ -> „Diagramm-Popup anzeigen“. Als Ergebnis erhalten wir ein schönes Diagramm. UML Klassendiagramm: Von der Theorie zur Praxis - 2Doch was, wenn du das Diagramm selbst zeichnen willst? Und was, wenn du nicht die Ultimate-Version besitzt? Bei der IntelliJ IDEA Community Edition haben wir keine andere Wahl. Wir müssen also verstehen, wie ein UML-Diagramm aufgebaut ist. Zuerst müssen wir Graphviz installieren. Dabei handelt sich um ein paar Werkzeuge zur Visualisierung von Diagrammen. Das Plugin, das wir verwenden werden, benötigt diese. Nach der Installation musst du das bin-Verzeichnis aus dem Graphviz-Installationsverzeichnis zur PATHUmgebungsvariable hinzufügen. Danach wählst du in IntelliJ IDEA im Menü die Option Datei -> Einstellungen. Wähle dann im Fenster „Einstellungen“ die Kategorie „Plugins“, klicke auf die Schaltfläche „Repositorys durchsuchen“ und installiere das PlantUML Integration-Plugin. Was ist so gut an PlantUML? Es beschreibt UML mit einer grafischen Beschreibungssprache namens „dot“, was es universeller macht, da die dot-Sprache nicht nur von PlantUML verwendet wird. Darüber hinaus kann alles, was wir gleich tun werden, nicht nur in einer IDE, sondern auch online unter planttext.com erledigt werden. Nach der Installation des PlantUML-Plugins können wir UML-Diagramme über „Datei“ -> „Neu“ erstellen. Erstellen wir mal ein UML-Klassendiagramm. Dadurch wird automatisch eine Vorlage mit einem Beispiel generiert. Wir werden den Inhalt löschen und unseren eigenen einfügen Um zu verstehen, wie dies im Text dargestellt werden kann, wirf einen Blick in das PlantUML-Handbuch: plantuml class-diagram. UML Klassendiagramm: Von der Theorie zur Praxis - 3Wir nehmen das als Grundlage und beginnen mit der Erstellung unseres UML-Diagramms. Füge den folgenden Inhalt hinzu, der zwei Klassen beschreibt:

@startuml
class ArrayList {
}
class LinkedList {
}
@enduml
Um das Ergebnis in IDEA zu sehen, wähle die Option „Ansicht“ -> „Werkzeugfenster“ -> „PlantUML“. Wir erhalten einfach zwei Quadrate, die Klassen repräsentieren. Wir wissen, dass diese beiden Klassen das List-Interface implementieren. Diese Klassenbeziehung wird Realisierung genannt. Diese Beziehung wird durch einen Pfeil mit einer gepunkteten Linie dargestellt. Zeichnen wir das auch:

interface List
List <|.. ArrayList
List <|.. LinkedList
List ist eines der Kinder der Klasse Collection. Das heißt, sie erbt Collection. Diese Beziehung wird Generalisierung genannt. Sie sieht aus wie ein Pfeil mit einer gewöhnlichen durchgehenden Linie. Zeichnen wir das auch:

interface Collection
Collection <|-- List
Für den nächsten Beziehungstyp füge der ArrayList-Klassenbeschreibung einen Eintrag über ein package private-Array von Elementen hinzu:

~Object[] elementData
Nun wollen wir zeigen, dass ArrayList einige Objekte enthält. In diesem Fall wird es eine Aggregationsbeziehung geben. ArrayList ist ein Aggregat, da es andere Objekte enthält. Wir sagen Aggregation, weil die Objekte der Liste auch ohne die Liste existieren können: Sie sind nicht integraler Bestandteil der Liste. Ihre Lebensdauer ist nicht an die Lebensdauer der Liste gebunden. Das Wort „Aggregat“ kommt aus dem Lateinischen und bedeutet übersetzt „zusammengesetzt“, d. h. etwas, das aus etwas besteht. Im realen Leben haben wir zum Beispiel eine Pumpenbaugruppe (Aggregat), die aus einer Pumpe und einem Motor besteht. Die Baugruppe selbst kann in einzelne Bauteile – wie eben Pumpe und Motor – zerlegt werden. Zum Beispiel, um sie zu verkaufen oder in eine andere Baugruppe zu stecken. Bei einer Liste ist das genauso. Das wird mit einer leeren Raute am Aggregat und einer durchgehenden Linie ausgedrückt. Wir werden dies wie folgt darstellen:

class Object{
}
ArrayList o- Object
Nun wollen wir zeigen, dass die Klasse LinkedList im Gegensatz zur ArrayList-Klasse Knotenenthält – Container, die auf die gespeicherten Daten verweisen. In diesem Fall sind die Knoten Teil von LinkedList und haben keine eigenständige Existenz. Ein Knoten ist nicht der Inhalt selbst. Er enthält lediglich einen Verweis auf den Inhalt. Wenn wir beispielsweise eine Zeichenkette zu einer LinkedList hinzufügen, fügen wir einen neuen Knoten ein, der einen Verweis auf die Zeichenkette sowie einen Link zum vorherigen und nächsten Knoten enthält. Diese Beziehung wird Komposition genannt. Sie wird dargestellt, indem eine durchgehende Linie mit einer gefüllten Raute auf das Komposit (etwas aus Bestandteilen bestehendes) gezeichnet wird. Nun werden wir die Beziehung als Text darstellen:

class Node{
}
LinkedList *-- Node
Jetzt müssen wir uns ansehen, wie man eine weitere wichtige Art von Beziehung darstellen kann: die Abhängigkeit. Sie wird verwendet, wenn eine Klasse eine andere verwendet, die Klasse diese verwendete Klasse jedoch weder enthält noch erbt. LinkedList und ArrayList wissen zum Beispiel, wie man ein ListIterator erstellt. Wir stellen dies als Pfeile mit einer gepunkteten Linie dar:

class ListIterator
ListIterator <... ArrayList : create
ListIterator <... LinkedList : create
Nachdem wir all das erledigt haben, erhalten wir das: UML Klassendiagramm: Von der Theorie zur Praxis - 4Du kannst so viele Details wie nötig hinzufügen. Natürlich hat das Zeichnen eines solchen Diagramms nichts Übernatürliches an sich. Wenn du an deinen eigenen Aufgaben arbeitest, kannst du es auch schnell per Hand zeichnen. Dadurch wirst du die Fähigkeit zu entwickeln, die Architektur einer Anwendung zu durchdenken und Mängel in der Klassenstruktur frühzeitig zu erkennen, und nicht erst, nachdem du bereits den ganzen Tag damit verbracht hast, ein falsches Modell zu implementieren. Das ist doch ein guter Grund, es zu versuchen, nicht wahr? :)

Automatisierung

Es gibt verschiedene Möglichkeiten, PlantUML-Diagramme automatisch zu generieren. IDEA bietet zum Beispiel das SketchIT-Plugin, aber das zeichnet die Diagramme nicht ganz korrekt. Beispielsweise wird die Implementierung von Interfaces falsch gezeichnet (sie wird als Vererbung angezeigt). Im Internet findest du Beispiele dafür, wie du das in den Entwicklungsprozess deines Projekts integrieren kannst. Zum Beispiel kannst du erfahren, wie Sie uml-java-docklet mit Maven verwenden können. Zur Demonstration werden wir Maven Archetype verwenden, um schnell ein Maven-Projekt zu erstellen. Ausführen

mvn archetype:generate
Belasse es bei Wählen Sie eine Zahl oder wenden Sie einen Filter an bei der Standardeinstellung – drücke einfach die Eingabetaste. Dabei handelt es sich immer um „maven-archetype-quickstart“. Wähle die neueste Version aus. Als Nächstes werden wir einige Fragen beantworten und die Erstellung des Projekts abschließen: UM KlassendiagrammL: Von der Theorie zur Praxis - 5Maven ist nicht das Thema dieses Artikels; Antworten auf deine Fragen zu Maven findest du im Maven Users Centre. Öffne im generierten Projekt die Projektbeschreibungsdatei pom.xml zur Bearbeitung. Wir kopieren den Inhalt aus der uml-java-docklet-Installationsbeschreibung in diese Datei. Das in der Beschreibung verwendete Artefakt kann nicht im Maven Central Repository gefunden werden. Aber Folgendes hat bei mir funktioniert: https://mvnrepository.com/artifact/com.chfourie/uml-java-doclet/1.0.0. Mit anderen Worten, in der Beschreibung musst du lediglich die GroupId von „info.leadinglight“ durch „com.chfourie“ ersetzen und die Version auf „1.0.0“ setzen. Danach können wir die folgenden Befehle im Verzeichnis mit der Datei pom.xml ausführen:

mvn clean install
und

mvn javadoc: javadoc
Wenn wir nun die generierte Dokumentation öffnen (explorer target\site\apidocs\index.html), sehen wir die UML-Diagramme. Übrigens, die Implementierungsbeziehung wird jetzt korrekt angezeigt :)

Fazit

Mit UML kannst du also die Struktur deiner Anwendung visualisieren. Aber die UML kann noch viel mehr. Du kannst die UML verwenden, um verschiedene Prozesse innerhalb deines Unternehmens zu beschreiben oder um den Geschäftsprozess zu beschreiben, der eine von dir zu schreibende Funktion umfasst. Du musst selbst herausfinden, wie nützlich die UML für dich persönlich ist, aber egal, wie du dich entscheidest, due solltest etwas Zeit investieren, um die UML besser kennenzulernen.
Dieser Beitrag ist auf Englisch verfügbar.
Read the English version of this article to gain insights into a UML diagram for Java. When you understand the conventions of UML class diagrams, you can quickly and reliable communicate important class properties, behaviors, and relationships.