Be Software Architecture Wise
Be Wise Apps

Read in English · Leer en español · Lire en français

Abschnitt 4.4 von 4.8 · Mittelstufe · 22 Min. Lesezeit

Die UML-Diagramme, die Architekten noch verwenden

Videolektion

5 Min. · auf Englisch gesprochen, mit Untertiteln
Nur anhören (Audio)
Transkript lesen

Kästen und Linien genügen für die Struktur, aber manche Fragen brauchen mehr Präzision. In dieser Lektion lernen Sie die Handvoll Diagramme der Unified Modeling Language, kurz UML, kennen, die Architekten noch verwenden, und wann sie den Aufwand lohnen.

Musiker auf der ganzen Welt können dieselben Noten lesen, weil Noten und Zeichen überall dasselbe bedeuten. UML ist ein ähnlicher gemeinsamer Satz von Symbolen zum Zeichnen von Software. Ein bestimmter Pfeil bedeutet „wartet auf eine Antwort“. Ein anderer bedeutet „sendet und macht weiter“. Sie müssen nicht alles davon kennen. Architekten nutzen meist eine Handvoll ihrer Zeichnungen, jede nur dann, wenn ihre Präzision wirklich hilft.

UML ist eine universelle grafische Sprache zur Beschreibung von Struktur und Verhalten von Software. Sie wurde 1997 von der Object Management Group als Standard übernommen, und die aktuelle Version, 2.5.1, definiert vierzehn Diagrammtypen. Ihr Ruf hat sich gewandelt. Der frühe Anspruch, detaillierte Modelle in Code zu verwandeln, ist weitgehend gescheitert, und viele Teams zeichnen heute informelle Kästen und Linien. Doch einige UML-Diagramme sind noch immer die besten Werkzeuge für Fragen zum Verhalten über die Zeit.

Martin Fowler beschreibt drei Arten, UML zu verwenden. Als Skizze ist sie informell und selektiv: nur die wichtigen Elemente, oft auf einem Whiteboard, oft weggeworfen. Mit seinen Worten: Vollständigkeit ist der Feind der Verständlichkeit. Als Bauplan erzeugt sie vollständige, präzise Modelle, die jemand anderes implementiert. Als Programmiersprache ist das Modell detailliert genug, um in Code kompiliert zu werden. Das überlebt nur in einigen Nischen im Embedded- und sicherheitskritischen Bereich. Für Architekten ist das Skizzieren der Normalfall. Fragen Sie bei jedem Diagramm: Wer wird es lesen, und welche Entscheidung unterstützt es?

Wenn Architekten nur ein einziges UML-Diagramm behalten, ist es meist das Sequenzdiagramm. Es zeigt, wie Beteiligte in einem Szenario über die Zeit interagieren. Jeder Beteiligte oben hat eine gestrichelte Lebenslinie, und die Zeit läuft nach unten. Hier gibt die Kunden-App beim Bestellservice eine Bestellung auf, der den Zahlungsanbieter aufruft und wartet. Ein synchroner Aufruf hat eine durchgezogene Linie und eine gefüllte Pfeilspitze. Die Antwort kommt als gestrichelte Linie zurück. Dieser Kasten ist ein alt-Fragment, das Alternativen zeigt. Ist die Zahlung autorisiert, wird die Bestellung gespeichert und bestätigt. Wird sie abgelehnt, bekommt die App einen Fehler. Zeichnen Sie auch die Fehlerszenarien: Dort findet das meiste architektonische Denken statt. Schließlich geht ein Ereignis „Bestellung aufgegeben“ als asynchrone Nachricht an das Topic: eine durchgezogene Linie mit offener Pfeilspitze. Der Service wartet nicht. Diese Pfeilspitzen richtig zu setzen ist wichtig. Ob ein Service wartet oder weitermacht, bestimmt seine Latenz, seine Ausfallarten und seine Kopplung. Die Legende erklärt sie.

