Menu
Coddy logo textTech

סיכום – מכונת ממכר

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Ruby של Coddy. שיעור 21 מתוך 57.

challenge icon

אתגר

בינוני

בנו מכונת ממכר עם מחלקות שגיאה UnknownProduct, SoldOut ו-NotEnoughCredit, שכולן תת-מחלקות של StandardError. VendingMachine.new(stock) מקבלת hash { "cola" => [150, 2] } (מחיר בסנטים, כמות). ניתן לקרוא את credit, אך אפשר לקבוע את ערכו רק באמצעות setter פרטי. 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 אונליין