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.
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#
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é
- 01Smažte atribut balance - odvoďte ho ze zápisů, jinak si dvě kopie jednoho faktu budou odporovat.
- 02Převod je jedna Transaction složená z právě dvou Posting, které dají v součtu nulu.
- 03Kompozice, ne asociace: nemůžete smazat polovinu převodu a storno je nový převod.
- 04Životní cyklus modelujte tam, kde na něm závisí pravidla, a chybějící přechody čtěte první.
- 05Pojmenujte stráž na přechodu; samotné "reject" nechává důvod na čtenáři.
- 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
- 01Co je UML?
- 02Symboly UML
- 03Výběr diagramu
- 04Diagramy tříd
- 05Příklady diagramů tříd
- 06Jak nakreslit diagram tříd
- 07Symboly diagramu tříd
- 08Sekvenční diagramy
- 09Příklady sekvenčních diagramů
- 10Jak nakreslit sekvenční diagram
- 11Diagramy případů užití
- 12Příklady případů užití
- 13Diagramy aktivit
- 14Příklady aktivit
- 15Stavové diagramy
- 16Příklady stavových diagramů
- 17Diagramy komponent
- 18Příklady komponent
- 19Kreslení diagramu komponent
- 20Symboly komponent
- 21Diagramy nasazení
- 22Příklady nasazení
- 23Diagramy objektů
- 24Diagramy balíků
- 25Diagramy složené struktury
- 26Komunikační diagramy
- 27Sekvenční vs komunikační
- 28Časové diagramy
- 29Diagramy přehledu interakcí
- 30Diagramy profilů
- 31UML pomocí AI
- 32Příklad e-shopu
- 33Příklad banky
- 34Příklad mikroslužeb
- 35Příklad AWS
Související články
Diagramy struktury
Diagramy chování
Praxe modelování
Základy
Praxe modelování
Praxe modelování