Menu
CoddyTech

Hệ thống ngân hàng

Thuộc phần Lập trình hướng đối tượng trong hành trình Python của Coddy. Bài học 62 trên 64.

challenge icon

Thử thách

Khó

Trong thử thách này, bạn sẽ xây dựng một hệ thống ngân hàng với nhiều loại tài khoản, giao dịch và một bộ phận quản lý ngân hàng trung tâm.

Hoàn thiện hệ thống ngân hàng bằng cách thực hiện các mục TODO trong những tệp sau:

  • transaction.py - Lớp Transaction dùng để ghi lại các hoạt động tài chính
  • account.py - Lớp Account cơ sở trừu tượng với các chức năng chung
  • savingsaccount.py - Phần triển khai SavingsAccount với lãi suất và số dư tối thiểu
  • checkingaccount.py - Phần triển khai CheckingAccount với khả năng thấu chi
  • bank.py - Lớp Bank dùng để quản lý tài khoản và chuyển khoản

Tự làm thử

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

# Xử lý toàn diện các test case, bao gồm mọi tình huống và trường hợp biên
test_case = input()

if test_case == "transaction_class":
    # Kiểm tra lớp Transaction
    transaction = Transaction("deposit", 100.50, None)
    print(str(transaction))
    
    transaction = Transaction("withdrawal", 75.25, None)
    print(str(transaction))

elif test_case == "account_deposit":
    # Kiểm tra chức năng gửi tiền
    savings = SavingsAccount("S123", "John Doe", 500)
    
    # Số tiền dương
    success, message = savings.deposit(200)
    print(f"Success: {success}")
    print(f"Message: {message}")
    print(f"Balance: ${savings.get_balance():.2f}")
    
    # Số tiền âm (thao tác sẽ thất bại)
    success, message = savings.deposit(-50)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "savings_withdraw":
    # Kiểm tra việc rút tiền từ tài khoản tiết kiệm
    savings = SavingsAccount("S123", "John Doe", 500, min_balance=200)
    
    # Rút tiền hợp lệ
    success, message = savings.withdraw(100)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Không hợp lệ (số dư thấp hơn mức tối thiểu)
    success, message = savings.withdraw(300)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Số tiền âm
    success, message = savings.withdraw(-50)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "checking_withdraw":
    # Kiểm tra việc rút tiền từ tài khoản thanh toán
    checking = CheckingAccount("C123", "Jane Smith", 300, overdraft_limit=200)
    
    # Rút tiền thông thường
    success, message = checking.withdraw(100)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Rút tiền bằng hạn mức thấu chi
    success, message = checking.withdraw(300)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Vượt quá hạn mức thấu chi
    success, message = checking.withdraw(200)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "interest_application":
    # Kiểm tra việc tính lãi
    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}")
    
    # Kiểm tra lịch sử giao dịch
    transactions = savings.get_transaction_history()
    print(f"Transaction count: {len(transactions)}")
    print(f"Last transaction: {transactions[-1]}")

elif test_case == "bank_create_account":
    # Kiểm tra việc tạo tài khoản ngân hàng
    bank = Bank("Test Bank")
    
    # Tạo tài khoản tiết kiệm
    success, message = bank.create_account("savings", "S123", "John Doe", 1000, interest_rate=0.03)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Tạo tài khoản thanh toán
    success, message = bank.create_account("checking", "C456", "Jane Smith", 500, overdraft_limit=300)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Tạo tài khoản với số tài khoản trùng lặp
    success, message = bank.create_account("savings", "S123", "Another Person", 200)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Tạo tài khoản với loại không hợp lệ
    success, message = bank.create_account("invalid", "I789", "Test Person", 100)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "bank_transfer":
    # Kiểm tra chức năng chuyển khoản ngân hàng
    bank = Bank("Transfer Test Bank")
    
    # Tạo hai tài khoản
    bank.create_account("savings", "S123", "John Doe", 1000, min_balance=100)
    bank.create_account("checking", "C456", "Jane Smith", 500)
    
    # Chuyển khoản hợp lệ
    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}")
    
    # Chuyển khoản không hợp lệ (vượt quá số dư tối thiểu)
    success, message = bank.transfer("S123", "C456", 700)
    print(f"Success: {success}")
    print(f"Message: {message}")
    
    # Tài khoản không hợp lệ
    success, message = bank.transfer("NONEXISTENT", "C456", 100)
    print(f"Success: {success}")
    print(f"Message: {message}")

elif test_case == "full_banking_workflow":
    # Kiểm tra toàn bộ quy trình
    bank = Bank("Full Workflow Bank")
    
    # Tạo tài khoản
    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)
    
    # Nạp tiền vào tài khoản
    savings = bank.get_account("S123")
    checking = bank.get_account("C456")
    
    savings.deposit(300)
    checking.deposit(200)
    
    # Chuyển tiền
    bank.transfer("S123", "C456", 400)
    
    # Tính lãi cho tài khoản tiết kiệm
    savings.apply_interest()
    
    # Rút tiền từ tài khoản thanh toán bằng hạn mức thấu chi
    checking.withdraw(900)
    
    # In ra trạng thái cuối cùng
    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":
    # Kiểm tra toàn diện tính kế thừa
    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":
    # Kiểm tra cách hoạt động của phương thức (method) ghi đè
    print('Testing method overriding...')
    # Tạo các instance và kiểm tra các phương thức ghi đè
    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":
    # Kiểm tra việc truy cập thuộc tính (attribute)
    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":
    # Kiểm tra các điều kiện biên và giá trị ở ranh giới
    print('Running boundary_conditions_test test...')
    print('Test completed successfully')

elif test_case == "error_handling_test":
    # Kiểm tra cách xử lý lỗi và các trường hợp ngoại lệ
    print('Running error_handling_test test...')
    print('Test completed successfully')

elif test_case == "polymorphic_behavior_test":
    # Kiểm tra tính đa hình với nhiều loại đối tượng
    print('Running polymorphic_behavior_test test...')
    print('Test completed successfully')

elif test_case == "stress_test":
    # Kiểm tra khả năng chịu tải với nhiều đối tượng
    import time
    start_time = time.time()
    
    objects = []
    for i in range(50):
        try:
            objects.append(Transaction(f'test_{i}', 100, None))
        except:
            pass  # Xử lý lỗi khi tạo đối tượng mà không làm gián đoạn chương trình
        try:
            objects.append(SavingsAccount(f'test_{i}', f'User_{i}'))
        except:
            pass  # Xử lý lỗi khi tạo đối tượng mà không làm gián đoạn chương trình
        try:
            objects.append(CheckingAccount(f'test_{i}', f'User_{i}'))
        except:
            pass  # Xử lý lỗi khi tạo đối tượng mà không làm gián đoạn chương trình
        try:
            objects.append(Bank(f'test_{i}'))
        except:
            pass  # Xử lý lỗi khi tạo đối tượng mà không làm gián đoạn chương trình
    
    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":
    # Kiểm tra toàn diện
    print('=== Comprehensive Validation Test ===')
    
    # Kiểm tra 1: Tạo đối tượng cơ bản
    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 ===')

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Python online