Ein Zustandsdiagramm beschreibt einen Lebenszyklus präzise. Zustände sind abgerundete Rechtecke, und jede Transition ist mit einem Ereignis, einer optionalen Guard-Bedingung und einer optionalen Aktion beschriftet. Hier beginnt eine Bestellung mit offener Zahlung und wird erteilt, wenn die Zahlung autorisiert ist. Dann durchläuft sie angenommen, fertig und in Zustellung. Zugestellt wird sie erst, wenn der Übergabecode stimmt, und dann wird der Kunde benachrichtigt. Bestellungen können auch storniert werden: wenn die Zahlung abgelehnt wird, wenn das Restaurant sie ablehnt oder durch den Support, mit Erstattung. Dieser Lebenszyklus wird von mehreren Services geteilt. Ihn in einem Diagramm festzulegen verhindert Bugs, bei denen ein Service eine Bestellung für storniert hält, während ein anderer einen Kurier losschickt. Und es beantwortet Fragen, die Text verbirgt. Kann eine Bestellung storniert werden, wenn sie bereits in Zustellung ist? Hier nicht.

Vier weitere Diagramme vervollständigen den Satz. Ein Komponentendiagramm zeigt die Schnittstellen, die jeder Teil bereitstellt und benötigt, und macht so die Abhängigkeitsrichtung sichtbar. Ein Deployment-Diagramm zeigt Knoten, etwa ein Smartphone oder einen Cluster, die darauf deployten Artefakte und die Kommunikationspfade zwischen ihnen. Ein Aktivitätsdiagramm zeigt einen Workflow: wer jeden Schritt erledigt und was zwischen einem Fork und einem Join parallel läuft. Und ein Klassendiagramm bleibt am besten einem kleinen Domänenmodell der zentralen Geschäftsbegriffe vorbehalten. Jede Klasse von Hand gezeichnet ist binnen Wochen veraltet.

UML ist zu viel, wenn das Publikum sie nicht kennt und die Frage sie nicht braucht. Doch Präzision zahlt sich aus, wenn Missverständnisse teuer sind, etwa an einer Schnittstelle zwischen Unternehmen, wo jede Seite gegen die Beschreibung der anderen baut. Regulierte und sicherheitskritische Branchen verlangen oft eine Designdokumentation, die Prüfer nachverfolgen können. Lebenszyklusregeln, die sich mehrere Teams teilen, wie die Bestellzustände, profitieren von einer Notation, die jede Transition ausdrücklich verlangt. Und wenn die Umsetzenden eines Designs dessen Autor nicht ohne Weiteres fragen können, muss es weniger Raum für Interpretation lassen. Ein letzter Tipp: Fügen Sie immer eine Legende hinzu. Viele Leser kennen die Notation nicht.

Der vollständige Abschnitt zeichnet alle sechs Diagramme für die Essenslieferplattform, mit der Notation für jedes. Als Nächstes betrachten wir in Abschnitt vier Punkt fünf, wie man die Gründe hinter Entscheidungen festhält. Bis gleich.

Was Sie wissen müssen

Was UML ist und wo sie heute steht

Die Unified Modeling Language (UML) ist eine universelle grafische Sprache zur Beschreibung von Struktur und Verhalten von Software. Sie entstand Mitte der 1990er-Jahre bei Rational Software aus der Zusammenführung der Methoden von Grady Booch, James Rumbaugh und Ivar Jacobson und wurde 1997 von der Object Management Group (OMG), einem Industriekonsortium für Standards, als Standard übernommen. UML 2.0 (2005) war eine größere Überarbeitung. Die aktuelle Version ist UML 2.5.1, im Dezember 2017 von der OMG veröffentlicht; die frühere UML 2.4.1 wurde zudem von der ISO als ISO/IEC 19505 (2012) veröffentlicht. Die Spezifikation definiert vierzehn Diagrammtypen, unterteilt in Strukturdiagramme (etwa Klassen-, Komponenten- und Deployment-Diagramme) und Verhaltensdiagramme (etwa Aktivitäts-, Zustands- und Sequenzdiagramme).

