Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

سجل البنك

جزء من قسم البرمجة كائنية التوجه في رحلة Ruby على Coddy. الدرس 57 من 57.

challenge icon

التحدي

صعب

أنشئ بنكًا صغيرًا. 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، مع أداة ضبط خاصة للرصيد. ترفع deposit(amount) وwithdraw(amount) الخطأ InvalidAmount للقيم الأقل من 1؛ وترفع withdraw الخطأ InsufficientFunds عندما ينخفض الرصيد إلى ما دون lowest_balance، وهي نقطة ربط تُرجع 0. لا تفعل month_end شيئًا، بينما تُرجع kind نوع الحساب. تسمح Checking بالسحب على المكشوف حتى -100. تسمح Savings بحد أقصى يبلغ عمليتي سحب شهريًا (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 }

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Ruby عبر الإنترنت