System bankowy
Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 63 z 65.
Wyzwanie
TrudnyUtwórz bank z dwoma rodzajami kont. Każda operacja zwraca słownik wyniku {"ok": bool, "message": String}; dostarczony kod wypisuje go jako OK: MESSAGE lub Failed: MESSAGE. Wszystkie kwoty mają typ float, a każda kwota w komunikacie ma dwa miejsca po przecinku po znaku $.
Transaction w pliku transaction.gd: konstruktor przyjmuje kind ("deposit", "withdrawal" lub "interest") oraz amount. _to_string() zwraca rodzaj z wielką pierwszą literą, a następnie kwotę: Deposit - $200.00. Transakcja nie przechowuje informacji o swoim koncie.
Account w pliku account.gd jest klasą @abstract:
- Konstruktor przyjmuje
account_number,owner_nameorazinitial_balance. Pieniądze są przechowywane w prywatnym polu_balance;balanceto właściwość tylko do odczytu, której getter zwraca_balance._historytoArray[Transaction], aget_history()ją zwraca. - Dwie metody abstrakcyjne:
account_type() -> Stringorazwithdrawal_error(amount: float) -> String, która zwraca powód odmowy wypłaty lub"". deposit(amount): kwota równa0lub mniejsza powoduje niepowodzenie z komunikatemDeposit amount must be positive. W przeciwnym razie dodaje pieniądze, zapisuje transakcjędepositi zwracaDeposited $A. New balance: $B.withdraw(amount): kwota równa0lub mniejsza powoduje niepowodzenie z komunikatemWithdrawal amount must be positive; niepusty wynikwithdrawal_error()powoduje niepowodzenie z tym tekstem. W przeciwnym razie pobiera pieniądze, zapisuje transakcjęwithdrawali zwracaWithdrew $A. New balance: $B, po którym pojawia się(Overdraft), jeśli saldo jest teraz mniejsze niż0._to_string()zwracaTYPE NUMBER (OWNER): $BALANCE.
SavingsAccount w pliku savings_account.gd rozszerza Account i zawiera stałe INTEREST_RATE = 0.02 oraz MIN_BALANCE = 100.0. Jej typ to Savings. Wypłata, która pozostawiłaby saldo mniejsze niż MIN_BALANCE, jest odrzucana z komunikatem Cannot withdraw below minimum balance of $100.00. apply_interest() dodaje balance * INTEREST_RATE, zapisuje transakcję interest i zwraca Applied interest: $I. New balance: $B.
CheckingAccount w pliku checking_account.gd rozszerza Account i zawiera stałą OVERDRAFT_LIMIT = 200.0. Jej typ to Checking. Saldo może spaść do -200.00; wypłata, która obniżyłaby je jeszcze bardziej, jest odrzucana z komunikatem Cannot exceed overdraft limit of $200.00.
Bank w pliku bank.gd przechowuje konta w prywatnym słowniku, którego kluczami są numery kont:
- Konstruktor przyjmuje
bank_name. create_account(kind, account_number, owner_name, initial_balance)jest fabryką:kindtosavingslubchecking, bez względu na wielkość liter. Operacja kończy się niepowodzeniem z komunikatemAccount number already existslubInvalid account type, a w przeciwnym razie zwracaSavings account created successfully(lubChecking).get_account(account_number) -> Accountzwraca konto lubnull.transfer(from_number, to_number, amount): operacja kończy się niepowodzeniem z komunikatemOne or both accounts not found; wypłaca pieniądze z pierwszego konta, a jeśli się to nie powiedzie, kończy się niepowodzeniem z komunikatemTransfer failed:połączonym z komunikatem wypłaty. W przeciwnym razie wpłaca pieniądze na drugie konto i zwracaTransferred $A from FROM to TO.total_holdings() -> floatzwraca sumę wszystkich sald.
Dostarczony kod odczytuje nazwę banku, a następnie polecenia. Dla tego wejścia:
First Bank
open savings|S1|Alice|1000
open checking|C1|Bob|50
withdraw S1|950
transfer S1|C1|300
withdraw C1|400
history C1
totalwyjście wygląda następująco:
OK: Savings account created successfully
OK: Checking account created successfully
Failed: Cannot withdraw below minimum balance of $100.00
OK: Transferred $300.00 from S1 to C1
OK: Withdrew $400.00. New balance: $-50.00 (Overdraft)
History of C1:
1. Deposit - $300.00
2. Withdrawal - $400.00
Total held by First Bank: $650.00Twój kod umieść w plikach transaction.gd, account.gd, savings_account.gd, checking_account.gd i bank.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
extends Node
func _ready():
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
var bank := Bank.new(OS.read_string_from_stdin())
var line := OS.read_string_from_stdin()
while line != "":
var parts := line.split(" ", true, 1)
var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
match parts[0]:
"open":
show_result(bank.create_account(f[0], f[1], f[2], float(f[3])))
"deposit":
show_result(bank.get_account(f[0]).deposit(float(f[1])))
"withdraw":
show_result(bank.get_account(f[0]).withdraw(float(f[1])))
"interest":
var account: Account = bank.get_account(f[0])
if account is SavingsAccount:
var savings := account as SavingsAccount
show_result(savings.apply_interest())
else:
print("Failed: ", f[0], " is not a savings account")
"transfer":
show_result(bank.transfer(f[0], f[1], float(f[2])))
"history":
var history: Array = bank.get_account(f[0]).get_history()
print("History of ", f[0], ":")
for i in history.size():
print(i + 1, ". ", history[i])
"account":
print(bank.get_account(f[0]))
"total":
print("Total held by %s: $%.2f" % [bank.bank_name, bank.total_holdings()])
line = OS.read_string_from_stdin()
func show_result(result: Dictionary) -> void:
print(("OK: " if result["ok"] else "Failed: ") + result["message"])
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe selfMetodyWłaściwościKonstruktor (_init)Powtórka – prosty kalkulator4Polimorfizm
Ponowne omówienie przesłaniania metodDuck typingKlasy i metody abstrakcyjneProjektowanie interfejsówPowtórzenie – kalkulator kształtów7Sygnały
Czym jest sygnał?Deklarowanie i emitowanieŁączenie z sygnałamiSygnały z argumentamiPodsumowanie — system zdrowia10Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu2Właściwości klas
Zmienne instancji a zmienne statyczneFunkcje statyczneSettery właściwościGettery właściwościPrywatne z konwencjiPodsumowanie — menedżer kont bankowych5Enkapsulacja
Elementy publiczne i prywatneWalidacja za pomocą setterówUkrywanie informacjiWłaściwości tylko do odczytuPodsumowanie – system ewidencji uczniów8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieKlasy wewnętrzneWęzły jako komponentyRefCounted a NodeTypy wyliczeniowe w klasach11Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superNadpisywanie metodŁańcuchy dziedziczeniaSprawdzanie typów za pomocą isPodsumowanie – hierarchia pracowników6Metody specjalne
Wprowadzenie do metod wirtualnychMetoda _to_stringWłasne iteratoryPodsumowanie — własna lista9Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy12Wyzwania końcowe
Platforma e-learningowaSystem bankowyTworzenie postaci do gryWypożyczalnia pojazdówPoćwicz samodzielnie: Kompilator GDScript online