Menu
Coddy logo textTech

Rückblick – Verkaufsautomat

Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 21 von 57.

challenge icon

Aufgabe

Mittel

Erstelle 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

Übe selbstständig: Online-Ruby-Compiler