Банковская книга
Часть раздела Объектно-ориентированное программирование путешествия по Ruby на Coddy. Урок 57 из 57.
Задание
СложноСоздайте небольшой банк. BankError < StandardError является родительским классом для InvalidAmount, InsufficientFunds, LimitReached и NoAccount, которые сопровождаются сообщениями invalid amount, insufficient funds in 2, withdrawal limit on 2 и no account 9. Account.new(id, owner) имеет методы чтения для id, owner и balance, а также приватный метод записи для баланса. deposit(amount) и withdraw(amount) вызывают исключение InvalidAmount для значений меньше 1; withdraw вызывает InsufficientFunds, когда баланс опустился бы ниже lowest_balance — метода-обработчика, возвращающего 0. month_end ничего не делает, а kind возвращает тип счёта. Checking разрешает овердрафт до -100. Savings разрешает не более 2 снятий в месяц (LimitReached), а его month_end начисляет 1% процентов с округлением вниз и сбрасывает счётчик. to_s возвращает 1 ada checking: -20. Bank#open(kind, id, owner) создаёт Checking или Savings, account(id) вызывает NoAccount, transfer(from, to, amount) находит оба счёта до снятия и внесения средств, month_end вызывает его для каждого счёта, а Bank подключает Enumerable, при этом each возвращает счета по идентификатору.
Предоставленный код считывает команды open checking 1 ada, dep 1 100, wd 2 30, tr 1 2 50 или month, выводит ok или сообщение об ошибке для каждой из них, а затем все счета.
Ваш код должен находиться в файлах bank_error.rb, invalid_amount.rb, insufficient_funds.rb, limit_reached.rb, no_account.rb, account.rb, checking.rb, savings.rb и bank.rb. В main.rb находится предоставленный код ввода/вывода, и его нельзя изменять.
Попробуйте сами
require_relative 'bank_error'
require_relative 'invalid_amount'
require_relative 'insufficient_funds'
require_relative 'limit_reached'
require_relative 'no_account'
require_relative 'account'
require_relative 'checking'
require_relative 'savings'
require_relative 'bank'
# Предоставленный код ввода/вывода: оставьте его как есть
input = []
while (line = gets)
input << line.chomp
end
bank = Bank.new
input.each do |cmd|
parts = cmd.split
begin
case parts[0]
when "open" then bank.open(parts[1], parts[2].to_i, parts[3])
when "dep" then bank.account(parts[1].to_i).deposit(parts[2].to_i)
when "wd" then bank.account(parts[1].to_i).withdraw(parts[2].to_i)
when "tr" then bank.transfer(parts[1].to_i, parts[2].to_i, parts[3].to_i)
else bank.month_end
end
puts "ok"
rescue BankError => e
puts e.message
end
end
bank.each { |account| puts account }
Все уроки раздела Объектно-ориентированное программирование
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