Menu
Coddy logo textTech

Bankacılık Sistemi

Coddy'nin Python Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 62 / 64.

challenge icon

Görev

Zor

Bu meydan okumada, birden fazla hesap türü, işlem ve merkezi bir banka yöneticisi içeren bir bankacılık sistemi oluşturacaksınız.

Şu dosyalardaki TODO öğelerini tamamlayarak bankacılık sistemini uygulayın:

  • transaction.py - Finansal faaliyetleri kaydetmek için Transaction sınıfı
  • account.py - Ortak işlevselliğe sahip soyut temel Account sınıfı
  • savingsaccount.py - Faiz ve minimum bakiye içeren SavingsAccount uygulaması
  • checkingaccount.py - Fazla çekim (overdraft) özelliklerine sahip CheckingAccount uygulaması
  • bank.py - Hesapları ve transferleri yönetmek için Bank sınıfı

Kopya kağıdı

Bu meydan okuma, aşağıdakiler de dahil olmak üzere nesne yönelimli programlama kavramlarıyla bir bankacılık sistemi oluşturmayı içerir:

  • Transaction class - Finansal faaliyetleri kaydeder
  • Abstract Account class - Ortak hesap işlevselliğine sahip temel sınıf
  • SavingsAccount - Faiz hesaplama ve minimum bakiye gereksinimleri olan hesap türü
  • CheckingAccount - Kredili mevduat koruma özelliklerine sahip hesap türü
  • Bank class - Hesaplar ve para transferleri için merkezi yönetici

Temel kavramlar, modüler bir bankacılık sistemi mimarisi oluşturmak için kalıtım, soyutlama, kapsülleme ve çok biçimliliği içerir.

Kendin dene

from transaction import Transaction
from account import Account
from savingsaccount import SavingsAccount
from checkingaccount import CheckingAccount
from bank import Bank

# Tüm senaryoları ve uç durumları kapsayan kapsamlı test durumu işleyicisi
test_case = input()

if test_case == "transaction_class":
    # Transaction sınıfını test et
    transaction = Transaction("deposit", 100.50, None)
    print(str(transaction))
    
    transaction = Transaction("withdrawal", 75.25, None)
    print(str(transaction))

elif test_case == "account_deposit":
    # Para yatırma işlevini test et
    savings = SavingsAccount("S123", "John Doe", 500)
    
    # Pozitif miktar
    success, message = savings.deposit(200)
    print(f"Success: {success}")
    print(f"Message: {message}")
    print(f"Balance: ${savings.get_balance():.2f}")
    
    # Negatif miktar (başarısız olmalı)
    success, message = savings.deposit(-50)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "savings_withdraw":
    # Tasarruf hesabı para çekme işlemini test et
    savings = SavingsAccount("S123", "John Doe", 500, min_balance=200)
    
    # Geçerli para çekme
    success, message = savings.withdraw(100)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Geçersiz (minimum bakiyenin altında)
    success, message = savings.withdraw(300)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Negatif miktar
    success, message = savings.withdraw(-50)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "checking_withdraw":
    # Vadesiz hesap para çekme işlemini test et
    checking = CheckingAccount("C123", "Jane Smith", 300, overdraft_limit=200)
    
    # Normal para çekme
    success, message = checking.withdraw(100)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Kredili mevduat (overdraft) ile para çekme
    success, message = checking.withdraw(300)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Kredili mevduat limitini aşma
    success, message = checking.withdraw(200)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "interest_application":
    # Faiz uygulamasını test et
    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}")
    
    # İşlem geçmişini kontrol et
    transactions = savings.get_transaction_history()
    print(f"Transaction count: {len(transactions)}")
    print(f"Last transaction: {transactions[-1]}")

elif test_case == "bank_create_account":
    # Banka hesabı oluşturmayı test et
    bank = Bank("Test Bank")
    
    # Bir tasarruf hesabı oluştur
    success, message = bank.create_account("savings", "S123", "John Doe", 1000, interest_rate=0.03)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Bir vadesiz hesap oluştur
    success, message = bank.create_account("checking", "C456", "Jane Smith", 500, overdraft_limit=300)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Mükerrer hesap numarası ile oluştur
    success, message = bank.create_account("savings", "S123", "Another Person", 200)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Geçersiz tür ile oluştur
    success, message = bank.create_account("invalid", "I789", "Test Person", 100)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "bank_transfer":
    # Banka transfer işlevini test et
    bank = Bank("Transfer Test Bank")
    
    # İki hesap oluştur
    bank.create_account("savings", "S123", "John Doe", 1000, min_balance=100)
    bank.create_account("checking", "C456", "Jane Smith", 500)
    
    # Geçerli transfer
    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}")
    
    # Geçersiz transfer (minimum bakiyeyi aşıyor)
    success, message = bank.transfer("S123", "C456", 700)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Geçersiz hesap
    success, message = bank.transfer("NONEXISTENT", "C456", 100)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "full_banking_workflow":
    # Tam bir iş akışını test et
    bank = Bank("Full Workflow Bank")
    
    # Hesapları oluştur
    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)
    
    # Para yatır
    savings = bank.get_account("S123")
    checking = bank.get_account("C456")
    
    savings.deposit(300)
    checking.deposit(200)
    
    # Transfer yap
    bank.transfer("S123", "C456", 400)
    
    # Tasarruf hesabına faiz uygula
    savings.apply_interest()
    
    # Kredili mevduat ile vadesiz hesaptan para çek
    checking.withdraw(900)
    
    # Son durumu yazdır
    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":
    # Kapsamlı kalıtım doğrulaması
    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":
    # Metot geçersiz kılma (overriding) davranışını test et
    print('Testing method overriding...')
    # Örnekler oluştur ve geçersiz kılınan metotları test et
    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":
    # Öznitelik erişimini test et
    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":
    # Sınır koşullarını ve uç değerleri test et
    print('Running boundary_conditions_test test...')
    print('Test completed successfully')

elif test_case == "error_handling_test":
    # Hata yönetimi ve istisna senaryolarını test et
    print('Running error_handling_test test...')
    print('Test completed successfully')

elif test_case == "polymorphic_behavior_test":
    # Karışık nesnelerle polimorfik davranışı test et
    print('Running polymorphic_behavior_test test...')
    print('Test completed successfully')

elif test_case == "stress_test":
    # Birden fazla nesne ile stres testi
    import time
    start_time = time.time()
    
    objects = []
    for i in range(50):
        try:
            objects.append(Transaction(f'test_{i}', 100, None))
        except:
            pass  # Oluşturma hatalarını nazikçe ele al
        try:
            objects.append(SavingsAccount(f'test_{i}', f'User_{i}'))
        except:
            pass  # Oluşturma hatalarını nazikçe ele al
        try:
            objects.append(CheckingAccount(f'test_{i}', f'User_{i}'))
        except:
            pass  # Oluşturma hatalarını nazikçe ele al
        try:
            objects.append(Bank(f'test_{i}'))
        except:
            pass  # Oluşturma hatalarını nazikçe ele al
    
    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":
    # Kapsamlı doğrulama testi
    print('=== Comprehensive Validation Test ===')
    
    # Test 1: Temel nesne oluşturma
    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 ===')

Object Oriented Programming bölümündeki tüm dersler