Ô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.
Thử thách
Trung bìnhTạ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
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpBiến instancePhương thức và selfto_s và inspectÔn tập: thẻ thư viện4Tính đóng gói
Phương thức riêng tưPhương thức được bảo vệPhương thức thiết lập riêng tưBảo vệ trạng tháiÔn tập: máy bán hàng tự động7Tính đa hình và duck typing
Tính đa hìnhDuck typingPhương thức trừu tượngcase và lớpÔn tập: phương thức thanh toán2Phương thức truy cập và self
Phương thức đọc và ghiPhương thức gán tùy chỉnhself trong phương thứcĐịnh danh và tính bằng nhauÔn tập: Danh sách liên hệTự luyện tập: Trình biên dịch Ruby online