نظام مصرفي
جزء من قسم Object Oriented Programming في رحلة Dart على Coddy — الدرس 108 من 110.
التحدي
سهللنقم ببناء نظام بنكي يحاكي العمليات المالية الواقعية باستخدام مبادئ البرمجة كائنية التوجه (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: $balancewithdraw(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). أضف كلا الحسابين للعميل واطبع بيانات العميل. ثم قم بإجراء هذه العمليات:- إيداع $200 في حساب التوفير
- سحب $300 من حساب التوفير (يجب أن ينجح)
- محاولة سحب $600 من حساب التوفير (يجب أن يُرفض - يتجاوز الحد)
- تطبيق فائدة بنسبة 5% على حساب التوفير
- سحب $550 من الحساب الجاري (يجب أن ينجح باستخدام السحب على المكشوف)
- محاولة سحب $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
1أساسيات الـ OOP
الملفات الخارجيةالمكتبات والـ Importsمقدمة في الـ OOPالـ Classes مقابل الـ Objectsالكلمة المفتاحية thisالـ Methodsمتغيرات الـ Instanceأساسيات الـ Constructorمراجعة - آلة حاسبة بسيطة4أمان الـ Null
مقدمة في أمان الـ NullNullable مقابل Non-Nullableعاملا الـ ? و !الكلمة المفتاحية Late وأمان الـ Nullالعوامل المدركة للـ Nullأمان الـ Null في الـ Classesمراجعة - نظام ملف تعريف المستخدم7الفئات المجردة والواجهات
الفئات المجردةالدوال المجردةالواجهات في Dartالواجهات الضمنيةالتنفيذ مقابل التوسيعالواجهات المتعددةمراجعة - حاسبة الأشكال10المجموعات والأنماط العامة
نظرة عامة على List و Set و Mapالمجموعات آمنة النوعالفئات العامةالدوال العامةقيود الأنماط العامةIterable و Iteratorملخص - التخزين العام13مفاهيم OOP المتقدمة
التركيب مقابل الوراثة (Composition vs Inheritance)دوال التوسعة (Extension Methods)الأصناف القابلة للاستدعاء (Callable Classes)الأصناف المختومة (Sealed Classes - Dart 3)السجلات (Records - Dart 3)الأنماط والمطابقة (Patterns & Matching - 3.0)التعدادات مع الدوال (Enums with Methods)2المنشئات في Dart
المنشئ الافتراضيالمنشئات المسماةقوائم التهيئةالمنشئات الثابتةالمنشئات المصنعيةالمنشئات الموجهةملخص - بناء الأشكال5التغليف (Encapsulation)
الأعضاء العامة مقابل الخاصةاتفاقية البادئة _الخصوصية على مستوى المكتبةتعمق في Getters و Settersإخفاء المعلوماتمراجعة - سجلات الطلاب8Mixins
مقدمة إلى Mixinsإنشاء Mixinsاستخدام Mixins متعددةالكلمة المفتاحية on في MixinsMixin مقابل الوراثة (Inheritance)Mixin مقابل الواجهة (Interface)مراجعة - نظام الحيوانات (Animal System)3خصائص الـ Class
أعضاء الـ Instance مقابل الـ Staticحقول Final و Constمتغيرات Lateالـ Static Methods والحقولدوال الـ Getters والـ Settersمراجعة - مدير الحساب البنكي6الوراثة
أساسيات الوراثةالكلمة المفتاحية superإعادة تعريف الدوال (Method Overriding)الوسم @overrideالكلمة المفتاحية final Classالدوال البانية والوراثةمراجعة - هيكلية الموظفين9تعدد الأشكال
أساسيات تعدد الأشكالتعدد الأشكال عبر الـ Interfacesالتحقق من النوع أثناء التشغيلالمعاملات is و asالكلمة المفتاحية Covariantملخص - معالج الدفع12البرمجة الكائنية غير المتزامنة (Async OOP)
Futures و async/awaitأساسيات الـ Streamsمتحكمات الـ Streamsالـ Constructors غير المتزامنةالعمليات غير المتزامنة في دوال الكلاسمراجعة - جالب البيانات (Data Fetcher)15أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المستودع