Kurzusok
/
Roc
Roc
/
Feladatok
/
Bankszámla
Bankszámla

Bankszámla

Könnyű

Bevezetés

Miután évekig töltötted ki az űrlapokat és vártál, végre megszerezted a banki engedélyedet. Ez azt jelenti, hogy hivatalosan is jogosult vagy arra, hogy saját bankot nyiss, hurrá!

Az elsődleges feladatod, hogy az informatikai rendszereket működésbe hozd. Egy kemény munkanap után már tudsz számlákat nyitni és zárni, valamint kezelni tudod a pénzfelvételeket és a befizetéseket.

Mivel nem volt kedved teszteket írni, meghívsz néhány barátot, hogy segítsenek tesztelni a rendszert. Öt perc után azonban az egyik barátod azt állítja, hogy elveszítette a pénzét! Bár biztos vagy benne, hogy a kódod hibamentes, elkezded átnézni a naplókat, hogy kivizsgáld a dolgot.

Ah, igen, ahogy sejtetted, a barátod a hibás! Megosztotta a tesztelési hitelesítő adatait egy másik barátjával, és együtt összeesküdtek, hogy ugyanazon a számlán párhuzamosan fizessenek be és vegyenek fel pénzt. Ki tenne ilyet?

Miközben te azzal érvelsz, hogy fizikailag lehetetlen, hogy valaki párhuzamosan férjen hozzá a számlájához, a barátod önelégülten közli, hogy a banki szabályok megkövetelik, hogy támogasd ezt. Így hát nincs párhuzamos banki támogatás, nincs élesítési jelzés. Sóhajtva feljegyzed magadnak, hogy holnap foglalkoznod kell ezzel. Ez legalább egy nappal kitolja az indulás dátumát, de hát...

Utasítások

A feladatod, hogy bankszámlákat valósíts meg, amelyek támogatják a nyitást, a zárást, a pénzfelvételt és a befizetést.

Mivel a bankszámlákat sokféle módon el lehet érni (interneten, mobiltelefonon, automatikus terheléssel), a banki szoftverednek lehetővé kell tennie, hogy a számlákat több szálból vagy folyamatból (a megnevezés a programozási nyelvedtől függ) párhuzamosan, biztonságosan el lehessen érni. Előfordulhat például, hogy sok befizetés és pénzfelvétel zajlik párhuzamosan; gondoskodnod kell róla, hogy ne alakuljon ki versenyhelyzet aközött, amikor kiolvasod a számla egyenlegét, és amikor beállítod az új egyenleget.

A számlát le is kell tudni zárni; a lezárt számlával szembeni műveleteknek sikertelennek kell lenniük.

A Roc és a hoszt feladatai

A Rocban általában az üzleti logikára összpontosítunk, az egyidejűséget és a megosztott állapotot pedig a platform kezeli. Ezért ebben a feladatban csak a számlaműveleteket kell megvalósítanod a BankAccount.roc fájlban, és nem kell az egyidejűséggel foglalkoznod. A számlák zárt állapotban indulnak, az újranyitás nullára állítja az egyenleget, a befizetéseknek és a kifizetéseknek pedig pozitívnak kell lenniük.

Opcionális szerverdemó

A mellékelt bank-account-demo.roc megmutatja, hogyan használható a megvalósításod egy kis webszolgáltatásban. Elolvashatod a szerkesztőben, de független a tesztektől, és nem része a megoldásodnak.

A demó futtatásához telepítsd a Rocot a gépedre, telepítsd az Exercism CLI-t, majd futtasd a következő parancsot egy terminálban:

exercism download --exercise=bank-account --track=roc

Ezután valósítsd meg a BankAccount.roc-t, és teszteld a következő paranccsal (ha a CLI által kiírt letöltési hely eltér az alábbi útvonaltól, azt írd át):

cd ~/Exercism/roc/bank-account
roc test bank-account-test.roc

