Menu
CoddyTech

Ôn tập: máy bán hàng tự động

Thuộc phần Lập trình hướng đối tượng trong hành trình Ruby của Coddy. Bài học 21 trên 57.

challenge icon

Thử thách

Trung bình

Tạo máy bán hàng tự động với các lớp lỗi UnknownProduct, SoldOut và NotEnoughCredit, tất cả đều là lớp con của StandardError. VendingMachine.new(stock) nhận một từ điển { "cola" => [150, 2] } (giá tính bằng xu, số lượng). credit có thể đọc được nhưng chỉ có thể đặt thông qua setter riêng tư. insert(cents) cộng thêm tín dụng. buy(name) lần lượt phát sinh UnknownProduct (no such product: tea), SoldOut (cola is sold out) hoặc NotEnoughCredit (cola costs 1.50, credit 1.00); nếu không thì lấy một món hàng khỏi kho, trừ giá và trả về tên món hàng. refund trả lại số tín dụng và đặt giá trị này thành 0. Hàm trợ giúp riêng tư money(cents) định dạng giá trị thành 1.50.

Code được cung cấp đọc thông tin kho từ dòng đầu tiên (cola:150:2,chips:90:1), sau đó đọc các lệnh insert n, buy name hoặc refund. Code in ra credit 2.00, bought cola, refund 0.50 hoặc thông báo lỗi, rồi thử đặt credit từ bên ngoài và in ra credit is protected.

Code của bạn nằm trong unknown_product.rb, sold_out.rb, not_enough_credit.rb và vending_machine.rb. main.rb chứa code đầu vào/đầu ra được cung cấp và không thể chỉnh sửa.

Tự làm thử

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

# Đoạn code đầu vào/đầu ra đã có sẵn: giữ nguyên
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

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Ruby online