سجل البنك
جزء من قسم البرمجة كائنية التوجه في رحلة 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، مع أداة ضبط خاصة للرصيد. ترفع 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 }
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتمتغيرات النسخةالأساليب و selfto_s و inspectمراجعة - بطاقة المكتبة7تعدد الأشكال والكتابة بأسلوب البطة
تعدد الأشكالالكتابة بأسلوب البطةالأساليب المجردةالحالات والفئاتمراجعة - طرق الدفع3أساليب ومتغيرات الأصناف
أساليب الأصنافمتغيرات كائنات الأصنافالثوابتأساليب الإنشاءمراجعة - رموز القسائمتدرّب بنفسك: مترجم Ruby عبر الإنترنت