Ein Bankensystem in UML
Die meisten Bankbeispiele modellieren ein Konto als Saldo mit einer Einzahlmethode - genau das, was keine Bank tut. Hier die Fassung auf Basis der doppelten Buchführung, dazu der Zustandsautomat, der entscheidet, was eine Überweisung als Nächstes darf.
8 Min. LesezeitUML 2.5.133 von 35
Die kurze Antwort
- Modellieren Sie einen Saldo als abgeleitete Operation, nicht als gespeichertes Attribut. balance() summiert die Buchungen; eine gespeicherte Kopie kann sich nicht belegen.
- Eine Überweisung ist eine Transaktion aus genau zwei Buchungen mit Summe null. Ein Pfeil zwischen Konten verliert die Atomarität, die das Modell schützen soll.
- Ein Bankensystem braucht ein Klassendiagramm fürs Hauptbuch, je einen Zustandsautomaten pro Lebenszyklus und ein Komponentendiagramm für die Systemgrenze.
- Ein Geldautomat ist ein Kanal und gehört zu den übrigen Kanälen. Ihn neben die Konten zu stellen ist das klassische Übungsdiagramm.
01Das Konto hat keinen Saldo#
Nahezu jedes Bankbeispiel im Internet gibt Account ein balance-Attribut und ein Paar Methoden, die darauf addieren und davon subtrahieren. Das ist das Erste, was zu löschen ist, denn kein prüfbares Hauptbuch funktioniert so.
Ein gespeicherter Saldo ist eine zweite Kopie einer Tatsache, die die Buchungen bereits enthalten. Zwei Kopien einer Tatsache können sich widersprechen, und wenn sie es tun - ein Teilausfall, eine wiederholte Nachricht, eine Migration - lässt sich nicht sagen, welche stimmt, weil der Saldo keine Historie trägt, an der man ihn prüfen könnte. Ihn abzuleiten, wie balance() in der Abbildung oben, macht Widerspruch schon durch die Konstruktion unmöglich.
02Eine Überweisung ist eine Sache mit zwei Wirkungen#
Die Komposition rechts in der Titelabbildung ist die zweite tragende Entscheidung. Eine Transaction ist aus genau zwei Buchungen komponiert - die Multiplizität sagt 2, nicht 0..* - und sie ergeben per Konvention in der Summe null: Geld verlässt ein Konto und kommt auf einem anderen an.
Eine Assoziation direkt von Account zu Account zu zeichnen, der naheliegende erste Versuch, verliert beide Hälften davon. Sie verliert die Atomarität, denn zwei Pfeile können unabhängig existieren, und eine Überweisung kann nicht halb geschehen. Und sie verliert die Referenz: eine Transaktion ist etwas, wonach Kunden per Nummer fragen, was sie beanstanden und stornieren - also eine Entität und keine Linie zwischen zwei anderen.
Die gefüllte Raute sagt dann, dass die Buchungen mit der Transaktion sterben. Das ist richtig und zugleich eine Einschränkung für den Code: Sie können keine halbe Überweisung löschen, und eine Stornierung ist eine neue Transaktion statt einer Änderung der alten. Der Leitfaden zum Klassendiagramm hat die vollständigen Regeln, wann eine Raute gefüllt ist.
03Was eine Überweisung als Nächstes tun darf#
Ein Zustandsautomat verdient seinen Platz immer dann, wenn ein Objekt einen Lebenszyklus hat, von dem Regeln abhängen, und Geld in Bewegung ist der Archetyp. Der Wert sind nicht die vier Kästen, die jeder erraten könnte - es sind die Übergänge, die fehlen.
Settled hat keinen ausgehenden Übergang. Das sagt, dass eine ausgeglichene Überweisung endgültig ist und eine Stornierung eine andere Transaktion statt einer Zustandsänderung - dieselbe Aussage, die die Komposition im Domänenmodell gemacht hat. Rejected hat auch keinen: eine Genehmigung nach einer Ablehnung startet eine neue Überweisung. Wächter machen den Rest ausdrücklich - reject [limit]benennt das Warum, und ein Diagramm, das nur "reject" sagt, überlässt den Grund der Leserin.
In je einer Zeile
- 01Löschen Sie das balance-Attribut - leiten Sie es aus den Buchungen ab, sonst widersprechen sich zwei Kopien einer Tatsache.
- 02Eine Überweisung ist eine Transaction aus genau zwei Posting, die in der Summe null ergeben.
- 03Komposition, nicht Assoziation: Sie können keine halbe Überweisung löschen, und eine Stornierung ist eine neue.
- 04Modellieren Sie den Lebenszyklus, wo Regeln von ihm abhängen, und lesen Sie die fehlenden Übergänge zuerst.
- 05Benennen Sie den Wächter am Übergang; "reject" allein überlässt den Grund der Leserin.
- 06Kanäle - Geldautomat, App, Filiale - gehören auf ein Komponentendiagramm, nicht ins Hauptbuch.
Für dieselbe Behandlung einer anderen Domäne siehe E-Commerce-Architektur, modelliert. Für die datenmodellierende Hälfte eines Hauptbuchs - Schlüssel, Kardinalität und das Schema darunter - siehe ER-Diagramme.
04Häufige Fragen#
Wie modelliert man einen Kontosaldo in UML?
Als abgeleitete Operation statt als gespeichertes Attribut: balance() summiert die Buchungen des Kontos. Ein gespeicherter Saldo ist eine zweite Kopie einer Tatsache, die das Buch bereits enthält - und an dem Tag, an dem beide auseinandergehen, lässt sich nicht sagen, welche falsch ist.
Wie zeigt man eine Überweisung zwischen zwei Konten?
Als eine Transaktion aus genau zwei Buchungen, einer negativen und einer positiven, deren Summe null ist. Ein Pfeil von Konto zu Konto verliert, dass eine Überweisung eine einzige atomare Sache mit zwei Wirkungen ist - und genau diese Atomarität soll das Modell schützen.
Welche UML-Diagramme braucht ein Bankensystem?
Ein Klassendiagramm für das Hauptbuch, einen Zustandsautomaten für alles mit Lebenszyklus - Überweisungen, Karten, Anträge - und ein Komponentendiagramm für die Grenze zu Zahlungssystemen und Kernbanksystem. Sequenzdiagramme lohnen für die zwei, drei Abläufe, bei denen die Reihenfolge wirklich strittig ist.
Gehört ein Geldautomat auf dasselbe Diagramm wie die Konten?
Nein. Ein Geldautomat ist ein Kanal und gehört mit den übrigen Kanälen auf ein Komponenten- oder Verteilungsdiagramm; das Hauptbuchdiagramm handelt davon, was eine Transaktion ist. Beides zu mischen ergibt das klassische Übungsdiagramm, in dem ein Gerät mit einem Buchhaltungsbegriff assoziiert ist.
In dieser Reihe
- 01Was ist UML?
- 02UML-Symbole
- 03Diagramm auswählen
- 04Klassendiagramme
- 05Klassendiagramm-Beispiele
- 06Klassendiagramm zeichnen
- 07Klassendiagramm-Symbole
- 08Sequenzdiagramme
- 09Sequenzdiagramm-Beispiele
- 10Sequenzdiagramm zeichnen
- 11Anwendungsfalldiagramme
- 12Anwendungsfall-Beispiele
- 13Aktivitätsdiagramme
- 14Aktivitätsbeispiele
- 15Zustandsdiagramme
- 16Zustandsdiagramm-Beispiele
- 17Komponentendiagramme
- 18Komponenten-Beispiele
- 19Komponentendiagramm zeichnen
- 20Komponenten-Symbole
- 21Verteilungsdiagramme
- 22Verteilungsbeispiele
- 23Objektdiagramme
- 24Paketdiagramme
- 25Kompositionsstrukturdiagramme
- 26Kommunikationsdiagramme
- 27Sequenz vs Kommunikation
- 28Zeitverlaufsdiagramme
- 29Interaktionsübersichtsdiagramme
- 30Profildiagramme
- 31UML mit KI
- 32E-Commerce-Beispiel
- 33Banken-Beispiel
- 34Microservices-Beispiel
- 35AWS-Beispiel
Passend dazu
Strukturdiagramme
Verhaltensdiagramme
Modellierungspraxis
Grundlagen
Modellierungspraxis
Modellierungspraxis