Archyno
UMLStrukturdiagramme

UML-Paketdiagramme

Wie ein Modell oder eine Codebasis gruppiert ist und - der entscheidende Teil - welche Gruppe von welcher abhängen darf. Das Diagramm, das aus einer Architekturregel etwas Prüfbares statt einer Absichtserklärung macht.

6 Min. LesezeitUML 2.5.124 von 35

Die kurze Antwort

  • Die fehlenden Pfeile bedeuten so viel wie die gezeichneten. Jede Abhängigkeit im Code ohne Pfeil im Diagramm ist ein benennbarer Verstoss.
  • Import holt öffentliche Elemente in den importierenden Namensraum und exportiert sie weiter; access macht sie nutzbar und beendet die Abhängigkeit dort.
  • Package merge kopiert den Inhalt des zusammengeführten Pakets in das zusammenführende. Innerhalb der UML-Spezifikation viel genutzt, in gewöhnlichen Modellen selten.
  • Ein Paketdiagramm betrifft die Quellstruktur, ein Komponentendiagramm die auslieferbaren Teile. Es sind nicht zwei Sichten auf dasselbe.
Ein UML-Paketdiagramm einer Schichtenarchitektur. Das Paket ui und das Paket infrastructure hängen beide vom Paket domain ab. Alle drei - ui, domain und infrastructure - hängen von einem darunterliegenden Paket shared ab.
Eine Schichtenarchitektur als Abhängigkeitsgraph. Jeder Pfeil zeigt auf etwas Stabileres als seine Quelle, und nichts zeigt zurück nach oben.

01Was es zeigt#

Ein Paketdiagramm ist das Inhaltsverzeichnis eines Modells plus eine Regel darüber, wer wen referenzieren darf. Die Form des Reiterordners ist ein Namensraum: eine Gruppe von Klassen, Anwendungsfällen, Komponenten oder weiteren Paketen.

Die Gruppierung allein ist mäßig nützlich. Der Wert steckt in den Pfeilen. Eine Abhängigkeit von ui nach domain sagt, dass die UI-Schicht Domänentypen referenzieren darf. Das Fehlen eines Pfeils in die andere Richtung sagt, dass die Domäne nicht wissen darf, dass die UI existiert - und das ist eine Architekturregel, die Sie testen, linten und einen Build daran scheitern lassen können.

02Die Notation#

ElementNotationWas es bedeutet
PaketOrdner mit ReiterEin Namensraum. Sein Name steht im Reiter, wenn der Körper Inhalt trägt, und im Körper, wenn nicht.
AbhängigkeitDie Quelle referenziert etwas im Ziel. Der Allgemeinfall, und meist genug.
«import»Die öffentlichen Mitglieder des Ziels werden in der Quelle sichtbar und aus ihr re-exportiert.
«access»In der Quelle sichtbar, aber nicht re-exportiert. Die engere und meist genauere der beiden.
«merge»Der Inhalt des Ziels wird in die Quelle vereinigt. Außerhalb von Metamodellen selten; Sie werden es öfter lesen als schreiben.
VerschachtelungPaket in einem PaketEnthaltensein, geschrieben outer::inner. Auch als Linie mit einem eingekreisten Kreuz am Elternteil zeichenbar.

In der Praxis trägt der schlichte Abhängigkeitspfeil die meisten Paketdiagramme, und die Unterscheidung zwischen «import» und «access» verdient ihren Platz erst, wenn Sie eine Sprache oder ein Framework modellieren, dessen Modulsystem den Unterschied real macht.

03Die Richtung lesen#

Alles Interessante an einem Paketdiagramm steckt in der Richtung der Pfeile, und man sucht nach zwei Dingen.

Zyklen. Können Sie bei einem Paket beginnen, Pfeilen folgen und wieder dort landen, wo Sie angefangen haben, lassen sich diese Pakete nicht unabhängig bauen, testen, verstehen oder deployen. Sie sind ein Paket, das vorgibt, mehrere zu sein. Ein Paketdiagramm macht einen Zyklus in etwa zwei Sekunden sichtbar, was ohne Werkzeug der schnellste Weg ist, einen zu finden.

