Archyno
UMLStrukturdiagramme

Komponentendiagramm-Beispiele

Fünf Komponentendiagramme von Systemen, an denen Sie vermutlich schon gearbeitet haben. Jedes klärt eine Frage: Wer darf wen aufrufen, was müsste ein Ersatz erfüllen, und wo läuft eine Abhängigkeit in die falsche Richtung.

9 Min. LesezeitUML 2.5.118 von 35

Die kurze Antwort

  • Das nützlichste Beispiel ist das kleinste, das eine Streitfrage klärt: zwei oder drei Komponenten, die Schnittstellen dazwischen, sonst nichts.
  • Microservices bilden sauber ab - ein Service je Komponente, eine veröffentlichte API je Schnittstelle. Wo sie laufen, klärt ein Verteilungsdiagramm.
  • Drei bis neun Komponenten. Über zehn folgt der Leser keinen Pfeilen mehr, sondern überfliegt nur noch - ab da ist das Diagramm Dekoration.
  • Zeichnen Sie den Adapter, nicht die Datenbank. Der Vertrag, von dem Ihr Code abhängt, ist die nützliche Aussage; das Produkt ist Infrastruktur.
Ein UML-Komponentendiagramm. Eine Web-Storefront-Komponente und eine Mobile-App-Komponente hängen beide von einer ICatalog-Schnittstelle ab, die eine einzelne Catalog-service-Komponente realisiert.
Beispiel eins. Zwei Clients, ein Vertrag, ein Anbieter - der gestrichelte Pfeil mit hohlem Dreieck heißt "ich implementiere das", der schlichte gestrichelte Pfeil heißt "ich brauche das".

01Wie man die fünf liest#

Jedes Diagramm unten benutzt dieselben drei Marken, und wer sie lesen kann, kann alle fünf lesen: eine Komponente ist ein Kasten mit dem Stecker-Icon, eine «interface» ist ein Kasten, der einen Vertrag benennt, und die Pfeile sagen, auf welcher Seite dieses Vertrags jede Komponente steht. Ein gestrichelter Pfeil mit hohlem Dreieck heißt ich implementiere das. Ein schlichter gestrichelter Pfeil heißt ich brauche das. Der volle Satz steht in den Komponentendiagramm-Symbolen, und die Überlegung hinter der Notation im Leitfaden zum Komponentendiagramm.

Sie sind danach geordnet, wie oft die Form auftaucht, nicht nach Komplexität. Jedes benennt die Frage, die es klärt, denn ein Komponentendiagramm, das nichts klärt, ist die häufigste und nutzloseste Art: fünf Kästen, fünf Pfeile und keine Aussage, der jemand widersprechen könnte.

021. Zwei Clients, ein Vertrag#

Die Abbildung oben in diesem Artikel. Eine Web-Storefront und eine mobile App brauchen beide Produktdaten; ein Katalogdienst liefert sie. Die Schnittstelle ist einmal gezeichnet, zwischen ihnen.

Dieser eine Kasten ist der ganze Sinn des Beispiels. Bevor es ihn gab, hatten die beiden Clients zwei verschiedene Vorstellungen davon, was „der Katalog“ zurückgibt, und der Unterschied wohnte in dem, der als zweiter geschrieben wurde. ICatalog zu benennen erzwingt die Frage, was der Vertrag eigentlich ist, und ist er einmal benannt, ist eine Änderung daran sichtbar eine Änderung für zwei Konsumenten statt einer Bearbeitung eines Dienstes.

032. Ports und Adapter#

Ein UML-Komponentendiagramm eines Ports-and-Adapters-Entwurfs. Eine HTTP-API-Komponente hängt von einer IOrdering-Schnittstelle ab, die die Ordering-core-Komponente realisiert. Der Kern hängt von einer IOrderStore-Schnittstelle ab, die eine PostgreSQL-Adapter-Komponente realisiert.
Beispiel zwei. Der Kern sitzt zwischen zwei Verträgen und hängt von keiner Implementierung ab: die HTTP-API ruft über IOrdering herein, und die Datenbank wird über IOrderStore erreicht.

