銀行台帳
CoddyのRubyジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 57/57。
チャレンジ
難しい小さな銀行を作成してください。BankError < StandardError は、メッセージ invalid amount、insufficient funds in 2、withdrawal limit on 2、no account 9 を持つ InvalidAmount、InsufficientFunds、LimitReached、NoAccount の親クラスです。Account.new(id, owner) には id、owner、balance のリーダーがあり、残高には private setter があります。deposit(amount) と withdraw(amount) は 1 未満の場合に InvalidAmount を発生させます。withdraw は、残高が lowest_balance(0 を返すフック)を下回る場合に InsufficientFunds を発生させます。month_end は何もせず、kind は口座の種類を返します。Checking では -100 までの当座貸越が可能です。Savings では 1 か月あたり最大 2 回まで引き出しが可能で(LimitReached)、その month_end は 1% の利息を切り捨てで加算し、回数をリセットします。to_s は 1 ada checking: -20 を返します。Bank#open(kind, id, owner) は Checking または Savings を作成し、account(id) は NoAccount を発生させます。transfer(from, to, amount) は引き出しと入金を行う前に両方の口座を検索し、month_end はすべての口座でそれを呼び出します。また、Bank は Enumerable を include し、each は ID 順に口座を yield します。
提供されたコードは、コマンド open checking 1 ada、dep 1 100、wd 2 30、tr 1 2 50、または month を読み取り、それぞれに対して ok またはエラーメッセージを出力し、最後にすべての口座を出力します。
コードは bank_error.rb、invalid_amount.rb、insufficient_funds.rb、limit_reached.rb、no_account.rb、account.rb、checking.rb、savings.rb、bank.rb に記述してください。main.rb には提供された入出力コードが含まれており、編集できません。
自分で試してみよう
require_relative 'bank_error'
require_relative 'invalid_amount'
require_relative 'insufficient_funds'
require_relative 'limit_reached'
require_relative 'no_account'
require_relative 'account'
require_relative 'checking'
require_relative 'savings'
require_relative 'bank'
# 提供された入出力コード: そのままにしておく
input = []
while (line = gets)
input << line.chomp
end
bank = Bank.new
input.each do |cmd|
parts = cmd.split
begin
case parts[0]
when "open" then bank.open(parts[1], parts[2].to_i, parts[3])
when "dep" then bank.account(parts[1].to_i).deposit(parts[2].to_i)
when "wd" then bank.account(parts[1].to_i).withdraw(parts[2].to_i)
when "tr" then bank.transfer(parts[1].to_i, parts[2].to_i, parts[3].to_i)
else bank.month_end
end
puts "ok"
rescue BankError => e
puts e.message
end
end
bank.each { |account| puts account }
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rubyオンラインコンパイラ