Rückblick – Verkaufsautomat
Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 21 von 57.
Aufgabe
MittelErstelle einen Verkaufsautomaten mit den Fehlerklassen UnknownProduct, SoldOut und NotEnoughCredit, die alle Unterklassen von StandardError sind. VendingMachine.new(stock) nimmt einen Hash { "cola" => [150, 2] } entgegen (Preis in Cent, Anzahl). credit ist lesbar, kann aber nur über einen privaten Setter gesetzt werden. insert(cents) fügt Guthaben hinzu. buy(name) löst in dieser Reihenfolge UnknownProduct (no such product: tea), SoldOut (cola is sold out) oder NotEnoughCredit (cola costs 1.50, credit 1.00) aus; andernfalls nimmt die Methode ein Produkt aus dem Bestand, zieht den Preis ab und gibt den Namen zurück. refund gibt das Guthaben zurück und setzt es auf 0. Ein privater Helfer money(cents) formatiert 1.50.
Der bereitgestellte Code liest den Bestand aus der ersten Zeile (cola:150:2,chips:90:1) und anschließend die Befehle insert n, buy name oder refund. Er gibt credit 2.00, bought cola, refund 0.50 oder die Fehlermeldung aus und versucht schließlich, credit von außerhalb zu setzen, wobei credit is protected ausgegeben wird.
Dein Code gehört in unknown_product.rb, sold_out.rb, not_enough_credit.rb und vending_machine.rb. main.rb enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
require_relative 'unknown_product'
require_relative 'sold_out'
require_relative 'not_enough_credit'
require_relative 'vending_machine'
# Bereitgestellter Ein-/Ausgabe-Code: belasse ihn wie er ist
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
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenInstanzvariablenMethoden und selfto_s und inspectRückblick – Bibliotheksausweis4Kapselung
Private MethodenGeschützte MethodenPrivate SetterZustand schützenRückblick – Verkaufsautomat7Polymorphismus und Duck Typing
PolymorphismusDuck TypingAbstrakte MethodenFälle und KlassenRückblick – Zahlungsmethoden2Getter und Setter sowie self
Leser und SchreiberBenutzerdefinierte Setterself in MethodenIdentität und GleichheitWiederholung – Kontaktliste5Vererbung
UnterklassenMethoden überschreibensuper aufrufenis_a? und VorfahrenRückblick – Gehaltsabrechnung des Personals8Spezielle Methoden
Gleichheit und HashOperator-MethodenIndexieren und AnhängenBenutzerdefinierte CollectionsRückblick – Brüche11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Online-Ruby-Compiler