Menu
Coddy logo textTech

Banksystem

Teil des Abschnitts Object Oriented Programming der Python-Journey von Coddy — Lektion 62 von 64.

challenge icon

Aufgabe

Schwer

In dieser Herausforderung wirst du ein Bankensystem mit mehreren Kontotypen, Transaktionen und einem zentralen Bankmanager erstellen.

Implementiere das Bankensystem, indem du die TODO-Elemente in diesen Dateien vervollständigst:

  • transaction.py - Transaction-Klasse zur Aufzeichnung von Finanzaktivitäten
  • account.py - Abstrakte Account-Basisklasse mit allgemeiner Funktionalität
  • savingsaccount.py - SavingsAccount-Implementierung mit Zinsen und Mindestguthaben
  • checkingaccount.py - CheckingAccount-Implementierung mit Überziehungsmöglichkeiten
  • bank.py - Bank-Klasse zur Verwaltung von Konten und Überweisungen

Spickzettel

Diese Herausforderung umfasst den Aufbau eines Bankensystems mit objektorientierten Programmierkonzepten, einschließlich:

  • Transaction-Klasse - Zeichnet Finanzaktivitäten auf
  • Abstrakte Account-Klasse - Basisklasse mit gemeinsamer Kontofunktionalität
  • SavingsAccount - Kontotyp mit Zinsberechnung und Mindestguthabenanforderungen
  • CheckingAccount - Kontotyp mit Überziehungsschutzfunktionen
  • Bank-Klasse - Zentraler Verwalter für Konten und Geldtransfers

Zu den Schlüsselkonzepten gehören Vererbung, Abstraktion, Kapselung und Polymorphismus, um eine modulare Architektur für ein Bankensystem zu erstellen.

Probier es selbst

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

# Umfassender Testfall-Handler, der alle Szenarien und Grenzfälle abdeckt
test_case = input()

if test_case == "transaction_class":
    # Teste Transaction-Klasse
    transaction = Transaction("deposit", 100.50, None)
    print(str(transaction))
    
    transaction = Transaction("withdrawal", 75.25, None)
    print(str(transaction))

elif test_case == "account_deposit":
    # Teste Einzahlungsfunktionalität
    savings = SavingsAccount("S123", "John Doe", 500)
    
    # Positiver Betrag
    success, message = savings.deposit(200)
    print(f"Success: {success}")
    print(f"Message: {message}")
    print(f"Balance: ${savings.get_balance():.2f}")
    
    # Negativer Betrag (sollte fehlschlagen)
    success, message = savings.deposit(-50)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "savings_withdraw":
    # Teste Auszahlung vom Sparkonto
    savings = SavingsAccount("S123", "John Doe", 500, min_balance=200)
    
    # Gültige Auszahlung
    success, message = savings.withdraw(100)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Ungültig (unter Mindestguthaben)
    success, message = savings.withdraw(300)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Negativer Betrag
    success, message = savings.withdraw(-50)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "checking_withdraw":
    # Teste Auszahlung vom Girokonto
    checking = CheckingAccount("C123", "Jane Smith", 300, overdraft_limit=200)
    
    # Normale Auszahlung
    success, message = checking.withdraw(100)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Auszahlung mit Überziehung
    success, message = checking.withdraw(300)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Überziehungslimit überschritten
    success, message = checking.withdraw(200)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "interest_application":
    # Teste Zinsgutschrift
    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}")
    
    # Transaktionsverlauf prüfen
    transactions = savings.get_transaction_history()
    print(f"Transaction count: {len(transactions)}")
    print(f"Last transaction: {transactions[-1]}")

elif test_case == "bank_create_account":
    # Teste Erstellung eines Bankkontos
    bank = Bank("Test Bank")
    
    # Erstelle ein Sparkonto
    success, message = bank.create_account("savings", "S123", "John Doe", 1000, interest_rate=0.03)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Erstelle ein Girokonto
    success, message = bank.create_account("checking", "C456", "Jane Smith", 500, overdraft_limit=300)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Erstellung mit doppelter Kontonummer
    success, message = bank.create_account("savings", "S123", "Another Person", 200)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Erstellung mit ungültigem Typ
    success, message = bank.create_account("invalid", "I789", "Test Person", 100)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "bank_transfer":
    # Teste Banküberweisungs-Funktionalität
    bank = Bank("Transfer Test Bank")
    
    # Erstelle zwei Konten
    bank.create_account("savings", "S123", "John Doe", 1000, min_balance=100)
    bank.create_account("checking", "C456", "Jane Smith", 500)
    
    # Gültige Überweisung
    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}")
    
    # Ungültige Überweisung (unterschreitet Mindestguthaben)
    success, message = bank.transfer("S123", "C456", 700)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Ungültiges Konto
    success, message = bank.transfer("NONEXISTENT", "C456", 100)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "full_banking_workflow":
    # Teste einen vollständigen Workflow
    bank = Bank("Full Workflow Bank")
    
    # Konten erstellen
    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)
    
    # Einzahlungen vornehmen
    savings = bank.get_account("S123")
    checking = bank.get_account("C456")
    
    savings.deposit(300)
    checking.deposit(200)
    
    # Eine Überweisung tätigen
    bank.transfer("S123", "C456", 400)
    
    # Zinsen auf Sparkonto anwenden
    savings.apply_interest()
    
    # Eine Auszahlung vom Girokonto mit Überziehung vornehmen
    checking.withdraw(900)
    
    # Endzustand ausgeben
    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":
    # Umfassende Validierung der Vererbung
    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":
    # Teste das Verhalten beim Überschreiben von Methoden
    print('Testing method overriding...')
    # Instanzen erstellen und überschriebene Methoden testen
    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":
    # Teste Attributzugriff
    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":
    # Teste Randbedingungen und Grenzwerte
    print('Running boundary_conditions_test test...')
    print('Test completed successfully')

elif test_case == "error_handling_test":
    # Teste Fehlerbehandlung und Ausnahmeszenarien
    print('Running error_handling_test test...')
    print('Test completed successfully')

elif test_case == "polymorphic_behavior_test":
    # Teste polymorphes Verhalten mit gemischten Objekten
    print('Running polymorphic_behavior_test test...')
    print('Test completed successfully')

elif test_case == "stress_test":
    # Belastungstest mit mehreren Objekten
    import time
    start_time = time.time()
    
    objects = []
    for i in range(50):
        try:
            objects.append(Transaction(f'test_{i}', 100, None))
        except:
            pass  # Erstellungsfehler gnädig behandeln
        try:
            objects.append(SavingsAccount(f'test_{i}', f'User_{i}'))
        except:
            pass  # Erstellungsfehler gnädig behandeln
        try:
            objects.append(CheckingAccount(f'test_{i}', f'User_{i}'))
        except:
            pass  # Erstellungsfehler gnädig behandeln
        try:
            objects.append(Bank(f'test_{i}'))
        except:
            pass  # Erstellungsfehler gnädig behandeln
    
    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":
    # Umfassender Validierungstest
    print('=== Comprehensive Validation Test ===')
    
    # Test 1: Grundlegende Objekterstellung
    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 ===')

Alle Lektionen in Object Oriented Programming