經過多年填表和等待,你終於拿到銀行執照了。這代表你現在正式有資格開設屬於自己的銀行,太棒了!
你的第一要務,就是讓資訊系統順利運作起來。經過一整天的努力,你已經可以開立和關閉帳戶,也能處理提款和存款了。
因為你懶得寫測試,所以你邀請了幾位朋友來幫忙測試系統。然而,才過了五分鐘,其中一位朋友就說他們的錢不見了!雖然你對自己的程式碼很有信心,確信它沒有 bug,但你還是開始翻查日誌來調查。
啊,果然如你所料,是你的朋友有問題!他們把自己的測試憑證分享給另一位朋友,兩個人一起密謀,_同時_從同一個帳戶存款和提款。誰會做這種事啊?
當你主張一個人_不可能_同時存取自己的帳戶時,你的朋友得意地提醒你,銀行規則_要求_你必須支援這種情況。所以說,沒有支援並行銀行作業,就沒有上線的許可。你嘆了口氣,在心裡記下明天要處理這件事。這會讓你的上線日期_至少_再延後一天,不過,唉……
你的任務是實作銀行帳戶,支援開戶/關閉帳戶、提款與存款。
由於銀行帳戶可以透過許多不同的方式存取(網路、手機、自動扣款),你的銀行軟體必須讓帳戶能被多個執行緒/行程(術語取決於你使用的程式語言)安全地平行存取。 例如,可能同時有許多筆存款與提款正在進行;你需要確保在讀取帳戶餘額與設定新餘額之間不會發生競爭條件。
帳戶應該要可以關閉;對已關閉帳戶進行的操作必須失敗。
Python 因為全域解譯器鎖的關係,並不支援「真正的」並行處理。 雖然為 Python 的自由執行緒 提供支援的工作仍在進行中,但它仍屬於實驗階段。 目前標準函式庫的方案,例如 multiprocessing 和 threading,在現有的 track 工具鏈下難以實作。
因此,這個練習已暫時擱置並行處理的要求。 帳戶操作會在單一執行緒上依序進行,也不會執行任何並行或「競態條件」的測試。
如果你想實驗自由執行緒或並行測試,我們請你在本機進行。 如需協助在本機下載練習並進行解題,我們推薦使用 Exercism CLI。
有時候,我們必須引發例外。這麼做時,你應該一律附上有意義的錯誤訊息,指出錯誤的來源是什麼。這會讓你的程式碼更容易閱讀,對除錯也有很大的幫助。如果你確知錯誤來源會是某個特定的型別,可以選擇引發其中一種內建錯誤型別,但還是應該附上有意義的訊息。
這個練習要求你使用 raise 敘述來「拋出」ValueError,用於帳戶已開啟或未開啟,或是提款/存款金額不正確的情況。只有同時 raise 這個 exception 並附上訊息,測試才會通過。
若要引發帶有訊息的 ValueError,請把訊息寫成 exception 型別的引數:
# account is not open
raise ValueError('account not open')
# account is already open
raise ValueError('account already open')
# incorrect withdrawal/deposit amount
raise ValueError('amount must be greater than 0')
# withdrawal is too big
raise ValueError('amount must be less than balance')