Archyno
UMLModellierungspraxis

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.
UML-Klassendiagramm einer Bankdomäne. Customer hält ein oder mehrere Account. Ein Account hat null oder mehr Posting. Eine Transaction ist aus genau zwei Posting komponiert, die in der Summe null ergeben müssen.
Das Hauptbuch. Beachten Sie, was Account nicht hat: ein balance-Attribut. Es hat balance() - eine Operation, die die Buchungen summiert - und diese eine Entscheidung ist es, die das Modell ehrlich hält.

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#

UML-Zustandsautomatendiagramm für eine Banküberweisung. Vom Startzustand geht sie nach Requested. Requested geht bei authorise nach Authorised oder bei reject nach Rejected. Authorised geht bei settle nach Settled, und Settled erreicht den Endzustand.
Der Lebenszyklus einer Überweisung. Vier Zustände, und der nützliche Teil ist, was fehlt: es gibt keinen Pfeil von Rejected zurück zu Authorised und keinen von Settled irgendwohin.

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

  1. 01Löschen Sie das balance-Attribut - leiten Sie es aus den Buchungen ab, sonst widersprechen sich zwei Kopien einer Tatsache.
  2. 02Eine Überweisung ist eine Transaction aus genau zwei Posting, die in der Summe null ergeben.
  3. 03Komposition, nicht Assoziation: Sie können keine halbe Überweisung löschen, und eine Stornierung ist eine neue.
  4. 04Modellieren Sie den Lebenszyklus, wo Regeln von ihm abhängen, und lesen Sie die fehlenden Übergänge zuerst.
  5. 05Benennen Sie den Wächter am Übergang; "reject" allein überlässt den Grund der Leserin.
  6. 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

Passend dazu

Alle Artikel