填了多年的表格、等了多年之后,你终于拿到了银行牌照。这意味着你正式有资格开一家自己的银行了,太好了!
你的首要任务是让 IT 系统跑起来。经过一天的辛苦工作,你已经能开户、销户,还能处理取款和存款了。
你懒得写测试,于是请了几个朋友来帮忙测试系统。可是才过了五分钟,就有个朋友说自己丢钱了!你虽然确信自己的代码没有 bug,还是开始翻日志,想查个究竟。
啊哈,果然如你所料,问题出在你朋友身上!他把自己的测试凭据分享给了另一个朋友,两人合谋对同一个账户_并行_地存取款。谁会干这种事?
你争辩说,一个人物理上_不可能_并行访问自己的账户,朋友却得意地告诉你,银行规则_要求_你必须支持这种操作。所以,不支持并行银行操作,就拿不到上线许可。你叹了口气,默默记下明天要处理这件事。这会让你的上线日期_至少_再推迟一天,不过嘛……
你的任务是实现银行账户,支持开立、关闭、取款和存款。
由于银行账户可以通过多种方式访问(互联网、手机、自动扣款),你的银行软件必须允许从多个线程/进程(具体术语取决于你的编程语言)并行、安全地访问账户。 例如,可能有许多存款和取款同时发生,你需要确保在读取账户余额和设置新余额之间不存在竞态条件。
账户应当可以关闭;针对已关闭账户的操作必须失败。
要完成这个练习,你需要实现以下函数:
openAccount:每次测试开始时调用。返回一个 BankAccount。closeAccount:每次测试结束时调用。getBalance:获取银行账户的余额。updateBalance:按给定的金额增加银行账户的余额。取款时,金额也可以是负数。
银行账户的初始余额应为 0。
你会发现代码里已经有一个占位的数据声明和类型签名,但定义这些函数,以及创建一个有意义的数据类型、newtype 或类型同义词,都要由你来完成。
如果需要帮助,这里还有一些额外的资源: