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.
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
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpBiến instancePhương thức và selfto_s và inspectÔn tập: thẻ thư viện4Tính đóng gói
Phương thức riêng tưPhương thức được bảo vệPhương thức thiết lập riêng tưBảo vệ trạng tháiÔn tập: máy bán hàng tự động7Tính đa hình và duck typing
Tính đa hìnhDuck typingPhương thức trừu tượngcase và lớpÔn tập: phương thức thanh toán2Phương thức truy cập và self
Phương thức đọc và ghiPhương thức gán tùy chỉnhself trong phương thứcĐịnh danh và tính bằng nhauÔn tập: Danh sách liên hệTự luyện tập: Trình biên dịch Ruby online