Ha minden teszt sikeres, a következő paranccsal indíthatod el a demószervert:

roc bank-account-demo.roc

A szerver a basic-webserver platformot használja a beépített SQLite-támogatásával együtt (a Roc az első futtatáskor letölti a platformot). Külön adatbázisszerverre nincs szükség. A szerver a http://127.0.0.1:8000 címen figyel, és létrehozza a bank-account-demo.db fájlt az aktuális könyvtáradban (ha más adatbázisfájlt szeretnél, állítsd be a DB_PATH-t). A szervert Ctrl-C-vel állíthatod le. Az adatok újraindítás után is megmaradnak.

Egy másik terminálban curl-lel hívhatod a webszolgáltatást (Windowson végig a curl.exe-t használd, hogy elkerüld a PowerShell curl álnevét). Például így nyithatod meg a 123-as számlát, fizethetsz be 50-et, vehetsz ki 10-et, és ellenőrizheted az egyenlegét:

curl -X POST http://127.0.0.1:8000/accounts/123/open
curl -X POST http://127.0.0.1:8000/accounts/123/deposit/50
curl -X POST http://127.0.0.1:8000/accounts/123/withdraw/10
curl http://127.0.0.1:8000/accounts/123/balance

Az egyenleg 40. A számlaazonosítóknak és az összegeknek előjel nélküli egész számoknak kell lenniük. A módosítások siker esetén OK-t adnak vissza, hiba esetén pedig a számlamegvalósításod hibáját. A 123-as számla lezárásához:

curl -X POST http://127.0.0.1:8000/accounts/123/close

Ha Linuxon vagy macOS-en szeretnél egyidejű kéréseket kipróbálni, használj új számlaazonosítót, és küldj 100 befizetést nyolc kliensről:

curl -X POST http://127.0.0.1:8000/accounts/456/open
seq 100 | xargs -P 8 -I '{}' curl --fail --silent --show-error -X POST http://127.0.0.1:8000/accounts/456/deposit/1
curl http://127.0.0.1:8000/accounts/456/balance

Windowson a párhuzamos példához a PowerShell 7+ verzióra lesz szükséged:

curl.exe -X POST http://127.0.0.1:8000/accounts/456/open
1..100 | ForEach-Object -Parallel { curl.exe --fail --silent --show-error -X POST http://127.0.0.1:8000/accounts/456/deposit/1 } -ThrottleLimit 8
curl.exe http://127.0.0.1:8000/accounts/456/balance

A befizetéseknek mind sikerülniük kell, az egyenlegnek pedig 100-nak kell lennie.

Hogyan kezeli a demó az egyidejűséget

Minden kérés beolvassa a számlát, meghívja a Roc-függvényeidet, és az eredményt egy SQLite Immediate tranzakción belül menti el. A sikertelen műveletek visszagördülnek, és nem módosítják a számlát. Az SQLite egyszerre csak egy írót engedélyez, így az egyidejű kérések nem írhatják felül egymás módosításait (még különböző számlák esetén sem).

Megjegyzés: a feladat U64-et használ, a demó viszont SQLite-egészként tárolja az egyenlegeket, és elutasítja a maximális I64 értéket (9223372036854775807) meghaladó módosításokat.

Ha kíváncsi vagy rá, hogyan lehet független számításokat párhuzamosan futtatni, próbáld ki a Parallel Letter Frequency feladatot.

Tippek

Tippek megjelenítése

A match-csel tudod megkülönböztetni, hogy egy számla Closed, vagy Open(balance). Egy művelet frissített számlát ad vissza, ahelyett hogy módosítaná a kapott számlát. Sikeres módosításhoz az Ok(updated_account), elutasított művelethez az Err(...) konstrukciót használd.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Roc Exercism

Készen állsz elkezdeni a(z) Bankszámla feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Roc nyelvet 135 feladat segítségével, valódi emberi mentorálással, mindez ingyen.