Archyno
UMLPraxe modelování

Bankovní systém v UML

Většina bankovních příkladů modeluje účet jako zůstatek s metodou vlož, což je přesně to jediné, co žádná banka nedělá. Tady je verze postavená na podvojném účetnictví a k tomu stavový automat, který rozhoduje, co smí převod udělat dál.

8 min čteníUML 2.5.133 z 35

Krátká odpověď

  • Zůstatek modelujte jako odvozenou operaci, ne uložený atribut. balance() sečte pohyby; uložená kopie nemá jak dokázat, že je správná.
  • Převod je jedna transakce složená přesně ze dvou pohybů se součtem nula. Šipka mezi účty ztrácí atomicitu, kterou má model chránit.
  • Bankovní systém potřebuje diagram tříd na účetní knihu, stavový automat na každý životní cyklus a diagram komponent na hranici se schématy.
  • Bankomat je kanál a patří k ostatním kanálům. Postavit ho vedle účtů je klasický školní diagram.
UML diagram tříd bankovní domény. Customer drží jeden nebo více Account. Account má nula nebo více Posting. Transaction je složená z právě dvou Posting, které musí dát v součtu nulu.
Účetní kniha. Všimněte si, co Account nemá: atribut balance. Má balance() - operaci, která sečte zápisy - a právě tohle jediné rozhodnutí drží model poctivý.

01Účet nemá zůstatek#

Téměř každý bankovní příklad na internetu dá třídě Account atribut balance a dvojici metod, které k němu přičítají a odečítají. Je to první věc ke smazání, protože žádná účetní kniha, která musí být auditovatelná, takhle nefunguje.

Uložený zůstatek je druhá kopie faktu, který zápisy už obsahují. Dvě kopie jednoho faktu si mohou odporovat, a když si odporují - částečné selhání, opakovaná zpráva, migrace - nedá se zjistit, která je správná, protože zůstatek nenese historii, proti které by se dal ověřit. Odvodit ho, jako balance() na obrázku výše, dělá rozpor nemožným už konstrukcí.

02Převod je jedna věc se dvěma účinky#

Kompozice vpravo na titulním obrázku je druhé nosné rozhodnutí. Transaction je složená z právě dvou zápisů - násobnost říká 2, ne 0..* - a konvencí dávají v součtu nulu: peníze z jednoho účtu odejdou a na druhý přijdou.

Nakreslit asociaci z Account rovnou na Account, což je zřejmý první pokus, ztratí obě ty poloviny. Ztratí atomicitu, protože dvě šipky mohou existovat nezávisle a převod se nemůže stát napůl. A ztratí referenci: transakce je věc, na kterou se zákazníci ptají podle čísla, rozporují ji a stornují, což znamená, že je entitou, a ne čárou mezi dvěma jinými.

Plný kosočtverec pak říká, že zápisy zemřou s transakcí. To je správné a je to zároveň omezení pro kód: nemůžete smazat polovinu převodu a storno je nová transakce, ne úprava té staré. Průvodce diagramem tříd má kompletní pravidla, kdy je kosočtverec plný.

03Co smí převod udělat dál#

UML diagram stavového automatu pro bankovní převod. Z počátečního stavu přechází do Requested. Requested jde na authorise do Authorised, nebo na reject do Rejected. Authorised jde na settle do Settled a Settled dosáhne koncového stavu.
Životní cyklus převodu. Čtyři stavy, a užitečná část je to, co chybí: neexistuje šipka z Rejected zpět do Authorised a žádná ze Settled kamkoli.

Stavový automat si zaslouží místo vždy, když má objekt životní cyklus, na kterém závisí pravidla, a pohyb peněz je archetyp. Hodnotou nejsou ty čtyři boxy, které by uhodl každý - jsou to přechody, které chybí.

Settled nemá odchozí přechod. To říká, že vyrovnaný převod je konečný a storno je jiná transakce, ne změna stavu - což je totéž tvrzení, jaké udělala kompozice na doménovém modelu. Rejected ho nemá také: schválení po zamítnutí začíná nový převod. Stráže dělají zbytek explicitním - reject [limit]pojmenovává proč, a diagram, který říká jen "reject", nechává důvod na čtenáři.

Po jednom řádku na každé

  1. 01Smažte atribut balance - odvoďte ho ze zápisů, jinak si dvě kopie jednoho faktu budou odporovat.
  2. 02Převod je jedna Transaction složená z právě dvou Posting, které dají v součtu nulu.
  3. 03Kompozice, ne asociace: nemůžete smazat polovinu převodu a storno je nový převod.
  4. 04Životní cyklus modelujte tam, kde na něm závisí pravidla, a chybějící přechody čtěte první.
  5. 05Pojmenujte stráž na přechodu; samotné "reject" nechává důvod na čtenáři.
  6. 06Kanály - bankomat, aplikace, pobočka - patří na diagram komponent, ne do účetní knihy.

Pro totéž zpracování jiné domény viz e-shopovou architekturu, namodelovanou. Pro datovou polovinu účetní knihy - klíče, kardinalitu a schéma pod tím - viz ER diagramy.

04Časté dotazy#

Jak se má v UML modelovat zůstatek na účtu?

Jako odvozená operace, ne jako uložený atribut: balance() sečte pohyby na účtu. Uložený zůstatek je druhá kopie údaje, který kniha už obsahuje, a v den, kdy se obě rozejdou, nejde zjistit, která je špatně - přesně proto si ho skutečné účetní knihy nedrží.

Jak zobrazit převod mezi dvěma účty?

Jako jednu transakci složenou přesně ze dvou pohybů, jednoho záporného a jednoho kladného, které dávají součet nula. Šipka z jednoho účtu na druhý ztrácí fakt, že převod je jedna atomická věc se dvěma důsledky - a právě tuhle atomicitu má celý model chránit.

Jaké UML diagramy potřebuje bankovní systém?

Diagram tříd na účetní knihu, stavový automat na cokoli se životním cyklem - převody, karty, žádosti - a diagram komponent na hranici s platebními schématy a jádrovým bankovnictvím. Sekvenční diagramy pomohou u dvou tří toků, kde je pořadí opravdu sporné.

Má být bankomat na stejném diagramu jako účty?

Ne. Bankomat je kanál a patří na diagram komponent nebo nasazení k ostatním kanálům; diagram účetní knihy je o tom, co je transakce. Míchání obojího vyrobí klasický školní diagram, kde je hardwarové zařízení v asociaci s účetním pojmem.

V této sérii

Související články

Všechny články