Lesen Sie die Pfeile und achten Sie darauf, was der Ordering core nicht berührt. Er hängt nicht von HTTP ab und nicht von PostgreSQL. Er realisiert einen Vertrag und benötigt einen anderen, und beides sind Kästen, die ihm irgendwer hätte reichen können.

Das ist die Form, die Leute mit hexagonaler Architektur, Ports und Adaptern oder Clean Architecture meinen, und ein Komponentendiagramm ist der billigste Weg zu prüfen, ob eine Codebasis sie wirklich hat. Zeigt der Kernkasten mit einem Pfeil auf eine Datenbankkomponente statt auf eine Schnittstelle, ist das Muster Wunschdenken: irgendetwas in der Mitte importiert den Treiber.

043. Ein Vertrag, zwei Implementierungen#

Ein UML-Komponentendiagramm. Eine Order-service-Komponente hängt von einer IBilling-Schnittstelle ab. Zwei Komponenten realisieren sie: eine Legacy-Billing-Komponente und eine neue Billing-service-Komponente.
Beispiel drei. Das Migrationsdiagramm: beide Abrechnungsimplementierungen realisieren IBilling, also kann der Bestelldienst nicht erkennen, mit welcher er spricht.

Das ist das Diagramm, das man vor einer Ablösung zeichnet, nicht danach. Die Aussage, die es macht, ist präzise und prüfbar: alles, was der Bestelldienst von der Abrechnung braucht, steckt in IBilling, also lässt sich eine zweite Implementierung dieser Schnittstelle einwechseln, ohne dass der Bestelldienst sich ändert.

Es ist auch der schnellste Weg herauszufinden, dass die Aussage falsch ist. Sagt jemand „der neue Dienst kann keine Rechnungs-PDFs“, dann waren Rechnungs-PDFs Teil des Vertrags und fehlen in der Schnittstelle, und das Diagramm war falsch, bevor die Migration es war. Dieses Gespräch kostet zehn Minuten am Whiteboard und drei Monate in Produktion.

Ist die alte Implementierung weg, löschen Sie sie aus dem Diagramm. Ein Komponentendiagramm, das zwei Jahre nach der Abschaltung noch den Mainframe zeigt, ist der Grund, warum Leute den Diagrammen nicht mehr trauen.

054. Eine Plugin-Architektur#

Ein UML-Komponentendiagramm einer Plugin-Architektur. Eine Editor-host-Komponente hängt von einer IExporter-Schnittstelle ab, die drei Komponenten realisieren: ein PNG-Exporter, ein Mermaid-Exporter und ein Sparx-.qea-Exporter.
Beispiel vier. Dieselbe Form wie Beispiel drei, mit anderer Bedeutung: der Host wählt nicht einen Exporter aus, er ist darauf ausgelegt, beliebig viele anzunehmen.

Topologisch ist das Beispiel drei mit einer dritten Implementierung, und bei dieser Ähnlichkeit lohnt es sich zu verweilen: Austauschbarkeit und Erweiterbarkeit sind dieselbe Zeichnung. Was sich unterscheidet, ist die Absicht. In einer Migration ist die zusätzliche Realisierung vorübergehend; in einer Plugin-Architektur ist sie das Produkt.

Die Lesetechnik, die sich hier auszahlt, ist, die rechte Spalte mit der Hand abzudecken. Was bleibt - der Host und IExporter- ist alles, was die Autorin eines vierten Exporters wissen muss. Verlangt die Antwort auf „kann ich meinen eigenen Exporter schreiben?“ das Lesen des Host-Quelltexts, ist die Schnittstelle unterspezifiziert, und das Diagramm hat Ihnen das gerade gesagt.

065. Das mit dem Zyklus#

Ein UML-Komponentendiagramm mit einem Abhängigkeitszyklus. Der Orders-Dienst hängt von einer IShipping-Schnittstelle ab, die der Shipping-Dienst realisiert, und der Shipping-Dienst hängt von einer IOrders-Schnittstelle ab, die der Orders-Dienst realisiert.
Beispiel fünf. Orders braucht Shipping, Shipping braucht Orders. Keiner lässt sich ohne den anderen deployen, testen oder ersetzen, und das Diagramm macht das auf einen Blick sichtbar.

