Rejestr bankowy
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 57 z 57.
Wyzwanie
TrudnyZbuduj mały bank. BankError < StandardError jest klasą nadrzędną dla InvalidAmount, InsufficientFunds, LimitReached i NoAccount, które przekazują komunikaty invalid amount, insufficient funds in 2, withdrawal limit on 2 i no account 9. Account.new(id, owner) ma metody odczytu dla id, owner i balance, a także prywatną metodę ustawiającą saldo. deposit(amount) i withdraw(amount) zgłaszają InvalidAmount dla wartości mniejszych niż 1; withdraw zgłasza InsufficientFunds, gdy saldo spadłoby poniżej lowest_balance — metody rozszerzającej, która zwraca 0. month_end nic nie robi, a kind zwraca typ konta. Checking pozwala na debet do -100. Savings pozwala na maksymalnie 2 wypłaty miesięcznie (LimitReached), a jego month_end dodaje odsetki w wysokości 1%, zaokrąglone w dół, i resetuje licznik. to_s zwraca 1 ada checking: -20. Bank#open(kind, id, owner) tworzy konto Checking lub Savings, account(id) zgłasza NoAccount, transfer(from, to, amount) wyszukuje oba konta przed wykonaniem wypłaty i wpłaty, month_end wywołuje tę metodę dla każdego konta, a Bank dołącza moduł Enumerable, a metoda each przekazuje konta w kolejności według identyfikatora.
Dostarczony kod odczytuje polecenia open checking 1 ada, dep 1 100, wd 2 30, tr 1 2 50 lub month, wypisuje ok lub komunikat o błędzie dla każdego z nich, a na końcu wypisuje każde konto.
Twój kod umieść w plikach bank_error.rb, invalid_amount.rb, insufficient_funds.rb, limit_reached.rb, no_account.rb, account.rb, checking.rb, savings.rb i bank.rb. main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
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'
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 }
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasZmienne instancjiMetody i selfto_s i inspectPowtórzenie – karta biblioteczna4Hermetyzacja
Metody prywatneMetody chronionePrywatne setteryOchrona stanuPowtórzenie – automat vendingowy7Polimorfizm i typowanie kacze
PolimorfizmTypowanie kaczeMetody abstrakcyjnecase i klasyPowtórzenie – metody płatności10Wzorce projektowe, część 2
Delegowanie z ForwardableWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Metody dostępowe i self
Gettery i setteryWłasne setteryself w metodachTożsamość i równośćPowtórzenie – lista kontaktów5Dziedziczenie
PodklasyNadpisywanie metodWywoływanie superis_a? i przodkowiePowtórka – lista płac pracowników8Metody specjalne
Równość i hashMetody operatorówIndeksowanie i dodawanieWłasne kolekcjePowtórka – ułamki11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Kompilator Ruby online