Powtórzenie – automat vendingowy
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 21 z 57.
Wyzwanie
ŚredniZbuduj automat sprzedający z klasami błędów UnknownProduct, SoldOut i NotEnoughCredit, będącymi podklasami StandardError. VendingMachine.new(stock) przyjmuje hash { "cola" => [150, 2] } (cena w centach, liczba sztuk). credit można odczytać, ale ustawić tylko za pomocą prywatnego settera. insert(cents) dodaje środki. buy(name) zgłasza kolejno UnknownProduct (no such product: tea), SoldOut (cola is sold out) lub NotEnoughCredit (cola costs 1.50, credit 1.00); w przeciwnym razie pobiera jedną sztukę z zapasów, odejmuje cenę i zwraca nazwę. refund zwraca środki i ustawia je na 0. Prywatna funkcja pomocnicza money(cents) formatuje wartość 1.50.
Dostarczony kod odczytuje zapasy z pierwszego wiersza (cola:150:2,chips:90:1), a następnie polecenia insert n, buy name lub refund. Wypisuje credit 2.00, bought cola, refund 0.50 lub komunikat o błędzie, a na koniec próbuje ustawić credit z zewnątrz, wypisując credit is protected.
Twój kod umieść w plikach unknown_product.rb, sold_out.rb, not_enough_credit.rb i vending_machine.rb. Plik main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
require_relative 'unknown_product'
require_relative 'sold_out'
require_relative 'not_enough_credit'
require_relative 'vending_machine'
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasZmienne instancjiMetody i selfto_s i inspectPowtórzenie – karta biblioteczna4Hermetyzacja
Metody prywatneMetody chronionePrywatne setteryOchrona stanuPowtórzenie – automat vendingowy7Polimorfizm i typowanie kacze
PolimorfizmTypowanie kaczeMetody abstrakcyjnecase i klasyPowtórzenie – metody płatności10Wzorce projektowe, część 2
Delegowanie z ForwardableWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Metody dostępowe i self
Gettery i setteryWłasne setteryself w metodachTożsamość i równośćPowtórzenie – lista kontaktów5Dziedziczenie
PodklasyNadpisywanie metodWywoływanie superis_a? i przodkowiePowtórka – lista płac pracowników8Metody specjalne
Równość i hashMetody operatorówIndeksowanie i dodawanieWłasne kolekcjePowtórka – ułamki11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Kompilator Ruby online