Registre bancaire
Fait partie de la section Programmation orientée objet du Journey Ruby de Coddy. Leçon 57 sur 57.
Défi
DifficileConstruisez 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
1Classes et objets
Travailler avec des fichiersDéfinir des classesVariables d’instanceMéthodes et selfto_s et inspectRécapitulatif - Carte de bibliothèque4Encapsulation
Méthodes privéesMéthodes protégéesSetters privésProtéger l’étatRécapitulatif - Distributeur automatique7Polymorphisme et typage canard
PolymorphismeTypage canardMéthodes abstraitesCas et classesRécapitulatif - méthodes de paiement10Patrons de conception – Partie 2
Délégation avec ForwardablePatron DécorateurPatron BuilderPatron État2Accesseurs et self
Lecteurs et écrivainsSetters personnalisésself dans les méthodesIdentité et égalitéRécapitulatif - Liste de contacts5Héritage
Sous-classesRedéfinition des méthodesAppeler superis_a? et ancêtresRécapitulatif - Paie du personnel8Méthodes spéciales
Égalité et hachageMéthodes d’opérateursIndexation et ajoutCollections personnaliséesRécapitulatif - Fractions11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livresEntraînez-vous par vous-même : Compilateur Ruby en ligne