Libro mayor bancario
Parte de la sección Programación orientada a objetos del Journey de Ruby de Coddy. Lección 57 de 57.
Desafío
DifícilConstruye un banco pequeño. BankError < StandardError es la clase principal de InvalidAmount, InsufficientFunds, LimitReached y NoAccount, que contienen los mensajes invalid amount, insufficient funds in 2, withdrawal limit on 2 y no account 9. Account.new(id, owner) tiene lectores para id, owner y balance, con un setter privado para el balance. deposit(amount) y withdraw(amount) generan InvalidAmount por debajo de 1; withdraw genera InsufficientFunds cuando el balance caería por debajo de lowest_balance, un hook que devuelve 0. month_end no hace nada y kind devuelve el tipo de cuenta. Checking permite un descubierto de hasta -100. Savings permite como máximo 2 retiros por mes (LimitReached), y su month_end añade un 1 % de interés, redondeado hacia abajo, y reinicia el contador. to_s devuelve 1 ada checking: -20. Bank#open(kind, id, owner) crea una Checking o una Savings, account(id) genera NoAccount, transfer(from, to, amount) busca ambas cuentas antes de retirar y depositar, month_end lo llama en cada cuenta, y Bank incluye Enumerable, con each que produce las cuentas ordenadas por id.
El código proporcionado lee los comandos open checking 1 ada, dep 1 100, wd 2 30, tr 1 2 50 o month, imprime ok o el mensaje de error correspondiente para cada uno y, finalmente, cada cuenta.
Tu código va en bank_error.rb, invalid_amount.rb, insufficient_funds.rb, limit_reached.rb, no_account.rb, account.rb, checking.rb, savings.rb y bank.rb. main.rb contiene el código de entrada/salida proporcionado y no se puede editar.
Pruébalo tú mismo
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/salida suministrado: déjalo 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 las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesVariables de instanciaMétodos y selfto_s e inspectRepaso: tarjeta de biblioteca4Encapsulación
Métodos privadosMétodos protegidosAsignadores privadosProtección del estadoRepaso: máquina expendedora7Polimorfismo y tipado pato
PolimorfismoTipado patoMétodos abstractoscase y clasesRepaso: métodos de pago2Accesores y self
Lectores y escritoresSetters personalizadosself en los métodosIdentidad e igualdadRepaso: lista de contactos5Herencia
SubclasesSobrescritura de métodosLlamar a superis_a? y ancestrosRepaso - Nómina del personal8Métodos especiales
Igualdad y hashMétodos de operadoresIndexación y adiciónColecciones personalizadasRepaso: fracciones11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Compilador de Ruby online