Menu
Coddy logo textTech

Registre bancaire

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

challenge icon

Défi

Difficile

Construisez une petite banque. BankError < StandardError est le parent de InvalidAmount, InsufficientFunds, LimitReached et NoAccount, qui portent les messages invalid amount, insufficient funds in 2, withdrawal limit on 2 et no account 9. Account.new(id, owner) possède des accesseurs en lecture pour id, owner et balance, avec un accesseur en écriture privé pour le solde. deposit(amount) et withdraw(amount) lèvent InvalidAmount pour une valeur inférieure à 1 ; withdraw lève InsufficientFunds lorsque le solde passerait sous lowest_balance, un hook qui renvoie 0. month_end ne fait rien et kind renvoie le type de compte. Checking autorise un découvert jusqu’à -100. Savings autorise au maximum 2 retraits par mois (LimitReached) et son month_end ajoute 1 % d’intérêts, arrondis à l’entier inférieur, puis réinitialise le compteur. to_s renvoie 1 ada checking: -20. Bank#open(kind, id, owner) crée un compte Checking ou Savings, account(id) lève NoAccount, transfer(from, to, amount) recherche les deux comptes avant d’effectuer le retrait et le dépôt, month_end l’appelle sur chaque compte, et Bank inclut Enumerable, avec each qui fournit les comptes dans l’ordre de leur identifiant.

Le code fourni lit les commandes open checking 1 ada, dep 1 100, wd 2 30, tr 1 2 50 ou month, affiche ok ou le message d’erreur correspondant pour chacune, puis affiche finalement tous les comptes.

Votre code doit être placé dans bank_error.rb, invalid_amount.rb, insufficient_funds.rb, limit_reached.rb, no_account.rb, account.rb, checking.rb, savings.rb et bank.rb. main.rb contient le code fourni d’entrée/sortie et ne peut pas être modifié.

Essayez vous-même

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'

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

Toutes les leçons de Programmation orientée objet

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