Der Ruf der UML hat sich erheblich gewandelt. In den späten 1990er- und frühen 2000er-Jahren wurde sie als Grundlage der modellgetriebenen Entwicklung propagiert, bei der detaillierte Modelle in Code umgewandelt werden sollten. Dieser Anspruch ist außerhalb spezialisierter Domänen weitgehend gescheitert, und viele Teams verbinden UML mit schwergewichtigen Prozessen und Diagrammen, die niemand las. Als Marian Petre für eine auf der ICSE 2013 vorgestellte Studie 50 professionelle Softwareentwickler befragte, gaben 35 an, UML überhaupt nicht zu verwenden, und die meisten anderen nutzten sie selektiv und informell; die meisten Teams zeichnen informelle Kästen und Linien statt strikter UML. Dennoch bleibt eine Handvoll UML-Diagrammtypen das beste verfügbare Werkzeug für bestimmte Fragen, besonders für Fragen zum Verhalten über die Zeit, und ihre Notation ist weithin verständlich. Ein Architekt braucht nicht alle vierzehn Diagrammtypen, sondern vielleicht sechs, bewusst eingesetzt.

Dieser Abschnitt behandelt diese sechs, jeweils mit einem kleinen Beispiel aus der Essenslieferplattform, die das ganze Kapitel begleitet. Er setzt das C4-Vokabular aus Abschnitt 4.3 voraus; beide lassen sich gut kombinieren, mit C4 für den strukturellen Überblick und UML dort, wo sich Präzision bei Schnittstellen, Interaktionen oder Zuständen bezahlt macht.

Skizze, Bauplan oder Programmiersprache

Martin Fowlers UML Distilled (3. Auflage, Addison-Wesley, 2003) und seine Essays aus demselben Jahr unterscheiden drei Arten, UML zu verwenden, eine Einteilung, zu der Steve Mellor unabhängig gelangte. Als Skizze wird UML informell und selektiv verwendet, um Ideen zu vermitteln: auf einem Whiteboard, bevor Code geschrieben wird (Vorwärtsskizze), oder um einen Teil eines bestehenden Systems zu erklären (Rückwärtsskizze). Nur die wichtigen Elemente erscheinen, die Notation wird locker befolgt, und das Diagramm wird oft weggeworfen. Fowlers eigene Zusammenfassung lautet comprehensiveness is the enemy of comprehensibility (Vollständigkeit ist der Feind der Verständlichkeit).

Als Bauplan dient UML dazu, vollständige, präzise Modelle zu erstellen, die jemand anderes implementiert, oder die aus bestehendem Code generiert werden, um ihn vollständig zu dokumentieren; es geht um Vollständigkeit, und meist braucht man Werkzeuge. Als Programmiersprache ist das UML-Modell detailliert genug, um in ausführbaren Code kompiliert zu werden, das Ziel der Model-Driven Architecture (MDA). Dieser Modus überlebt in einigen Nischen im Embedded- und sicherheitskritischen Bereich, oft über spezialisierte Profile und Werkzeuge, hat sich aber nicht durchgesetzt.

Für Architekten ist der Skizzenmodus der Normalfall und der Bauplanmodus die Ausnahme. Die nützliche Frage zu jedem Diagramm lautet: Wer wird es lesen, und welche Entscheidung oder welches Verständnis unterstützt es? Ein Sequenzdiagramm, skizziert, um sich darauf zu einigen, wie Zahlungsfehler behandelt werden, ist wertvoll, auch wenn es die Hälfte der Notation ignoriert. Ein vollständiges, von Hand gepflegtes Klassenmodell eines Service mit 200 Klassen ist es meist nicht.

Komponentendiagramme: Teile und ihre Schnittstellen

Ein UML-Komponentendiagramm zeigt modulare Teile eines Systems und vor allem ihre Schnittstellen. Seine charakteristische Notation ist „Ball und Socket“: ein kleiner Kreis an einem Stiel (eine bereitgestellte Schnittstelle, die die Komponente anbietet) und ein Halbkreis (eine benötigte Schnittstelle, die jemand anderes bereitstellen muss). Sitzt ein Ball in einem Socket, sind die beiden Komponenten über diese Schnittstelle verbunden. Abhängigkeiten sind gestrichelte Pfeile, optional beschriftet mit einem Stereotyp wie «use».

Genau das interessiert Architekten, wenn sie Abhängigkeitsrichtung und Austauschbarkeit zeigen wollen. Im Beispiel hängt die Bestellkomponente nicht direkt vom Zahlungsanbieter ab; sie benötigt eine Schnittstelle PaymentPort, die ein separater Zahlungsadapter implementiert. Das ist das Denken in Abhängigkeitsumkehr und Ports and Adapters aus Kapitel 3, sichtbar gemacht: Einen anderen Zahlungsanbieter einzusetzen bedeutet, einen neuen Adapter zu schreiben, nicht die Bestellkomponente zu ändern. Ein C4-Komponentendiagramm kann dieselben Teile zeigen, unterscheidet aber nicht zwischen bereitgestellten und benötigten Schnittstellen.

