Menu
Coddy logo textTech

Récapitulatif - Distributeur automatique

Fait partie de la section Programmation orientée objet du Journey Ruby de Coddy. Leçon 21 sur 57.

challenge icon

Défi

Moyen

Construisez un distributeur automatique avec les classes d’erreur UnknownProduct, SoldOut et NotEnoughCredit, toutes des sous-classes de StandardError. VendingMachine.new(stock) prend un hash { "cola" => [150, 2] } (prix en centimes, quantité). credit est accessible en lecture, mais ne peut être défini qu’au moyen d’un setter privé. insert(cents) ajoute du crédit. buy(name) lève UnknownProduct (no such product: tea), SoldOut (cola is sold out) ou NotEnoughCredit (cola costs 1.50, credit 1.00) dans cet ordre ; sinon, la méthode retire un article du stock, soustrait son prix et renvoie le nom. refund renvoie le crédit et le définit à 0. Un helper privé money(cents) formate 1.50.

Le code fourni lit le stock sur la première ligne (cola:150:2,chips:90:1), puis les commandes insert n, buy name ou refund. Il affiche credit 2.00, bought cola, refund 0.50 ou le message d’erreur, puis essaie finalement de définir credit depuis l’extérieur, en affichant credit is protected.

Votre code doit se trouver dans unknown_product.rb, sold_out.rb, not_enough_credit.rb et vending_machine.rb. main.rb contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

require_relative 'unknown_product'
require_relative 'sold_out'
require_relative 'not_enough_credit'
require_relative 'vending_machine'

# Code d'entrée/sortie fourni : le garder tel quel
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

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur Ruby en ligne