Revisão - Máquina de venda automática
Parte da seção Programação orientada a objetos do Journey de Ruby da Coddy. Lição 21 de 57.
Desafio
MédioCrie uma máquina de vendas com as classes de erro UnknownProduct, SoldOut e NotEnoughCredit, todas subclasses de StandardError. VendingMachine.new(stock) recebe um hash { "cola" => [150, 2] } (preço em centavos, quantidade). credit pode ser lido, mas só pode ser definido por meio de um setter privado. insert(cents) adiciona crédito. buy(name) gera UnknownProduct (no such product: tea), SoldOut (cola is sold out) ou NotEnoughCredit (cola costs 1.50, credit 1.00), nessa ordem; caso contrário, retira um item do estoque, subtrai o preço e retorna o nome. refund retorna o crédito e o define como 0. Um auxiliar privado money(cents) formata 1.50.
O código fornecido lê o estoque da primeira linha (cola:150:2,chips:90:1) e, em seguida, os comandos insert n, buy name ou refund. Ele exibe credit 2.00, bought cola, refund 0.50 ou a mensagem de erro e, por fim, tenta definir credit de fora, exibindo credit is protected.
Seu código deve ficar em unknown_product.rb, sold_out.rb, not_enough_credit.rb e vending_machine.rb. main.rb contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
require_relative 'unknown_product'
require_relative 'sold_out'
require_relative 'not_enough_credit'
require_relative 'vending_machine'
# Código de entrada/saída fornecido: mantenha-o 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 as lições de Programação orientada a objetos
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesVariáveis de InstânciaMétodos e selfto_s e inspectRevisão - Cartão da Biblioteca4Encapsulamento
Métodos privadosMétodos protegidosSetters privadosProtegendo o estadoRevisão - Máquina de venda automática7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMétodos Abstratoscase e ClassesRevisão - Métodos de Pagamento2Acessores e self
Leitores e GravadoresSetters Personalizadosself nos MétodosIdentidade e IgualdadeRecapitulação - Lista de Contatos5Herança
SubclassesSobrescrita de métodosChamando superis_a? e ancestraisRevisão - Folha de pagamento da equipe8Métodos Especiais
Igualdade e hashMétodos de OperadoresIndexação e AdiçãoColeções PersonalizadasRevisão - Frações11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Compilador de Ruby online