Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

نظام مصرفي

جزء من قسم Object Oriented Programming في رحلة Python على Coddy — الدرس 62 من 64.

challenge icon

التحدي

صعب

في هذا التحدي، ستقوم ببناء نظام مصرفي بأنواع حسابات متعددة، ومعاملات، ومدير بنك مركزي.

قم بتنفيذ النظام المصرفي من خلال إكمال عناصر TODO في هذه الملفات:

  • transaction.py - فئة Transaction لتسجيل الأنشطة المالية
  • account.py - فئة Account الأساسية المجردة مع الوظائف المشتركة
  • savingsaccount.py - تنفيذ SavingsAccount مع الفائدة والحد الأدنى للرصيد
  • checkingaccount.py - تنفيذ CheckingAccount مع إمكانيات السحب على المكشوف
  • bank.py - فئة Bank لإدارة الحسابات والتحويلات

ورقة مرجعية

يتضمن هذا التحدي بناء نظام بنكي باستخدام مفاهيم البرمجة كائنية التوجه، بما في ذلك:

  • Transaction class - يسجل الأنشطة المالية
  • Abstract Account class - فئة أساسية تحتوي على وظائف الحساب المشتركة
  • SavingsAccount - نوع حساب يتضمن حساب الفوائد ومتطلبات الحد الأدنى للرصيد
  • CheckingAccount - نوع حساب يتضمن ميزات الحماية من السحب على المكشوف
  • Bank class - مدير مركزي للحسابات وتحويلات الأموال

تشمل المفاهيم الأساسية الوراثة (inheritance)، والتجريد (abstraction)، والتغليف (encapsulation)، وتعدد الأشكال (polymorphism) لإنشاء بنية نظام بنكي نمطية.

جرّب بنفسك

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

# معالج حالات اختبار شامل يغطي جميع السيناريوهات والحالات الاستثنائية
test_case = input()

if test_case == "transaction_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":
    # اختبار وظيفة الإيداع
    savings = SavingsAccount("S123", "John Doe", 500)
    
    # مبلغ إيجابي
    success, message = savings.deposit(200)
    print(f"Success: {success}")
    print(f"Message: {message}")
    print(f"Balance: ${savings.get_balance():.2f}")
    
    # مبلغ سلبي (يجب أن يفشل)
    success, message = savings.deposit(-50)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "savings_withdraw":
    # اختبار السحب من حساب التوفير
    savings = SavingsAccount("S123", "John Doe", 500, min_balance=200)
    
    # سحب صالح
    success, message = savings.withdraw(100)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # غير صالح (أقل من الحد الأدنى للرصيد)
    success, message = savings.withdraw(300)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # مبلغ سلبي
    success, message = savings.withdraw(-50)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "checking_withdraw":
    # اختبار السحب من الحساب الجاري
    checking = CheckingAccount("C123", "Jane Smith", 300, overdraft_limit=200)
    
    # سحب عادي
    success, message = checking.withdraw(100)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # سحب على المكشوف
    success, message = checking.withdraw(300)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # تجاوز حد السحب على المكشوف
    success, message = checking.withdraw(200)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "interest_application":
    # اختبار تطبيق الفائدة
    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}")
    
    # التحقق من سجل المعاملات
    transactions = savings.get_transaction_history()
    print(f"Transaction count: {len(transactions)}")
    print(f"Last transaction: {transactions[-1]}")

elif test_case == "bank_create_account":
    # اختبار إنشاء حساب بنكي
    bank = Bank("Test Bank")
    
    # إنشاء حساب توفير
    success, message = bank.create_account("savings", "S123", "John Doe", 1000, interest_rate=0.03)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # إنشاء حساب جاري
    success, message = bank.create_account("checking", "C456", "Jane Smith", 500, overdraft_limit=300)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # إنشاء برقم حساب مكرر
    success, message = bank.create_account("savings", "S123", "Another Person", 200)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # إنشاء بنوع غير صالح
    success, message = bank.create_account("invalid", "I789", "Test Person", 100)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "bank_transfer":
    # اختبار وظيفة التحويل البنكي
    bank = Bank("Transfer Test Bank")
    
    # إنشاء حسابين
    bank.create_account("savings", "S123", "John Doe", 1000, min_balance=100)
    bank.create_account("checking", "C456", "Jane Smith", 500)
    
    # تحويل صالح
    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}")
    
    # تحويل غير صالح (يتجاوز الحد الأدنى للرصيد)
    success, message = bank.transfer("S123", "C456", 700)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # حساب غير موجود
    success, message = bank.transfer("NONEXISTENT", "C456", 100)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "full_banking_workflow":
    # اختبار سير عمل بنكي كامل
    bank = Bank("Full Workflow Bank")
    
    # إنشاء حسابات
    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)
    
    # إجراء إيداعات
    savings = bank.get_account("S123")
    checking = bank.get_account("C456")
    
    savings.deposit(300)
    checking.deposit(200)
    
    # إجراء تحويل
    bank.transfer("S123", "C456", 400)
    
    # تطبيق الفائدة على حساب التوفير
    savings.apply_interest()
    
    # إجراء سحب من الحساب الجاري مع سحب على المكشوف
    checking.withdraw(900)
    
    # طباعة الحالة النهائية
    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":
    # التحقق الشامل من الوراثة
    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":
    # اختبار سلوك تجاوز الأساليب (method overriding)
    print('Testing method overriding...')
    # إنشاء مثيلات واختبار الأساليب التي تم تجاوزها
    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":
    # اختبار الوصول إلى السمات
    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":
    # اختبار الشروط الحدودية والقيم القصوى
    print('Running boundary_conditions_test test...')
    print('Test completed successfully')

elif test_case == "error_handling_test":
    # اختبار معالجة الأخطاء وسيناريوهات الاستثناءات
    print('Running error_handling_test test...')
    print('Test completed successfully')

elif test_case == "polymorphic_behavior_test":
    # اختبار السلوك متعدد الأشكال مع كائنات مختلطة
    print('Running polymorphic_behavior_test test...')
    print('Test completed successfully')

elif test_case == "stress_test":
    # اختبار الضغط مع كائنات متعددة
    import time
    start_time = time.time()
    
    objects = []
    for i in range(50):
        try:
            objects.append(Transaction(f'test_{i}', 100, None))
        except:
            pass  # معالجة أخطاء الإنشاء بسلاسة
        try:
            objects.append(SavingsAccount(f'test_{i}', f'User_{i}'))
        except:
            pass  # معالجة أخطاء الإنشاء بسلاسة
        try:
            objects.append(CheckingAccount(f'test_{i}', f'User_{i}'))
        except:
            pass  # معالجة أخطاء الإنشاء بسلاسة
        try:
            objects.append(Bank(f'test_{i}'))
        except:
            pass  # معالجة أخطاء الإنشاء بسلاسة
    
    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":
    # اختبار التحقق الشامل
    print('=== Comprehensive Validation Test ===')
    
    # الاختبار 1: إنشاء الكائنات الأساسية
    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