Komponentendiagramm

UML-Komponentendiagramm: Bestellkomponente mit bereitgestellten und benötigten SchnittstellenKomponentendiagramm: Bestellung und Schnittstellen«component»Kunden-BFF«component»Bestellung«component»Zahlungsadapter«component»Dispo«externes System»ZahlungsanbieterOrderAPIPaymentPortOrderEvents«use»Bestellung bietet OrderAPI undOrderEvents, benötigt einenPaymentPort; den setzt derAdapter um.Leg.Bereitgestellte SchnittstelleBenötigte SchnittstelleAbhängigkeit
Bälle sind Schnittstellen, die eine Komponente bereitstellt; Sockets sind Schnittstellen, die sie benötigt. Die Bestellung hängt von einem Port ab, nicht vom Anbieter. (BFF: Backend for Frontend, eine serverseitige Komponente, die einer einzigen Client-App dient.)

Deployment-Diagramme: Knoten und Artefakte

Ein UML-Deployment-Diagramm zeigt die physische oder virtuelle Infrastruktur und was darauf läuft. Seine Elemente sind Knoten, als dreidimensionale Kästen gezeichnet, also Rechenressourcen: ein «device» wie ein Smartphone oder Server oder eine «executionEnvironment» wie ein Betriebssystem, eine Container-Laufzeit oder ein Kubernetes-Cluster; Knoten können verschachtelt sein. Artefakte, gezeichnet als Rechtecke mit einem Dokumentsymbol und dem Stereotyp «artifact», sind die physischen Dateien, die deployt werden: ein JAR, ein Container-Image, ein App-Bundle, eine Konfigurationsdatei. Linien zwischen Knoten sind Kommunikationspfade, beschriftet mit Protokollen.

Deployment-Diagramme sind Zuordnungssichten im Sinne des SEI (Abschnitt 4.2). Sie beantworten die Fragen des Betriebsteams: Wo läuft jeder Teil, wie viele Kopien, in welcher Region, welche Netzwerkpfade gibt es? Das Deployment-Diagramm von C4 deckt dasselbe Gebiet mit weniger formaler Notation ab; beides ist in Ordnung, solange es eines je wichtiger Umgebung gibt und es Replikate, Managed Services und Netzwerkgrenzen zeigt.

Deployment-Diagramm

UML-Deployment-Diagramm: Artefakte der Essenslieferplattform auf Smartphone, Kubernetes-Cluster und Managed ServicesDeployment-Diagramm: Produktion«device»Kunden-Handy«artifact»customer-app«node» Cloud-Region eu-west«executionEnvironment»Kubernetes-Cluster«artifact»Image ordering-service3 Replikate«artifact»Image dispatch-service3 Replikate«artifact»Image notification-service2 Replikate«node»ManagedPostgreSQLPrimary + Standby«node»Managed Kafka3 BrokerHTTPSTCPTCPLinien sindKommunika-tionspfade;3D: Knoten.
Knoten sind, wo etwas läuft; Artefakte sind, was deployt wird; Linien sind Kommunikationspfade.

Sequenzdiagramme: wer wen in welcher Reihenfolge aufruft

Wenn Architekten nur ein einziges UML-Diagramm behalten, ist es meist das Sequenzdiagramm. Es zeigt, wie Beteiligte in einem Szenario über die Zeit interagieren. Die Beteiligten stehen oben nebeneinander, jeder mit einer gestrichelten senkrechten Lebenslinie; die Zeit läuft nach unten. Ein schmales Rechteck auf einer Lebenslinie, die Aktivierung (Ausführungsspezifikation), zeigt, wann dieser Beteiligte mit der Bearbeitung einer Nachricht beschäftigt ist.

