Bankbuch
Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 57 von 57.
Aufgabe
SchwerErstelle eine kleine Bank. BankError < StandardError ist die Oberklasse von InvalidAmount, InsufficientFunds, LimitReached und NoAccount, die die Nachrichten invalid amount, insufficient funds in 2, withdrawal limit on 2 und no account 9 enthalten. Account.new(id, owner) verfügt über Lesemethoden für id, owner und balance sowie über einen privaten Setter für den Kontostand. deposit(amount) und withdraw(amount) lösen bei Werten unter 1 InvalidAmount aus; withdraw löst InsufficientFunds aus, wenn der Kontostand unter lowest_balance fallen würde, einem Hook, der 0 zurückgibt. month_end führt keine Aktion aus und kind gibt den Kontotyp zurück. Checking erlaubt eine Überziehung bis zu -100. Savings erlaubt höchstens 2 Abhebungen pro Monat (LimitReached); sein month_end addiert 1 % Zinsen, abgerundet, und setzt den Zähler zurück. to_s gibt 1 ada checking: -20 zurück. Bank#open(kind, id, owner) erstellt ein Checking- oder Savings-Konto, account(id) löst NoAccount aus, transfer(from, to, amount) sucht beide Konten, bevor es abhebt und einzahlt, month_end ruft die Methode für jedes Konto auf, und Bank bindet Enumerable ein, wobei each die Konten nach ID liefert.
Der bereitgestellte Code liest die Befehle open checking 1 ada, dep 1 100, wd 2 30, tr 1 2 50 oder month, gibt für jeden Befehl ok oder die Fehlermeldung aus und anschließend jedes Konto.
Dein Code gehört in bank_error.rb, invalid_amount.rb, insufficient_funds.rb, limit_reached.rb, no_account.rb, account.rb, checking.rb, savings.rb und bank.rb. main.rb enthält den bereitgestellten Ein-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
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'
# Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
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 }
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenInstanzvariablenMethoden und selfto_s und inspectRückblick – Bibliotheksausweis4Kapselung
Private MethodenGeschützte MethodenPrivate SetterZustand schützenRückblick – Verkaufsautomat7Polymorphismus und Duck Typing
PolymorphismusDuck TypingAbstrakte MethodenFälle und KlassenRückblick – Zahlungsmethoden2Getter und Setter sowie self
Leser und SchreiberBenutzerdefinierte Setterself in MethodenIdentität und GleichheitWiederholung – Kontaktliste5Vererbung
UnterklassenMethoden überschreibensuper aufrufenis_a? und VorfahrenRückblick – Gehaltsabrechnung des Personals8Spezielle Methoden
Gleichheit und HashOperator-MethodenIndexieren und AnhängenBenutzerdefinierte CollectionsRückblick – Brüche11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Online-Ruby-Compiler