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

مراجعة - طرق الدفع

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

challenge icon

التحدي

صعب

أنشئ عملية دفع باستخدام تعدد الأشكال، وطريقة مجردة، وكتابة البطّة. PaymentMethod#charge(amount) هي طريقة قالب: تُرجع nil عندما تكون available?(amount) تساوي false، وإلا فتُرجع card paid 50.00, fee 1.00، باستخدام label والطريقة المجردة fee(amount)، التي ترفع NotImplementedError في PaymentMethod. ‏available? هي نقطة امتداد تُرجع true. تفرض Card رسماً بنسبة 2%؛ وPayPal رسماً قدره 0.30 بالإضافة إلى 3%؛ أما GiftCard.new(balance) فلا يفرض أي رسم، ويكون متاحاً فقط ما دام رصيده يغطي المبلغ، ويُقلّل الرصيد. ‏Voucher.new(value) ليس PaymentMethod؛ إذ يملك فقط charge(amount) الخاص به، ويُرجع voucher covered 20.00 عندما تغطي القيمة المبلغ، وnil خلاف ذلك. يحاول المساعد checkout(amount, methods) في functions.rb استدعاء charge لكل طريقة بالترتيب، ويُرجع أول نتيجة، أو declined.

يسرد سطر الإدخال الأول طرق الدفع، مثل gift:30,voucher:20,card. وكل سطر تالٍ هو مبلغ طلب؛ وتطبع الشيفرة الموفّرة نتيجة checkout لكل مبلغ.

ضع شيفرتك في payment_method.rb وcard.rb وpay_pal.rb وgift_card.rb وvoucher.rb وfunctions.rb. يحتوي main.rb على شيفرة الإدخال/الإخراج الموفّرة، ولا يمكن تعديله.

جرّب بنفسك

require_relative 'payment_method'
require_relative 'card'
require_relative 'pay_pal'
require_relative 'gift_card'
require_relative 'voucher'
require_relative 'functions'

# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input = []
while (line = gets)
  input << line.chomp
end
methods = input[0].split(",").map do |entry|
  kind, value = entry.split(":")
  case kind
  when "card" then Card.new
  when "paypal" then PayPal.new
  when "gift" then GiftCard.new(value.to_f)
  else Voucher.new(value.to_f)
  end
end
input.drop(1).each { |line| puts checkout(line.to_f, methods) }

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

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