{"id":1755,"date":"2025-10-03T07:42:02","date_gmt":"2025-10-03T05:42:02","guid":{"rendered":"https:\/\/www.vintrospektiv.de\/?p=1755"},"modified":"2025-10-03T07:42:02","modified_gmt":"2025-10-03T05:42:02","slug":"tipps-zu-plantuml","status":"publish","type":"post","link":"https:\/\/www.vintrospektiv.de\/index.php\/2025\/10\/tipps-zu-plantuml\/","title":{"rendered":"Tipps zu PlantUML"},"content":{"rendered":"\n<p>Der zweite der <a href=\"https:\/\/www.vintrospektiv.de\/index.php\/2025\/09\/university-results\/\">angek\u00fcndigten<\/a> Artikel hat streng genommen auf diesen Seiten nicht viel verloren: Der einzige Bezug zu Spielen ist, dass sie programmiert werden m\u00fcssen und dass man vor dem eigentlichen Programmieren meist eine gewisse Planung vornimmt.<\/p>\n\n\n\n<p>Ein Teil dieser Planung findet in Form von UML (Unified Modeling Language) statt \u2013 auch wenn ein Freund mir vor einiger Zeit versicherte, dass UML in seinem Umfeld keine Rolle mehr spielt. Man kann mit dieser Symbolsprache verschiedene Aspekte der Programmierung visualisieren, von den ersten Entw\u00fcrfen \u00fcber Abl\u00e4ufe und Zust\u00e4nde bis hin zu den Klassen in einem Projekt (die wohl auch den h\u00e4ufigsten Anwendungsfall darstellen).<\/p>\n\n\n\n<p>PlantUML ist ein Tool f\u00fcr die Umsetzung von UML. W\u00e4hrend die meisten g\u00e4ngigen UML-Modellierungsumgebungen auf grafischen Bausteinen aufbauen, wird in PlantUML direkt in einer Textsprache gearbeitet, die erst als Zusatzschritt in die grafische Endform umgewandelt wird. Trotzdem ist PlantUML gerade wegen der Klarheit und damit verbundenen geringen Fehleranf\u00e4lligkeit, aber auch wegen der relativen Vollst\u00e4ndigkeit der UML-Implementierung zu Recht beliebt.<\/p>\n\n\n\n<p>Dieser Artikel ist im Rahmen des Moduls &#8220;Software Engineering 2&#8221; entstanden, in dem ich ihn als Hilfe f\u00fcr aktuelle und k\u00fcnftige Mitstudierende schrieb.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Software Engineering: Tipps zu PlantUML<\/h2>\n\n\n\n<p class=\"has-small-font-size\">Miron Schmidt, Sommersemester 2025<\/p>\n\n\n\n<p>PlantUML funktioniert normalerweise sehr fl\u00fcssig, es gibt aber ein paar \u00e4rgerliche Probleme, die sehr viel Zeit kosten k\u00f6nnen. Die Verteilung der Entit\u00e4ten im Diagramm kann PlantUML \u00fcberfordern, vor allem in Verbindung mit Paketen oder komplexen Assoziationen. (Ich fasse hier alle Arten von Dingen, die miteinander in Bezug gesetzt werden k\u00f6nnen, als Entit\u00e4ten zusammen, da es ja verschiedene UML-Diagramme gibt, in denen nicht nur Klassen vorkommen k\u00f6nnen.)<\/p>\n\n\n\n<p>Hier sind ein paar Tipps, mit denen man den Frust im Zaum halten kann, wenn PlantUML nicht so will wie man selbst.<\/p>\n\n\n\n<p>Zuerst ein allgemeiner Hinweis: Die <em>Form<\/em> einer Verbindung (mit\/ohne Pfeil, Vererbung, gestrichelt usw.) ist beim Auftreten von Schwierigkeiten unerheblich. Es geht nur um das Bilden von Pfaden zwischen den Entit\u00e4ten, das problematisch sein kann \u2013 daher spielt die <em>Richtung<\/em>, also die Seite(n), an der bzw. denen der Pfeil sitzt, sehr wohl eine Rolle. Wenn Entit\u00e4ten, die miteinander in Bezug gesetzt werden m\u00fcssen, aus organisatorischen Gr\u00fcnden weit auseinanderliegen, schlimmstenfalls mehrmals in einem Diagramm, ist es ebenfalls schwieriger, sinnvolle Verbindungen zu finden, als wenn sie geordnet nebeneinander zu finden sind.<\/p>\n\n\n\n<p>Mit Paketen kommt PlantUML etwa prinzipiell gut zurecht, wenn die Pfade aber kompliziert sind, werden einzelne Entit\u00e4ten mitunter falsch paketiert.<\/p>\n\n\n\n<p>Ein Beispiel: Dieser Code \u2013<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Eingang\nEingang &lt;-> Flur\npackage Haus {\n  class Wohnzimmer\n  Wohnzimmer &lt;-> Flur\n  Wohnzimmer &lt;-- Kueche\n  class Kueche\n  Kueche &lt;-> Flur\n  class Flur\n  class Schlafzimmer\n  Schlafzimmer &lt;-> Flur\n}\npackage Garten {\n  class Hundehuette\n  Hundehuette &lt;-> Terrasse\n  Hundehuette &lt;-> Eingang\n  class Terrasse\n  Terrasse &lt;-> Flur\n}<\/code><\/pre>\n\n\n\n<p>\u2013 f\u00fchrt zu diesem Diagramm:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"797\" height=\"219\" src=\"https:\/\/www.vintrospektiv.de\/wp-content\/uploads\/2025\/10\/Beispiel-1.png\" alt=\"\" class=\"wp-image-1756\" srcset=\"https:\/\/www.vintrospektiv.de\/wp-content\/uploads\/2025\/10\/Beispiel-1.png 797w, https:\/\/www.vintrospektiv.de\/wp-content\/uploads\/2025\/10\/Beispiel-1-300x82.png 300w, https:\/\/www.vintrospektiv.de\/wp-content\/uploads\/2025\/10\/Beispiel-1-768x211.png 768w\" sizes=\"auto, (max-width: 797px) 100vw, 797px\" \/><\/figure>\n\n\n\n<p>Man beachte, dass die Klasse <em>Flur<\/em> in der Darstellung aus dem Paket <em>Haus<\/em> herausgezogen wurde. (Die T\u00fcr zwischen K\u00fcche und Wohnzimmer ist in dieser Demonstration \u00fcbrigens eine Klappt\u00fcr, die nur aus der K\u00fcche ins Wohnzimmer durchlaufen werden kann.)<\/p>\n\n\n\n<p>Der wichtigste Tipp ist daher: Alle Assoziationen sollten ans Ende der Datei gestellt werden. PlantUML ist besser darin, sie auf diese Weise nacheinander zu ber\u00fccksichtigen, als wenn sie nahe bei den Entit\u00e4ten platziert werden (was f\u00fcr menschliche Augen allerdings strukturierter wirkt).<\/p>\n\n\n\n<p>Das Beispiel sieht nun so aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Eingang\npackage Haus {\n  class Wohnzimmer\n  class Kueche\n  class Flur\n  class Schlafzimmer\n}\npackage Garten {\n  class Hundehuette\n  class Terrasse\n}\nEingang &lt;-> Flur\nWohnzimmer &lt;-> Flur\nWohnzimmer &lt;-- Kueche\nKueche &lt;-> Flur\nSchlafzimmer &lt;-> Flur\nHundehuette &lt;-> Terrasse\nHundehuette &lt;-> Eingang\nTerrasse &lt;-> Flur<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"219\" src=\"https:\/\/www.vintrospektiv.de\/wp-content\/uploads\/2025\/10\/Beispiel-2.png\" alt=\"\" class=\"wp-image-1757\" srcset=\"https:\/\/www.vintrospektiv.de\/wp-content\/uploads\/2025\/10\/Beispiel-2.png 768w, https:\/\/www.vintrospektiv.de\/wp-content\/uploads\/2025\/10\/Beispiel-2-300x86.png 300w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/figure>\n\n\n\n<p>Die Pakete stimmen jetzt, aber die Assoziationen, die im ersten Versuch schon sehr wirr aussahen, sind eher noch un\u00fcbersichtlicher als vorher.<\/p>\n\n\n\n<p>Entit\u00e4ten, die von PlantUML an eine ung\u00fcstige Stelle gesetzt werden, und Assoziationen zwischen den Entit\u00e4ten k\u00f6nnen im Code von Hand verschoben werden. Manchmal finden sich dann bessere Verbindungen als vorher. (Die Logik dahinter ist nicht sofort eing\u00e4ngig, aber durch Ausprobieren erahnt man nach und nach Regeln.)<\/p>\n\n\n\n<p>Nach einigem Schieben (vor allem zu beachten: die umgedrehte Assoziation zwischen K\u00fcche und Wohnzimmer) kommen wir zu folgendem Code und dem daraus resultierenden Diagramm, mit dem wir uns absolut zufrieden geben k\u00f6nnen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Eingang\npackage Haus {\nclass Flur\nclass Wohnzimmer\nclass Schlafzimmer\nclass Kueche\n}\npackage Garten {\nclass Terrasse\nclass Hundehuette\n}\nFlur &lt;-&gt; Eingang\nFlur &lt;-&gt; Terrasse\nFlur &lt;-&gt; Wohnzimmer\nKueche --&gt; Wohnzimmer\nKueche &lt;-&gt; Flur\nSchlafzimmer &lt;-&gt; Flur\nHundehuette &lt;-&gt; Terrasse\nHundehuette &lt;-&gt; Eingang<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"772\" height=\"273\" src=\"https:\/\/www.vintrospektiv.de\/wp-content\/uploads\/2025\/10\/Beispiel-4.png\" alt=\"\" class=\"wp-image-1758\" srcset=\"https:\/\/www.vintrospektiv.de\/wp-content\/uploads\/2025\/10\/Beispiel-4.png 772w, https:\/\/www.vintrospektiv.de\/wp-content\/uploads\/2025\/10\/Beispiel-4-300x106.png 300w, https:\/\/www.vintrospektiv.de\/wp-content\/uploads\/2025\/10\/Beispiel-4-768x272.png 768w\" sizes=\"auto, (max-width: 772px) 100vw, 772px\" \/><\/figure>\n\n\n\n<p>Hoffentlich klar ist: Eine Anpassung der fachlichen Ausarbeitung (Assoziationen, Pakete) sollte nur als allerletzter Ausweg in Betracht gezogen werden. Normalerweise reichen die zuvor genannten Tipps aus, um das Diagramm zu reparieren.<\/p>\n\n\n\n<p>Und damit w\u00fcnsche ich viel Spa\u00df beim eigenen Ausprobieren dieser Hinweise! Der Beispielcode eignet sich \u00fcbrigens gut zum Experimentieren, da ja schon einige \u00c4nderungen mit ihren Ergebnissen vorgef\u00fchrt wurden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der zweite der angek\u00fcndigten Artikel hat streng genommen auf diesen Seiten nicht viel verloren: Der einzige Bezug zu Spielen ist, dass sie programmiert werden m\u00fcssen und dass man vor dem eigentlichen Programmieren meist eine gewisse Planung vornimmt. Ein Teil dieser Planung findet in Form von UML (Unified Modeling Language) statt \u2013 auch wenn ein Freund [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1761,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"pgc_sgb_lightbox_settings":"","footnotes":""},"categories":[16],"tags":[],"class_list":["post-1755","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-introspektiv"],"_links":{"self":[{"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/posts\/1755","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/comments?post=1755"}],"version-history":[{"count":2,"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/posts\/1755\/revisions"}],"predecessor-version":[{"id":1760,"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/posts\/1755\/revisions\/1760"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/media\/1761"}],"wp:attachment":[{"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/media?parent=1755"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/categories?post=1755"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vintrospektiv.de\/index.php\/wp-json\/wp\/v2\/tags?post=1755"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}