Menu
CoddyTech

Sổ cái ngân hàng

Thuộc phần Lập trình hướng đối tượng trong hành trình Ruby của Coddy. Bài học 57 trên 57.

challenge icon

Thử thách

Khó

Tạo một ngân hàng nhỏ. BankError < StandardError là lớp cha của InvalidAmount, InsufficientFunds, LimitReached và NoAccount, lần lượt mang các thông báo invalid amount, insufficient funds in 2, withdrawal limit on 2 và no account 9. Account.new(id, owner) có các phương thức đọc cho id, owner và balance, cùng phương thức thiết lập riêng tư cho số dư. deposit(amount) và withdraw(amount) phát sinh InvalidAmount nếu giá trị nhỏ hơn 1; withdraw phát sinh InsufficientFunds khi số dư sẽ giảm xuống dưới lowest_balance, một phương thức móc trả về 0. month_end không làm gì và kind trả về loại tài khoản. Checking cho phép thấu chi đến -100. Savings cho phép rút tối đa 2 lần mỗi tháng (LimitReached), và month_end cộng lãi suất 1%, làm tròn xuống, rồi đặt lại số lần rút. to_s trả về 1 ada checking: -20. Bank#open(kind, id, owner) tạo một đối tượng Checking hoặc Savings, account(id) phát sinh NoAccount, transfer(from, to, amount) tra cứu cả hai tài khoản trước khi rút và gửi tiền, month_end gọi phương thức này trên mọi tài khoản, và Bank bao gồm Enumerable với each lần lượt đưa ra các tài khoản theo id.

Code được cung cấp đọc các lệnh open checking 1 ada, dep 1 100, wd 2 30, tr 1 2 50 hoặc month, in ra ok hoặc thông báo lỗi tương ứng cho mỗi lệnh, rồi in ra mọi tài khoản.

Đặt code của bạn trong các tệp bank_error.rb, invalid_amount.rb, insufficient_funds.rb, limit_reached.rb, no_account.rb, account.rb, checking.rb, savings.rb và bank.rb. main.rb chứa code đầu vào/đầu ra được cung cấp và không thể chỉnh sửa.

Tự làm thử

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'

# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
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 }

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Ruby online