Die Pfeilspitzen tragen Bedeutung. Eine synchrone Nachricht, bei der der Sender auf eine Antwort wartet, hat eine durchgezogene Linie und eine gefüllte Pfeilspitze. Eine Antwort hat eine gestrichelte Linie und eine offene Pfeilspitze. Eine asynchrone Nachricht, bei der der Sender weitermacht, ohne zu warten, hat eine durchgezogene Linie und eine offene Pfeilspitze. Das richtig darzustellen ist architektonisch wichtig: Ob der Bestellservice auf den Zahlungsanbieter wartet oder publiziert und weitermacht, bestimmt seine Latenz, seine Ausfallarten und seine Kopplung (siehe Abschnitt 0.6).

Kombinierte Fragmente ergänzen den Kontrollfluss: Ein Kasten mit der Beschriftung alt und mit Guards versehenen Abschnitten, getrennt durch eine gestrichelte Linie, zeigt Alternativen (if/else), opt zeigt einen optionalen Teil, loop eine Wiederholung und par parallele Abschnitte. Setzen Sie sie sparsam ein; ein Sequenzdiagramm mit verschachtelten Schleifen und Alternativen ist schlecht gezeichneter Code. Zeichnen Sie ein Diagramm je wichtigem Szenario, einschließlich der Fehlerszenarien, in denen das meiste architektonische Denken stattfindet.

Sequenzdiagramm

UML-Sequenzdiagramm zur Bestellaufgabe mit synchronem Zahlungsaufruf, alt-Fragment und asynchronem EreignisSequenzdiagramm: BestellaufgabeKunden-AppBestell-serviceZahlungs-anbieterDB fürBestellungBestellereign.TopicPOST /ordersauthorise(amount, key)resultalt[autorisiert]INSERT Bestellung + Outboxcommitted201 Created[abgelehnt]4xx Zahlung abgelehntOrderPlaced (async, über Outbox-Relay)Leg.Synchroner AufrufAntwortAsynchrone NachrichtAktivierung
Eine Bestellung aufgeben: ein synchroner Aufruf beim Zahlungsanbieter, ein alt-Fragment für die beiden Ergebnisse und am Ende ein asynchrones Ereignis.

Zustandsdiagramme: Lebenszyklen und Regeln

Viele Geschäftsobjekte haben einen Lebenszyklus: eine Bestellung, eine Zahlung, ein Abonnement, ein Versicherungsfall. Ein Zustandsdiagramm beschreibt ihn präzise. Zustände sind abgerundete Rechtecke; ein gefüllter Kreis markiert den Anfangs-Pseudozustand und ein Kreis mit Punkt (Bullseye) den Endzustand. Transitionen sind Pfeile, beschriftet mit event [guard] / action: dem Ereignis, das die Transition auslöst, einer optionalen Guard-Bedingung, die wahr sein muss, und einer optionalen Aktion, die unterwegs ausgeführt wird. Zustände können interne Verhaltensweisen haben, etwa entry / notify restaurant.

Zustandsautomaten sind öfter architekturrelevant, als man erwartet. Der folgende Bestelllebenszyklus wird von mehreren Services geteilt: Die Bestellung besitzt ihn, Disposition und Benachrichtigungen reagieren auf seine Transitionen, und das Supportpersonal kann einige davon auslösen. Sich in einem Diagramm auf die Zustände und die zulässigen Transitionen zu einigen, verhindert eine ganze Klasse von Bugs, bei denen ein Service eine Bestellung für storniert hält, während ein anderer einen Kurier losschickt. Das Diagramm legt auch Fragen offen, die Text verbirgt: Kann eine Bestellung storniert werden, wenn sie bereits in Zustellung ist? (Hier nein: Es gibt keine Transition von diesem Zustand nach Storniert.) Ist eine Erstattung eine Aktion an einer Transition oder ein eigener Lebenszyklus?

Zustandsdiagramm

UML-Zustandsdiagramm: Lebenszyklus einer Bestellung der EssenslieferplattformZustandsdiagramm: BestellzyklusZahlung offenErteiltentry / notify restaurantAngenommenFertigIn Zustellungentry / start trackingZugestelltStorniertpaymentAuthorisedrestaurantAcceptsfoodReadypickedUphandedOver[code matches]/ notify customerpaymentDeclinedrestaurantRejects/ refundcancel[support approves]/ refundLeg.AnfangEndeTransitionslabel: event [guard] / action
Der Bestelllebenszyklus: jede zulässige Transition, mit Ereignissen, Guards und Aktionen, auf einer Seite.

