Sistem Perbankan
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 63 dari 65.
Tantangan
SulitBuat sebuah bank dengan dua jenis rekening. Setiap operasi mengembalikan dictionary hasil {"ok": bool, "message": String}; kode yang disediakan mencetaknya sebagai OK: MESSAGE atau Failed: MESSAGE. Semua jumlah bertipe float dan setiap jumlah dalam pesan memiliki dua angka desimal setelah $.
Transaction dalam transaction.gd: constructor menerima kind ("deposit", "withdrawal" atau "interest") dan amount. _to_string() mengembalikan kind dengan huruf pertama kapital, lalu jumlahnya: Deposit - $200.00. Sebuah transaksi tidak menyimpan rekeningnya.
Account dalam account.gd adalah class @abstract:
- Constructor menerima
account_number,owner_namedaninitial_balance. Uang disimpan dalam_balanceprivat;balanceadalah property hanya-baca yang getter-nya mengembalikan_balance._historyadalahArray[Transaction], danget_history()mengembalikannya. - Dua method abstrak:
account_type() -> Stringdanwithdrawal_error(amount: float) -> String, yang mengembalikan alasan penarikan ditolak, atau"". deposit(amount): jumlah sebesar0atau kurang akan gagal denganDeposit amount must be positive. Jika tidak, fungsi ini menambahkan uang, mencatat transaksidepositdan mengembalikanDeposited $A. New balance: $B.withdraw(amount): jumlah sebesar0atau kurang akan gagal denganWithdrawal amount must be positive;withdrawal_error()yang tidak kosong akan gagal dengan teks tersebut. Jika tidak, fungsi ini mengambil uang, mencatat transaksiwithdrawaldan mengembalikanWithdrew $A. New balance: $B, diikuti(Overdraft)jika saldo kini kurang dari0._to_string()mengembalikanTYPE NUMBER (OWNER): $BALANCE.
SavingsAccount dalam savings_account.gd mewarisi Account, dengan konstanta INTEREST_RATE = 0.02 dan MIN_BALANCE = 100.0. Jenisnya adalah Savings. Penarikan yang akan menyisakan saldo kurang dari MIN_BALANCE ditolak dengan Cannot withdraw below minimum balance of $100.00. apply_interest() menambahkan balance * INTEREST_RATE, mencatat transaksi interest dan mengembalikan Applied interest: $I. New balance: $B.
CheckingAccount dalam checking_account.gd mewarisi Account, dengan konstanta OVERDRAFT_LIMIT = 200.0. Jenisnya adalah Checking. Saldo boleh turun hingga -200.00; penarikan yang akan membuat saldo lebih rendah akan ditolak dengan Cannot exceed overdraft limit of $200.00.
Bank dalam bank.gd menyimpan rekening dalam dictionary privat dengan nomor rekening sebagai kunci:
- Constructor menerima
bank_name. create_account(kind, account_number, owner_name, initial_balance)adalah factory:kindberupasavingsatauchecking, tanpa membedakan huruf besar-kecil. Fungsi ini gagal denganAccount number already existsatauInvalid account type, dan jika berhasil mengembalikanSavings account created successfully(atauChecking).get_account(account_number) -> Accountmengembalikan rekening, ataunull.transfer(from_number, to_number, amount): gagal denganOne or both accounts not found; menarik uang dari rekening pertama dan, jika penarikan gagal, mengembalikan kegagalan denganTransfer failed:diikuti pesan penarikan. Jika tidak, fungsi ini menyetorkan uang ke rekening kedua dan mengembalikanTransferred $A from FROM to TO.total_holdings() -> floatmengembalikan jumlah semua saldo.
Kode yang disediakan membaca nama bank, lalu perintah. Untuk input ini:
First Bank
open savings|S1|Alice|1000
open checking|C1|Bob|50
withdraw S1|950
transfer S1|C1|300
withdraw C1|400
history C1
totaloutput-nya adalah:
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.00Tulis kodemu di transaction.gd, account.gd, savings_account.gd, checking_account.gd dan bank.gd. main.gd berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
extends Node
func _ready():
# Kode input/output yang disediakan: biarkan apa adanya
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"])
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass dan objectKata Kunci selfmethodpropertyKonstruktor (_init)Ringkasan: Kalkulator Sederhana4Polimorfisme
Method Overriding Sekali LagiDuck TypingKelas Abstrak dan MethodDesain InterfaceRingkasan: Kalkulator Bentuk7Sinyal
Apa itu Sinyal?Mendeklarasikan dan MemancarkanMenghubungkan ke SinyalSinyal dengan ArgumenRangkuman, Sistem Kesehatan10Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola Composite2Property class
Variabel instance vs. variabel statisFungsi statisSetter propertyGetter propertyPrivat berdasarkan konvensiRangkuman: Pengelola Rekening Bank5Enkapsulasi
Member Publik dan PrivatValidasi dengan SetterPenyembunyian InformasiProperty Hanya-BacaRingkasan: Sistem Catatan Siswa8Konsep OOP Lanjutan
Komposisi vs PewarisanInner ClassNode sebagai KomponenRefCounted vs NodeEnum dalam Class11Proyek: Manajemen Perpustakaan
Gambaran Umum Proyekclass Buku dan PenggunaLatihan sendiri: Compiler GDScript online