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

مراجعة - آلة البيع

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

challenge icon

التحدي

متوسط

أنشئ آلة بيع باستخدام فئات الأخطاء UnknownProduct وSoldOut وNotEnoughCredit، وجميعها فئات فرعية من StandardError. تستقبل VendingMachine.new(stock) تجزئةً بالشكل { "cola" => [150, 2] } (السعر بالسنتات، والعدد). يمكن قراءة credit، ولكن لا يمكن تعيينه إلا من خلال مُعيّن خاص. تضيف insert(cents) رصيدًا. ترفع buy(name) الخطأ UnknownProduct (no such product: tea) أو SoldOut (cola is sold out) أو NotEnoughCredit (cola costs 1.50, credit 1.00) بهذا الترتيب؛ وإلا فإنها تأخذ عنصرًا واحدًا من المخزون، وتطرح السعر، وتعيد الاسم. تُعيد refund الرصيد وتعيّنه إلى 0. ينسّق المساعد الخاص money(cents) القيمة 1.50.

يقرأ الكود المزوّد المخزون من السطر الأول (cola:150:2,chips:90:1)، ثم يعالج الأوامر insert n أو buy name أو refund. ويطبع credit 2.00 أو bought cola أو refund 0.50 أو رسالة الخطأ، ثم يحاول أخيرًا تعيين credit من خارج الفئة، ويطبع credit is protected.

ضع الكود الخاص بك في الملفات unknown_product.rb وsold_out.rb وnot_enough_credit.rb وvending_machine.rb. يحتوي main.rb على كود الإدخال/الإخراج المزوّد، ولا يمكن تعديله.

جرّب بنفسك

require_relative 'unknown_product'
require_relative 'sold_out'
require_relative 'not_enough_credit'
require_relative 'vending_machine'

# كود الإدخال/الإخراج المُزوَّد: احتفظ به كما هو
input = []
while (line = gets)
  input << line.chomp
end
stock = input[0].split(",").to_h do |entry|
  name, price, count = entry.split(":")
  [name, [price.to_i, count.to_i]]
end
machine = VendingMachine.new(stock)
input.drop(1).each do |line|
  command, arg = line.split
  begin
    case command
    when "insert"
      machine.insert(arg.to_i)
      puts format("credit %.2f", machine.credit / 100.0)
    when "buy"
      puts "bought #{machine.buy(arg)}"
    else
      puts format("refund %.2f", machine.refund / 100.0)
    end
  rescue UnknownProduct, SoldOut, NotEnoughCredit => e
    puts e.message
  end
end
begin
  machine.credit = 500
  puts "credit changed"
rescue NoMethodError
  puts "credit is protected"
end

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

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