Sistem Perbankan
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Python di Coddy. Pelajaran 62 dari 64.
Tantangan
SulitDalam tantangan ini, kamu akan membangun sistem perbankan dengan beberapa jenis akun, transaksi, dan pengelola bank pusat.
Implementasikan sistem perbankan dengan menyelesaikan item TODO di file-file ini:
transaction.py- class Transaction untuk mencatat aktivitas keuanganaccount.py- class Account abstrak sebagai basis dengan fungsionalitas umumsavingsaccount.py- implementasi SavingsAccount dengan bunga dan saldo minimumcheckingaccount.py- implementasi CheckingAccount dengan fasilitas cerukanbank.py- class Bank untuk mengelola akun dan transfer
Coba sendiri
from transaction import Transaction
from account import Account
from savingsaccount import SavingsAccount
from checkingaccount import CheckingAccount
from bank import Bank
# Penangan kasus uji menyeluruh yang mencakup semua skenario dan kasus tepi
test_case = input()
if test_case == "transaction_class":
# Uji class Transaction
transaction = Transaction("deposit", 100.50, None)
print(str(transaction))
transaction = Transaction("withdrawal", 75.25, None)
print(str(transaction))
elif test_case == "account_deposit":
# Uji fungsi penyetoran
savings = SavingsAccount("S123", "John Doe", 500)
# Jumlah positif
success, message = savings.deposit(200)
print(f"Success: {success}")
print(f"Message: {message}")
print(f"Balance: ${savings.get_balance():.2f}")
# Jumlah negatif (seharusnya gagal)
success, message = savings.deposit(-50)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "savings_withdraw":
# Uji penarikan dari rekening tabungan
savings = SavingsAccount("S123", "John Doe", 500, min_balance=200)
# Penarikan yang valid
success, message = savings.withdraw(100)
print(f"Success: {success}")
print(f"Message: {message}")
# Tidak valid (di bawah saldo minimum)
success, message = savings.withdraw(300)
print(f"Success: {success}")
print(f"Message: {message}")
# Jumlah negatif
success, message = savings.withdraw(-50)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "checking_withdraw":
# Uji penarikan dari rekening giro
checking = CheckingAccount("C123", "Jane Smith", 300, overdraft_limit=200)
# Penarikan biasa
success, message = checking.withdraw(100)
print(f"Success: {success}")
print(f"Message: {message}")
# Penarikan yang menggunakan cerukan
success, message = checking.withdraw(300)
print(f"Success: {success}")
print(f"Message: {message}")
# Melebihi batas cerukan
success, message = checking.withdraw(200)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "interest_application":
# Uji penerapan bunga
savings = SavingsAccount("S123", "John Doe", 1000, interest_rate=0.05)
success, message = savings.apply_interest()
print(f"Success: {success}")
print(f"Message: {message}")
print(f"New Balance: ${savings.get_balance():.2f}")
# Periksa riwayat transaksi
transactions = savings.get_transaction_history()
print(f"Transaction count: {len(transactions)}")
print(f"Last transaction: {transactions[-1]}")
elif test_case == "bank_create_account":
# Uji pembuatan rekening bank
bank = Bank("Test Bank")
# Buat rekening tabungan
success, message = bank.create_account("savings", "S123", "John Doe", 1000, interest_rate=0.03)
print(f"Success: {success}")
print(f"Message: {message}")
# Buat rekening giro
success, message = bank.create_account("checking", "C456", "Jane Smith", 500, overdraft_limit=300)
print(f"Success: {success}")
print(f"Message: {message}")
# Buat rekening dengan nomor yang sudah digunakan
success, message = bank.create_account("savings", "S123", "Another Person", 200)
print(f"Success: {success}")
print(f"Message: {message}")
# Buat rekening dengan tipe yang tidak valid
success, message = bank.create_account("invalid", "I789", "Test Person", 100)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "bank_transfer":
# Uji fungsi transfer bank
bank = Bank("Transfer Test Bank")
# Buat dua rekening
bank.create_account("savings", "S123", "John Doe", 1000, min_balance=100)
bank.create_account("checking", "C456", "Jane Smith", 500)
# Transfer yang valid
success, message = bank.transfer("S123", "C456", 300)
print(f"Success: {success}")
print(f"Message: {message}")
print(f"Source balance: ${bank.get_account('S123').get_balance():.2f}")
print(f"Destination balance: ${bank.get_account('C456').get_balance():.2f}")
# Transfer yang tidak valid (melampaui saldo minimum)
success, message = bank.transfer("S123", "C456", 700)
print(f"Success: {success}")
print(f"Message: {message}")
# Rekening tidak valid
success, message = bank.transfer("NONEXISTENT", "C456", 100)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "full_banking_workflow":
# Uji alur kerja lengkap
bank = Bank("Full Workflow Bank")
# Buat rekening
bank.create_account("savings", "S123", "John Doe", 1000, interest_rate=0.05, min_balance=200)
bank.create_account("checking", "C456", "Jane Smith", 500, overdraft_limit=250)
# Setorkan dana
savings = bank.get_account("S123")
checking = bank.get_account("C456")
savings.deposit(300)
checking.deposit(200)
# Transfer dana
bank.transfer("S123", "C456", 400)
# Terapkan bunga pada rekening tabungan
savings.apply_interest()
# Tarik dana dari rekening giro menggunakan fasilitas cerukan
checking.withdraw(900)
# Cetak kondisi akhir
print("Final Account States:")
print(f"Savings (S123): ${savings.get_balance():.2f}")
print(f"Checking (C456): ${checking.get_balance():.2f}")
print("\nTransaction History (Savings):")
for transaction in savings.get_transaction_history():
print(f"- {transaction}")
print("\nTransaction History (Checking):")
for transaction in checking.get_transaction_history():
print(f"- {transaction}")
elif test_case == "inheritance_validation_test":
# Validasi pewarisan secara menyeluruh
objects = []
if 'Transaction' in locals():
objects.append(Transaction('test_param', 100, None))
if 'SavingsAccount' in locals():
objects.append(SavingsAccount('test_param', 'Test User'))
if 'CheckingAccount' in locals():
objects.append(CheckingAccount('test_param', 'Test User'))
if 'Bank' in locals():
objects.append(Bank('test_param'))
for obj in objects:
print(f'{type(obj).__name__}:')
print(f' MRO: {[cls.__name__ for cls in type(obj).__mro__]}')
print()
elif test_case == "method_overriding_test":
# Uji perilaku method yang ditimpa
print('Testing method overriding...')
# Buat instance dan uji method yang ditimpa
if 'SavingsAccount' in locals():
obj = SavingsAccount('test', 'Test User')
print(f'SavingsAccount methods work correctly')
if 'CheckingAccount' in locals():
obj = CheckingAccount('test', 'Test User')
print(f'CheckingAccount methods work correctly')
elif test_case == "attribute_access_test":
# Uji akses atribut
print('Testing attribute access...')
if 'Transaction' in locals():
obj = Transaction('test', 100, None)
print(f'Transaction attributes accessible')
if 'SavingsAccount' in locals():
obj = SavingsAccount('test', 'Test User')
print(f'SavingsAccount attributes accessible')
if 'CheckingAccount' in locals():
obj = CheckingAccount('test', 'Test User')
print(f'CheckingAccount attributes accessible')
if 'Bank' in locals():
obj = Bank('test')
print(f'Bank attributes accessible')
elif test_case == "boundary_conditions_test":
# Uji kondisi batas dan nilai ekstrem
print('Running boundary_conditions_test test...')
print('Test completed successfully')
elif test_case == "error_handling_test":
# Uji penanganan error dan skenario pengecualian
print('Running error_handling_test test...')
print('Test completed successfully')
elif test_case == "polymorphic_behavior_test":
# Uji perilaku polimorfik dengan berbagai object
print('Running polymorphic_behavior_test test...')
print('Test completed successfully')
elif test_case == "stress_test":
# Uji ketahanan dengan banyak object
import time
start_time = time.time()
objects = []
for i in range(50):
try:
objects.append(Transaction(f'test_{i}', 100, None))
except:
pass # Tangani error saat membuat object dengan baik
try:
objects.append(SavingsAccount(f'test_{i}', f'User_{i}'))
except:
pass # Tangani error saat membuat object dengan baik
try:
objects.append(CheckingAccount(f'test_{i}', f'User_{i}'))
except:
pass # Tangani error saat membuat object dengan baik
try:
objects.append(Bank(f'test_{i}'))
except:
pass # Tangani error saat membuat object dengan baik
end_time = time.time()
print(f'Created {len(objects)} objects')
print(f'Time taken: {end_time - start_time:.4f} seconds')
print('Stress test completed')
elif test_case == "comprehensive_validation":
# Uji validasi menyeluruh
print('=== Comprehensive Validation Test ===')
# Uji 1: Pembuatan object dasar
print('1. Basic Object Creation:')
success_count = 0
classes = ['Transaction', 'SavingsAccount', 'CheckingAccount', 'Bank']
try:
obj = Transaction('test', 100, None)
success_count += 1
print(f' Transaction: Created successfully')
except Exception as e:
print(f' Transaction: Creation failed - {e}')
try:
obj = SavingsAccount('test', 'Test User')
success_count += 1
print(f' SavingsAccount: Created successfully')
except Exception as e:
print(f' SavingsAccount: Creation failed - {e}')
try:
obj = CheckingAccount('test', 'Test User')
success_count += 1
print(f' CheckingAccount: Created successfully')
except Exception as e:
print(f' CheckingAccount: Creation failed - {e}')
try:
obj = Bank('test')
success_count += 1
print(f' Bank: Created successfully')
except Exception as e:
print(f' Bank: Creation failed - {e}')
print(f' Successfully created {success_count}/{len(classes)} classes')
print('=== Validation Complete ===')Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass vs objectParameter selfmethodAtributMethod Konstruktor (__init__)Rangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan DasarFungsi super()Penimpaan MethodPewarisan BergandaUrutan Resolusi MethodRingkasan: Hierarki Karyawan7Special method
Pengantar Magic methodOverloading OperatorMagic method untuk wadahUlasan: list khusus13Tantangan Akhir
Platform E-learningSistem PerbankanPengembangan Karakter GameLayanan Penyewaan Kendaraan5Polimorfisme
Meninjau Ulang Method OverridingDuck Typingclass dan method AbstrakDesain InterfaceRingkasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanMixinsMetode Statis dan Metode ClassDecorator ClassPengelola Konteks11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola Composite3Property class
Variabel instance vs variabel classDekorator propertyAtribut privatRangkuman: Pengelola Rekening Bank6Enkapsulasi
Anggota Public, Protected, PrivateModifier AksesPenyembunyian InformasiDecorator Property Tingkat LanjutUlasan: Sistem Catatan Siswa12Proyek: Manajemen Perpustakaan
Ikhtisar Proyekclass Buku dan PenggunaSistem PeminjamanFitur PencarianAntarmuka AdminPengujian dan IntegrasiLatihan sendiri: Compiler Python online