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

نظام مصرفي

جزء من قسم Object Oriented Programming في رحلة Dart على Coddy — الدرس 108 من 110.

challenge icon

التحدي

سهل

لنقم ببناء نظام بنكي يحاكي العمليات المالية الواقعية باستخدام مبادئ البرمجة كائنية التوجه (OOP) التي أتقنتها خلال هذه الدورة. ستقوم بإنشاء حسابات بقواعد مختلفة، وتتبع المعاملات، وإدارة العملاء - وكل ذلك منظم عبر ملفات متعددة.

سيتم تنظيم نظامك البنكي عبر ستة ملفات:

  • transaction.dart: أنشئ فئة Transaction تمثل سجلاً غير قابل للتغيير لعملية مالية. يحتوي كل معاملة على حقول final لـ type (String - "deposit" أو "withdrawal" أو "transfer")، و amount (double)، و timestamp (DateTime). قم بإعادة كتابة (Override) لـ toString() لتعيد [type] $amount.
  • account.dart: أنشئ فئة مجردة (abstract) باسم Account تحتوي على _balance (double) خاص، ورقم حساب final (accountNumber - String)، و List<Transaction> لتخزين سجل المعاملات. قم بتضمين getter للرصيد، و setter محمي set balance(double value) حتى تتمكن الفئات الفرعية في الملفات الأخرى من تحديث الرصيد، وطريقة مجردة (abstract method) باسم bool canWithdraw(double amount) تقوم الفئات الفرعية بتنفيذها، وهذه الطرق الملموسة (concrete methods):
    • deposit(double amount) - تضيف إلى الرصيد، وتسجل معاملة، وتطبع Deposited $amount. Balance: $balance
    • withdraw(double amount) - إذا كانت canWithdraw() تعيد true، تطرح من الرصيد، وتسجل معاملة، وتطبع Withdrew $amount. Balance: $balance. خلاف ذلك تطبع Withdrawal denied.
    • getTransactionCount() - تعيد عدد المعاملات
  • savings_account.dart: أنشئ SavingsAccount يرث من Account. حسابات التوفير لها حد للسحب - لا يمكن سحب أكثر من $500 في معاملة واحدة. قم بتنفيذ canWithdraw() لفرض هذه القاعدة (مع ضمان كفاية الرصيد أيضاً). أضف طريقة applyInterest(double rate) تزيد الرصيد بنسبة مئوية معينة باستخدام getter و setter الخاص بـ balance، ثم تطبع Interest applied. Balance: $balance.
  • checking_account.dart: أنشئ CheckingAccount يرث من Account. حسابات الجاري لها حماية من السحب على المكشوف حتى $100 - يمكن أن يصبح الرصيد سالباً ولكن ليس أقل من -$100. قم بتنفيذ canWithdraw() للسماح بالسحب طالما أن الرصيد الناتج يبقى عند أو فوق -$100.
  • customer.dart: أنشئ فئة Customer مع id (String)، و name (String)، و List<Account> لحساباتهم. قم بتضمين طرق addAccount(Account account) لإضافة حساب، و getTotalBalance() التي تعيد مجموع أرصدة جميع الحسابات. قم بإعادة كتابة toString() لتعيد Customer: name (X accounts).
  • main.dart: استعرض نظامك البنكي. أنشئ عميلاً (C001, John Smith). أنشئ SavingsAccount (SAV001، برصيد ابتدائي $1000) و CheckingAccount (CHK001، برصيد ابتدائي $500). أضف كلا الحسابين للعميل واطبع بيانات العميل. ثم قم بإجراء هذه العمليات:
    1. إيداع $200 في حساب التوفير
    2. سحب $300 من حساب التوفير (يجب أن ينجح)
    3. محاولة سحب $600 من حساب التوفير (يجب أن يُرفض - يتجاوز الحد)
    4. تطبيق فائدة بنسبة 5% على حساب التوفير
    5. سحب $550 من الحساب الجاري (يجب أن ينجح باستخدام السحب على المكشوف)
    6. محاولة سحب $100 إضافية من الحساب الجاري (يجب أن يُرفض - سيتجاوز حد السحب على المكشوف)
    أخيراً، اطبع Savings transactions: X و Total balance: $Y (منسقاً إلى منزلتين عشريتين).

المخرجات المتوقعة:

Customer: John Smith (2 accounts)
Deposited $200.0. Balance: $1200.0
Withdrew $300.0. Balance: $900.0
Withdrawal denied
Interest applied. Balance: $945.0
Withdrew $550.0. Balance: $-50.0
Withdrawal denied
Savings transactions: 3
Total balance: $895.0

جرّب بنفسك

import 'transaction.dart';
import 'account.dart';
import 'savings_account.dart';
import 'checking_account.dart';
import 'customer.dart';

void main() {
  // TODO: إنشاء عميل بـ id "C001" واسم "John Smith"
  
  // TODO: إنشاء SavingsAccount بـ accountNumber "SAV001" ورصيد ابتدائي $1000
  
  // TODO: إنشاء CheckingAccount بـ accountNumber "CHK001" ورصيد ابتدائي $500
  
  // TODO: إضافة كلا الحسابين إلى العميل
  
  // TODO: طباعة العميل
  
  // TODO: تنفيذ العمليات التالية:
  // 1. إيداع $200 في حساب التوفير (savings account)
  // 2. سحب $300 من حساب التوفير (savings account) (يجب أن ينجح)
  // 3. محاولة سحب $600 من حساب التوفير (savings account) (يجب أن يتم الرفض - يتجاوز الحد)
  // 4. تطبيق فائدة بنسبة 5% على حساب التوفير (savings account)
  // 5. سحب $550 من الحساب الجاري (checking account) (يجب أن ينجح باستخدام السحب على المكشوف)
  // 6. محاولة سحب $100 إضافية من الحساب الجاري (checking) (يجب أن يتم الرفض - سيتجاوز حد السحب على المكشوف)
  
  // TODO: طباعة "Savings transactions: X" حيث X هو عدد المعاملات
  
  // TODO: طباعة "Total balance: \$Y" حيث Y منسق إلى منزلتين عشريتين
}

جميع دروس Object Oriented Programming