Повторение — торговый автомат
Часть раздела Объектно-ориентированное программирование путешествия по Ruby на Coddy. Урок 21 из 57.
Задание
СреднеСоздайте торговый автомат с классами ошибок UnknownProduct, SoldOut и NotEnoughCredit, являющимися подклассами StandardError. VendingMachine.new(stock) принимает хеш { "cola" => [150, 2] } (цена в центах, количество). Значение credit доступно для чтения, но задаётся только через приватный сеттер. Метод insert(cents) добавляет кредит. Метод buy(name) в указанном порядке вызывает исключения UnknownProduct (no such product: tea), SoldOut (cola is sold out) или NotEnoughCredit (cola costs 1.50, credit 1.00); в противном случае он забирает один товар со склада, вычитает его цену и возвращает имя. Метод refund возвращает кредит и устанавливает его в значение 0. Приватный вспомогательный метод money(cents) форматирует значение 1.50.
Предоставленный код считывает склад из первой строки (cola:150:2,chips:90:1), затем команды insert n, buy name или refund. Он выводит credit 2.00, bought cola, refund 0.50 или сообщение об ошибке, а в конце пытается установить credit извне, выводя credit is protected.
Ваш код должен находиться в файлах unknown_product.rb, sold_out.rb, not_enough_credit.rb и vending_machine.rb. В файле main.rb находится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
require_relative 'unknown_product'
require_relative 'sold_out'
require_relative 'not_enough_credit'
require_relative 'vending_machine'
# Предоставленный код ввода/вывода: оставьте его как есть
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
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовПеременные экземпляраМетоды и selfto_s и inspectПовторение — читательский билет4Инкапсуляция
Приватные методыЗащищённые методыПриватные сеттерыЗащита состоянияПовторение — торговый автомат7Полиморфизм и утиная типизация
ПолиморфизмУтиная типизацияАбстрактные методыcase и классыПовторение — способы оплаты10Шаблоны проектирования, часть 2
Делегирование с помощью ForwardableШаблон декоратораШаблон строителяШаблон состояния2Аксессоры и self
Чтение и записьПользовательские сеттерыself в методахИдентичность и равенствоПовторение — список контактов5Наследование
ПодклассыПереопределение методовВызов superis_a? и предкиПовторение — расчёт зарплаты сотрудников8Специальные методы
Равенство и хешированиеМетоды операторовИндексация и добавлениеПользовательские коллекцииПовторение — дроби11Проект: Управление библиотекой
Книги и читателиВыдача книг3Методы и переменные классов
Методы классовПеременные экземпляра классаКонстантыФабричные методыПовторение — коды купонов6Модули и примеси
Модули и includeРасширение объектовМодуль ComparableМодуль EnumerableПовторение — спортивная лига9Паттерны проектирования. Часть 1
Паттерн «Одиночка»Фабричный паттернПаттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор Ruby