Aktivitätsdiagramme: Workflows und Parallelität

Ein Aktivitätsdiagramm ist ein Flussdiagramm mit präziser Semantik. Abgerundete Rechtecke sind Aktionen; Rauten sind Entscheidungen (mit Guards an den ausgehenden Flüssen) und Zusammenführungen; dicke Balken sind Gabelungen (Forks), die einen Fluss in parallele Flüsse aufteilen, und Vereinigungen (Joins), die auf alle eingehenden Flüsse warten, bevor es weitergeht. Partitionen, oft Swimlanes genannt, zeigen, wer oder was jede Aktion ausführt. Eine Schleife muss über eine Zusammenführungsraute zurückfließen: Zwei Flüsse, die direkt in eine Aktion gezeichnet werden, würden bedeuten, dass die Aktion wie ein Join auf beide wartet.

Architekten nutzen Aktivitätsdiagramme für Geschäftsprozesse und Workflows, die mehrere Teile eines Systems umspannen, besonders wo Parallelität und Verantwortung wichtig sind. Das Beispiel zeigt, dass Essenszubereitung und Kurierzuweisung parallel laufen, dass die Zuweisung so lange wiederholt wird, bis ein Kurier annimmt, und dass die Übergabe auf beides wartet. Das wirft sofort eine architektonische Frage auf: Was, wenn innerhalb von zwanzig Minuten kein Kurier annimmt, während das Essen fertig ist? Das Diagramm macht die Lücke sichtbar; die Antwort könnte eine Timeout-Transition, ein Kompensationsschritt oder eine Änderung am Bestelllebenszyklus sein. Langlaufende Workflows dieser Art werden oft als Sagas oder orchestrierte Workflows implementiert, behandelt in Kapitel 6.

Aktivitätsdiagramm

UML-Aktivitätsdiagramm mit Swimlanes, Fork, Entscheidungsschleife und Join für Zubereitung und KurierzuweisungAktivitätsdiagramm: von der Annahme zur ÜbergabeRestaurantDispo-ServiceBest. annehmenZubereitenKuriere in der NähemergeAuftrag nächstem Kurier[abgelehnt/Timeout][angenommen]An Kurier übergebenFork: beide Zweige laufen parallel.Join: auf beide warten, dann Übergabe.
Essenszubereitung und Kurierzuweisung laufen zwischen einem Fork und einem Join parallel; die Entscheidung wiederholt sich, bis ein Kurier annimmt.

Klassendiagramme, sparsam eingesetzt: das Domänenmodell

Das Klassendiagramm ist das bekannteste UML-Diagramm und dasjenige, das Architekten am sparsamsten einsetzen sollten. Jede Klasse eines Service von Hand zu zeichnen ist der Bauplanmodus in seiner am wenigsten nützlichen Form: Es ist binnen Wochen veraltet, und der Code sagt dasselbe präziser. Wo Klassendiagramme ihren Platz verdienen, ist das Domänenmodell: ein kleines Diagramm der zentralen Geschäftsbegriffe, ihrer Attribute und Beziehungen, über das Entwicklung, Produktmanagement und Fachexperten gemeinsam sprechen können. In der Begriffswelt des Domain-Driven Design (Kapitel 5) erfasst es die Ubiquitous Language eines Bounded Context.

Das Wesentliche ist überschaubar. Ein Klassenkasten hat einen Namen, Attribute und optional Operationen. Eine einfache Linie ist eine Assoziation, optional benannt, mit Multiplizitäten an jedem Ende (1, 0..1, 0..*, 1..*). Eine gefüllte Raute markiert eine Komposition: Die Teile gehören zu genau einem Ganzen und überleben es nicht, so wie Bestellpositionen zu einer Bestellung gehören. Ein hohles Dreieck markiert eine Generalisierung (Vererbung) und eine gestrichelte Linie mit offener Pfeilspitze eine Abhängigkeit. Multiplizitäten tragen echte Designentscheidungen: Order 1 to 0..1 Delivery besagt, dass eine Bestellung höchstens eine Lieferung hat, was ausschließt, eine große Bestellung auf zwei Kuriere aufzuteilen. Falls das Unternehmen das wollen könnte, ist das Diagramm der Ort, an dem die Frage auftaucht.

