ספר חשבונות בנק
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Ruby של Coddy. שיעור 57 מתוך 57.
אתגר
קשהבנה בנק קטן. BankError < StandardError היא מחלקת האב של InvalidAmount, InsufficientFunds, LimitReached ו־NoAccount, שמציגות את ההודעות invalid amount, insufficient funds in 2, withdrawal limit on 2 ו־no account 9. ל־Account.new(id, owner) יש קוראים עבור id, owner ו־balance, עם setter פרטי עבור היתרה. deposit(amount) ו־withdraw(amount) מעלות את InvalidAmount כאשר הסכום קטן מ־1; withdraw מעלה את InsufficientFunds כאשר היתרה תרד מתחת ל־lowest_balance, מתודת hook שמחזירה 0. month_end לא עושה דבר ו־kind מחזירה את סוג החשבון. Checking מאפשרת משיכת יתר עד -100. Savings מאפשרת לכל היותר 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, כאשר each מניבה את החשבונות לפי מזהה.
הקוד שסופק קורא פקודות כגון 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 }
כל השיעורים ביחידה תכנות מונחה עצמים
3מתודות ומשתנים של מחלקה
מתודות של מחלקהמשתני מופע של מחלקהקבועיםמתודות ליצירת מופעיםסיכום – קודי קופוןתרגלו בעצמכם: קומפיילר Ruby אונליין