Zwei Dienste, jeder realisiert einen Vertrag, den der andere benötigt. Nichts hier ist illegales UML und nichts auf dem Diagramm ist falsch - die Zeichnung ist ein zutreffendes Bild eines Systems, das schwierig werden wird, und genau das soll ein Diagramm sagen können.

Ein Zyklus zwischen Komponenten heißt, dass keine für sich verstanden werden kann: kein unabhängiges Deployment, kein Test in Isolation ohne Stub der anderen, und ein Ersatz einer von beiden muss einen Vertrag erfüllen, von dem die andere gleichzeitig abhängt. Auf einem Klassendiagramm ist ein Zyklus ein Geruch; zwischen deploybaren Einheiten ist er ein Terminrisiko.

Die üblichen Abhilfen sind auf demselben Bild sichtbar. Verschieben Sie, was Shipping braucht, aus IOrders in ein Ereignis, das der Orders-Dienst publiziert, damit der Pfeil einseitig wird. Oder ziehen Sie den gemeinsamen Teil in eine dritte Komponente, von der beide abhängen, was den Zyklus in ein Zusammenlaufen verwandelt und Sie zurück zu Beispiel eins bringt.

In je einer Zeile

  1. 01Zusammenlaufen (Beispiel 1): ein Vertrag mit mehreren Konsumenten - einmal benennen, einmal ändern.
  2. 02Kette (Beispiel 2): der Kern hängt an beiden Enden von Schnittstellen ab, an keinem von Implementierungen.
  3. 03Zwei Realisierungen (Beispiel 3): die Migrationsaussage, dort aufgeschrieben, wo sie widerlegt werden kann.
  4. 04Viele Realisierungen (Beispiel 4): dieselbe Zeichnung wie eine Migration, dauerhaft gemeint.
  5. 05Ein Zyklus (Beispiel 5): ein ehrliches Bild eines Systems, das sich nicht stückweise deployen oder ersetzen lässt.
  6. 06Klärt ein Diagramm keinen Streit, ist es Dekoration - löschen Sie es, statt es zu pflegen.

Um eines davon gegen Ihr eigenes System zu zeichnen, steht die Schritt-für-Schritt-Fassung in wie man ein Komponentendiagramm zeichnet. Für den Ort, an dem diese Komponenten laufen, statt für das, was sie einander versprechen, ist ein Verteilungsdiagramm zuständig.

07Häufige Fragen#

Was ist ein gutes Beispiel für ein Komponentendiagramm?

Das nützlichste Beispiel ist das kleinste, das eine Streitfrage klärt: zwei oder drei Komponenten, die Schnittstellen dazwischen, sonst nichts. Ein Diagramm eines geteilten Katalogs, den Web und App nutzen, sagt mehr als eine Wand aus vierzig Kästen - der Leser erfasst es auf einmal und kann es gegen den Code prüfen.

Kann ein Komponentendiagramm Microservices zeigen?

Ja, und es ist eine der besseren Anwendungen. Jeder Service wird eine Komponente, jede veröffentlichte API eine Schnittstelle, und das Diagramm sagt genau, welcher Service welchen Vertrag aufrufen darf. Nicht zeigen darf es, wo die Services laufen - das ist ein Verteilungsdiagramm.

Wie viele Komponenten gehören auf ein Diagramm?

Drei bis etwa neun. Unter drei gibt es keine Struktur zu zeichnen, über neun oder zehn hört der Leser auf, Pfeilen zu folgen, und überfliegt nur noch - ab da ist das Diagramm Dekoration. Ein grosses System wird als mehrere Diagramme gezeichnet, eines je Frage.

Soll eine Datenbank als Komponente gezeichnet werden?

Zeichnen Sie den Adapter, nicht die Datenbank. Das Diagramm handelt vom Vertrag, von dem Ihr Code abhängt, also trägt eine Komponente PostgreSQL-Adapter, die IOrderStore realisiert, die nützliche Aussage. Das Datenbankprodukt selbst ist Infrastruktur und gehört ins Verteilungsdiagramm.

In dieser Reihe

Passend dazu

Alle Artikel