Klassendiagramm des Domänenmodells

UML-Klassendiagramm des Bestell-Domänenmodells mit Assoziationen, Multiplizitäten und KompositionKlassendiagramm: Bestell-DomänenmodellKundeid: CustomerIdname: StringReihenfolgeid: OrderIdstatus: OrderStatustotal: MoneyplacedAt: InstantRestaurantid: RestaurantIdname: StringOrderLinequantity: intunitPrice: MoneyMenuItemname: Stringprice: MoneyZustellunghandoverCode: StringpickedUpAt: InstantCourierid: CourierIdvehicle: VehicleType10..*places0..*1from1..*0..*10..*10..10..*1Komposition: Teile leben und sterben mit dem GanzenZahlen sind Multiplizitäten: 1, 0..1, 0..*, 1..*
Ein Domänenmodell, klein genug, um es mit dem Fachbereich zu besprechen: zentrale Begriffe, Attribute, Assoziationen und Multiplizitäten.

Die sechs Diagramme auf einen Blick

DiagrammBeantwortetWichtige NotationTypischer Einsatz durch Architekten
KomponenteWas sind die Teile, und über welche Schnittstellen hängen sie voneinander ab?Komponentenkästen, bereitgestellte (Ball) und benötigte (Socket) Schnittstellen, AbhängigkeitenAbhängigkeitsrichtung und austauschbare Teile zeigen; Ports and Adapters
DeploymentWo läuft jeder Teil, wie viele Kopien, wie verbunden?Knoten (3D-Kästen), Artefakte, KommunikationspfadeProduktions- und Staging-Infrastruktur, Netzwerkzonen
SequenzIn welcher Reihenfolge interagieren die Beteiligten in diesem Szenario?Lebenslinien, Aktivierungen, synchrone und asynchrone Nachrichten, Antworten, FragmenteWichtige Laufzeitszenarien, besonders Fehler, Wiederholungen und Integrationen
ZustandsautomatIn welchen Zuständen kann dieses Objekt sein, und was bewegt es zwischen ihnen?Zustände, Anfangs- und Endzustände, Transitionen mit event [guard] / actionLebenszyklen, die sich Services teilen: Bestellungen, Zahlungen, Schadensfälle
AktivitätWie sieht der Workflow aus, wer erledigt jeden Schritt, was läuft parallel?Aktionen, Entscheidungen, Forks und Joins, PartitionenGeschäftsprozesse, langlaufende Workflows, Sagas
KlasseWas sind die zentralen Begriffe, und wie hängen sie zusammen?Klassen, Assoziationen, Multiplizitäten, Komposition, GeneralisierungKleine Domänenmodelle; aus Code generierte Diagramme

Wann UML zu viel ist und wann Präzision zählt

UML ist zu viel, wenn das Publikum sie nicht kennt und die Frage sie nicht braucht: Ein C4-Kontextdiagramm vermittelt Führungskräften mehr als ein UML-Anwendungsfalldiagramm, und eine Whiteboard-Skizze ist das richtige Werkzeug für eine Designdiskussion, die in einer Stunde vorbei ist. Sie ist zu viel, wenn Diagramme von Hand gepflegt werden, die man generieren könnte, und wenn strikte Notation in einer Skizze erzwungen wird, die dem Erkunden dient. Fowlers Beobachtung, dass die in UML 2 hinzugekommene Präzision vor allem den Nutzern von Bauplan und Programmiersprache dient und die Skizzierenden belastet, gilt nach wie vor.

