Riepilogo - Distributore automatico
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 21 di 57.
Sfida
MedioCrea un distributore automatico con le classi di errore UnknownProduct, SoldOut e NotEnoughCredit, tutte sottoclassi di StandardError. VendingMachine.new(stock) accetta un hash { "cola" => [150, 2] } (prezzo in centesimi, quantità). credit è leggibile, ma può essere impostato solo tramite un setter privato. insert(cents) aggiunge credito. buy(name) genera UnknownProduct (no such product: tea), SoldOut (cola is sold out) o NotEnoughCredit (cola costs 1.50, credit 1.00) in quest'ordine; altrimenti preleva un articolo dalle scorte, sottrae il prezzo e restituisce il nome. refund restituisce il credito e lo imposta a 0. Un helper privato money(cents) formatta 1.50.
Il codice fornito legge le scorte dalla prima riga (cola:150:2,chips:90:1), poi i comandi insert n, buy name o refund. Stampa credit 2.00, bought cola, refund 0.50 oppure il messaggio di errore e infine prova a impostare credit dall'esterno, stampando credit is protected.
Il tuo codice va inserito in unknown_product.rb, sold_out.rb, not_enough_credit.rb e vending_machine.rb. main.rb contiene il codice fornito per l'input/output e non può essere modificato.
Provalo tu
require_relative 'unknown_product'
require_relative 'sold_out'
require_relative 'not_enough_credit'
require_relative 'vending_machine'
# Código de entrada/salida proporcionado: mantenlo 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
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiVariabili d'istanzaMetodi e selfto_s e inspectRipasso - Tessera della biblioteca4Incapsulamento
Metodi privatiMetodi protettiSetter privatiProteggere lo statoRiepilogo - Distributore automatico7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMetodi astratticase e classiRiepilogo - Metodi di pagamento10Pattern di progettazione Parte 2
Delegazione con ForwardablePattern DecoratorPattern BuilderPattern State2Metodi di accesso e self
Metodi di lettura e scritturaSetter personalizzatiself nei metodiIdentità e uguaglianzaRiepilogo - Elenco contatti5Ereditarietà
SottoclassiRidefinizione dei metodiChiamare superis_a? e antenatiRiepilogo - Paghe del personale8Metodi speciali
Uguaglianza e hashMetodi degli operatoriIndicizzazione e appendCollezioni personalizzateRiepilogo - Frazioni11Progetto: Gestione della biblioteca
Libri e iscrittiPrendere in prestito i libriEsercitati da solo: Compilatore Ruby online