Repaso: máquina expendedora
Parte de la sección Programación orientada a objetos del Journey de Ruby de Coddy. Lección 21 de 57.
Desafío
IntermedioConstruye una máquina expendedora con las clases de error UnknownProduct, SoldOut y NotEnoughCredit, todas subclases de StandardError. VendingMachine.new(stock) recibe un hash { "cola" => [150, 2] } (precio en centavos, cantidad). credit se puede leer, pero solo se establece mediante un setter privado. insert(cents) añade crédito. buy(name) genera UnknownProduct (no such product: tea), SoldOut (cola is sold out) o NotEnoughCredit (cola costs 1.50, credit 1.00) en ese orden; de lo contrario, toma un artículo del inventario, resta el precio y devuelve el nombre. refund devuelve el crédito y lo establece en 0. Un helper privado money(cents) da formato a 1.50.
El código proporcionado lee el inventario de la primera línea (cola:150:2,chips:90:1) y, después, los comandos insert n, buy name o refund. Imprime credit 2.00, bought cola, refund 0.50 o el mensaje de error y, finalmente, intenta establecer credit desde fuera, imprimiendo credit is protected.
Tu código va en unknown_product.rb, sold_out.rb, not_enough_credit.rb y vending_machine.rb. main.rb contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
require_relative 'unknown_product'
require_relative 'sold_out'
require_relative 'not_enough_credit'
require_relative 'vending_machine'
# Código de entrada/salida suministrado: déjalo tal como está
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
Todas las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesVariables de instanciaMétodos y selfto_s e inspectRepaso: tarjeta de biblioteca4Encapsulación
Métodos privadosMétodos protegidosAsignadores privadosProtección del estadoRepaso: máquina expendedora7Polimorfismo y tipado pato
PolimorfismoTipado patoMétodos abstractoscase y clasesRepaso: métodos de pago2Accesores y self
Lectores y escritoresSetters personalizadosself en los métodosIdentidad e igualdadRepaso: lista de contactos5Herencia
SubclasesSobrescritura de métodosLlamar a superis_a? y ancestrosRepaso - Nómina del personal8Métodos especiales
Igualdad y hashMétodos de operadoresIndexación y adiciónColecciones personalizadasRepaso: fracciones11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Compilador de Ruby online