Präzision zahlt sich aus, wenn Missverständnisse teuer sind. Schnittstellen zwischen Unternehmen sind der klarste Fall: Wenn das Essenslieferunternehmen einen Zahlungsanbieter oder das Bestellsystem einer großen Restaurantkette anbindet, baut jede Seite gegen die Beschreibung der anderen und entdeckt Unstimmigkeiten erst im Test oder in der Produktion. Ein präzises Sequenzdiagramm des Zahlungsablaufs, einschließlich Timeouts, Wiederholungen, Idempotenzschlüsseln und Webhooks, an die Schnittstellenspezifikation angehängt, ist eine günstige Versicherung. Regulierte und sicherheitskritische Branchen (Medizinprodukte, Bahn, Luftfahrt, Automobil, manche Finanzsysteme) verlangen oft eine Designdokumentation, die Prüfer von den Anforderungen bis zur Implementierung nachverfolgen können; formale UML oder ihr Verwandter aus dem Systems Engineering, SysML, ist dort verbreitet. Nebenläufigkeits- und Lebenszyklusregeln, die sich mehrere Teams teilen, wie die obigen Bestellzustände, profitieren von einer Notation, die jede Transition ausdrücklich verlangt. Und ausgelagerte oder verteilte Entwicklung, bei der die Umsetzenden den Autor eines Designs nicht ohne Weiteres fragen können, braucht Beschreibungen, die weniger Raum für Interpretation lassen.

Häufige Fragen

Sollte unser Team überhaupt UML lernen?

Lernen Sie die Notationsgrundlagen der sechs Diagramme dieses Abschnitts; das dauert ein paar Stunden und gibt dem Team ein gemeinsames Vokabular für Schnittstellen, Interaktionen und Lebenszyklen. Die übrigen Diagrammtypen oder die vollständige Spezifikation müssen Sie kaum lernen, es sei denn, Sie arbeiten in einer Domäne, die sie verlangt.

Wie verhält sich UML zu C4?

Beide ergänzen sich. C4 liefert eine kleine Menge von Abstraktionen und eine Hierarchie struktureller Diagramme; UML liefert präzise Notationen, besonders für Verhalten. Viele Teams nutzen C4 für Kontext-, Container- und Komponentensichten und UML für Sequenz-, Zustands- und gelegentlich Deployment-Diagramme.

Kann ich UML mit Text statt mit einem Zeichenwerkzeug erstellen?

Ja. PlantUML und Mermaid erzeugen beide Sequenz-, Zustands-, Klassen- und Aktivitätsdiagramme aus kurzen Textdateien, die in der Versionsverwaltung liegen können. Abschnitt 4.7 zeigt Beispiele.

Prüfen Sie Ihr Verständnis

Wie unterscheiden Sie in einem Sequenzdiagramm einen synchronen Aufruf von einer asynchronen Nachricht?

Ein synchroner Aufruf hat eine durchgezogene Linie mit gefüllter Pfeilspitze (der Sender wartet); eine asynchrone Nachricht hat eine durchgezogene Linie mit offener Pfeilspitze (der Sender macht weiter). Antworten sind gestrichelte Linien mit offenen Pfeilspitzen.

Was bedeutet das Label handedOver [code matches] / notify customer an einer Transition?

Wenn das Ereignis handedOver eintritt und der Guard „code matches“ (der Code stimmt) wahr ist, feuert die Transition, und die Aktion „notify customer“ (Kunden benachrichtigen) wird ausgeführt.

Warum sollten Architekten Klassendiagramme ganzer Services nur selten von Hand zeichnen?

Sie wiederholen, was der Code präziser aussagt, und veralten schnell; kleine Domänenmodelle lohnen das Zeichnen, und vollständige Diagramme lassen sich bei Bedarf generieren.

Nennen Sie zwei Situationen, in denen sich präzise UML lohnt.

Zum Beispiel Schnittstellen zwischen Unternehmen, regulierte oder sicherheitskritische Entwicklung, Lebenszyklen, die sich mehrere Teams teilen, oder ausgelagerte Entwicklung, bei der die Umsetzenden die Designer nicht ohne Weiteres fragen können.

Weiter · 4.5EntscheidungsdokumentationWie man bedeutsame Entscheidungen so festhält, dass ihre Gründe erhalten bleiben: Nygards Format, MADR und Y-Statements, Status und Ablösung, wo man die Aufzeichnungen aufbewahrt, was eine verdient, Review und Anti-Patterns.Weiter →

Quellen und weiterführende Literatur

Haben Sie eine Frage zu diesem Abschnitt? ArchitectBot, der KI-Lernassistent des Kurses, antwortet zuerst aus dem Kurs.

Fragen: „Welche UML-Diagramme sollte ich in eine Schnittstellenspezifikation für ein Partnerunternehmen aufnehmen, das unsere API anbindet?“