Stabilität. Abhängigkeiten sollten auf Dinge zeigen, die sich seltener ändern. Im Diagramm oben zeigen ui und infrastructure beide auf domain, und alle drei auf shared. Das ist die Form einer Schichtenarchitektur: Flüchtiges hängt von Stabilem ab, nie umgekehrt. Ein Pfeil von domain nach ui wäre das Wichtigste auf der Seite.

So erkennt man auch ein shared- oder common-Paket, das aus dem Ruder läuft. Eines, auf das alles zeigt, ist in Ordnung, solange es selbst auf nichts zeigt. In dem Moment, in dem es einen ausgehenden Pfeil bekommt, hängt jedes Paket im System transitiv von diesem Ziel ab.

04Wann man eines zeichnet#

Dazu greifen, wenn

  • Eine Schichtungsregel festlegen oder dokumentieren, die durchgesetzt werden soll
  • Eine Codebasis auf Abhängigkeitszyklen zwischen Modulen prüfen
  • Einem Neuzugang die Karte eines Repositorys vor den Details geben
  • Planen, wie ein Monolith zu teilen ist - die Schnittlinien liegen dort, wo die Pfeile dünn sind

Zu etwas anderem greifen, wenn

  • Es gibt drei Pakete und die Struktur ergibt sich aus dem Ordnerbaum
  • Das Interessante sind die Verträge zwischen Teilen - nehmen Sie ein Komponentendiagramm
  • Sie müssten es bei jedem verschobenen File neu zeichnen
  • Die Gruppierung existiert, aber keine Regel über Abhängigkeiten; die Pfeile wären beschreibendes Rauschen

Paketdiagramme funktionieren auf zwei Höhen gut und dazwischen schlecht: das ganze System bei fünf bis neun Paketen, oder ein Teilsystem in ähnlicher Körnung. Ein Diagramm mit vierzig Paketen ist ein Abhängigkeitsgraph, und einen Abhängigkeitsgraphen liest ein Werkzeug besser als ein Mensch.

In je einer Zeile

  1. 01Pakete sind Namensräume; die Pfeile dazwischen sind der eigentliche Inhalt.
  2. 02«import» re-exportiert, «access» nicht; eine schlichte Abhängigkeit reicht meist.
  3. 03Folgen Sie den Pfeilen, um Zyklen zu finden - Pakete in einem Zyklus sind ein Paket.
  4. 04Abhängigkeiten sollten auf das zeigen, was sich am wenigsten ändert.
  5. 05Auf ein gemeinsames Paket darf alles zeigen; es selbst darf auf nichts zeigen.
  6. 06Das ist das UML-Diagramm, aus dem am ehesten eine automatische Build-Prüfung wird.

05Häufige Fragen#

Was unterscheidet import von access in UML?

Beide sind Abhängigkeiten zwischen Paketen. Import holt die öffentlichen Elemente des importierten Pakets in den importierenden Namensraum, sodass sie unqualifiziert benannt und weiter re-exportiert werden. Access macht sie nutzbar, exportiert sie aber nicht weiter - die Abhängigkeit endet dort.

Wie zeigt man eine Schichtenarchitektur in UML?

Ein Paket pro Schicht und ein Abhängigkeitspfeil pro erlaubter Richtung, alle gleich orientiert. Der Wert liegt darin, dass die fehlenden Pfeile so viel bedeuten wie die gezeichneten: jede Abhängigkeit im Code ohne Pfeil im Diagramm ist ein benennbarer Verstoss.

Was bedeutet package merge?

Merge heisst, dass der Inhalt des zusammengeführten Pakets begrifflich in das zusammenführende kopiert und mit dem Vorhandenen kombiniert wird. Innerhalb der UML-Spezifikation selbst wird es stark genutzt, in gewöhnlichen Modellen selten.

Was unterscheidet Paket- und Komponentendiagramm?

Ein Paketdiagramm gruppiert Modellelemente und zeigt Namensraum-Abhängigkeiten - es geht darum, wie Modell oder Codebasis organisiert sind. Ein Komponentendiagramm zeigt zur Laufzeit austauschbare Einheiten und die Schnittstellen dazwischen. Das eine betrifft die Quellstruktur, das andere auslieferbare Teile.

In dieser Reihe

Passend dazu

Alle Artikel