Livro-Razão Bancário
Parte da seção Programação orientada a objetos do Journey de Ruby da Coddy. Lição 57 de 57.
Desafio
DifícilConstrua um pequeno banco. BankError < StandardError é a classe pai de InvalidAmount, InsufficientFunds, LimitReached e NoAccount, que carregam as mensagens invalid amount, insufficient funds in 2, withdrawal limit on 2 e no account 9. Account.new(id, owner) possui leitores para id, owner e balance, com um setter privado para o saldo. deposit(amount) e withdraw(amount) geram InvalidAmount para valores abaixo de 1; withdraw gera InsufficientFunds quando o saldo ficaria abaixo de lowest_balance, um método de extensão que retorna 0. month_end não faz nada e kind retorna o tipo da conta. Checking permite um cheque especial de até -100. Savings permite no máximo 2 saques por mês (LimitReached) e seu month_end adiciona juros de 1%, arredondados para baixo, e redefine a contagem. to_s retorna 1 ada checking: -20. Bank#open(kind, id, owner) cria uma Checking ou Savings, account(id) gera NoAccount, transfer(from, to, amount) procura ambas as contas antes de fazer o saque e o depósito, month_end o chama em todas as contas, e Bank inclui Enumerable, com each fornecendo as contas por ID.
O código fornecido lê os comandos open checking 1 ada, dep 1 100, wd 2 30, tr 1 2 50 ou month, imprime ok ou a mensagem de erro para cada um e, por fim, todas as contas.
Seu código deve estar em bank_error.rb, invalid_amount.rb, insufficient_funds.rb, limit_reached.rb, no_account.rb, account.rb, checking.rb, savings.rb e bank.rb. main.rb contém o código fornecido de entrada e saída e não pode ser editado.
Experimente você mesmo
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'
# Código de entrada/saída fornecido: mantenha-o como está
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 }
Todas as lições de Programação orientada a objetos
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesVariáveis de InstânciaMétodos e selfto_s e inspectRevisão - Cartão da Biblioteca4Encapsulamento
Métodos privadosMétodos protegidosSetters privadosProtegendo o estadoRevisão - Máquina de venda automática7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMétodos Abstratoscase e ClassesRevisão - Métodos de Pagamento2Acessores e self
Leitores e GravadoresSetters Personalizadosself nos MétodosIdentidade e IgualdadeRecapitulação - Lista de Contatos5Herança
SubclassesSobrescrita de métodosChamando superis_a? e ancestraisRevisão - Folha de pagamento da equipe8Métodos Especiais
Igualdade e hashMétodos de OperadoresIndexação e AdiçãoColeções PersonalizadasRevisão - Frações11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Compilador de Ruby online