السلام عليكم
قمتُ بكتابة هذا الموضوع نظراً لوجود العديد من الطلبات بخصوص مشاريع صغيرة تسمح للمبتدئين بقياس مدى فهم الأمور التي تعلموها في الجافا.
الهدف من هذا المشروع هو إنشاء تطبيق صغير يسمح بإجراء عمليات معينة على حسابات بنكية و يُتيح تخزين بيانات كل عميل في ملف نصي على القرص الصلب.
المرحلة الأولى : (إنشاء واجهة التطبيق)
هذه صورة لواجهة التطبيق :
الـ package ذو الاسم GUI يحتوي على فئتين, الأولى باسم CompteFrame حيث تُمثل الواجهة الرئيسية للتطبيق و الثانية باسم Main حيث تُمثل الفئة الرئيسية للمشروع.
- الفئة CompteFrame لا تحتوي على main.
- تم بناء الواجهة بشكل يدوي (لم أستخدم طريقة Drag and Drop)
المرحلة الثانية : (إنشاء حسابات المستخدمين)
الـ package ذو الاسم Transaction يحتوي على فئتين, الأولى Compte و الثانية FileCompte.
الفئة FileCompte تحتوي على دالتين, الأولى باسم compteToFile حيث تأخذ بيانات الحساب و تخزنها في ملف نصي و الثانية باسم fileTopCompte تأخذ رقم الحساب و تُعيد كائن من نوع Compte يحتوي على البيانات المخزنة داخل الملف.
الفئة Compte تحتوي على :
- constructeur يسمح بإنشاء حساب جديد.
- الدوال getNom, getPrenom, getSolde, getDecouvert, getNumeroCompte, getHistorique.
- دالتين, إحداهما لسحب مبلغ و الأخرى لشحن الحساب : crediter (double montant), debiter (double montant)l.
- الدالة setDecouvert (montant nouveauDecouvert)l التي تسمح بتغيير المبلغ الأدنى الذي يجب أن يبقى دائما في الحساب.
المرحلة الثالثة : (transactions management)
لإدارة و تسيير العمليات التجارية, اعتبرتُ أن حساب العميل عبارة عن critical resource و بالتالي لا يُمكن إجراء عملية شحن و سحب مبلغ على حساب معين في نفس الوقت لذا قمتُ بتسيير الـ synchronization لكلتا العمليتين.
قمتُ بإنشاء package باسم Synchro يحتوي على فئتين, الأولى باسم ThreadCompteRetrait و الثانية باسم ThreadCompteDepot لتسيير و إدارة عمليات السحب و الشحن على التوالي.
المرحلة الرابعة : (إدارة الأحداث لجعل الواحهة تتفاعل مع المستخدم)
الزر Creer compte يسمح بإنشاء حساب جديد انطلاقا من البيانات الموجودة في الخانات بالأعلى. بمجرد إنشاء حساب جديد, سيتم تخزين بيانات العميل في ملف نصي على القرص الصلب.
قمتُ بأخذ الـ constraints التالية بعين لااعتبار : (الـ package ذو الاسم Filter يحتوي على الفئات المسؤولة عن هذه الـ constraints)
- لإنشاء حساب جديد, يجب ملىء كافة الحقول و إلا سيتم إظهار نافذة صغيرة تُوضح سبب الخطأ.
- الحقلين prenom و nom يجب أن يحتويان على حروف فقط, إذا حاول المستخدم إدخال أرقام أو رموز, يتوقف المؤشر عن الكتابة.
- الحقلين solde و decouvert يجب أن يحتويان على أرقام فقط و عند محاولة إدخال أحرف, يتوقف المؤشر عن الكتابة.
- الحقل NumeroCompte يجب أن لا يزيد طوله عن 10 أرقام, بمجرد تخطي عشرة أرقام عند عملية الادخال, يتوقف المؤشر عن الكتابة.
- بالإضافة إلى ما سبق, يُمكن للمستخدم تشغيل الزر بمجرد أن يضع عليه الـ focus و يضغط على enter.
- إذا تمت عملية الإنشاء بنجاح, يتم إظهار نافذة صغيرة توضح ذلك.
فائدة الزر Historique du compte تأتي في إظهار بيانات العميل في الخانة الكبيرة الموجودة وسط النافذة. لإظهار معلومات عميل معين, يكفي إدخال الرقم الخاص به و الضغط على الزر Historique du compte.
الزرين Depot و Retrait يسمحان بسحب أو شحن الحساب على التوالي. (هاتان العمليتان تم عملهما كـ synchronized) بمجرد إدخال رقم العميل بالأسفل, يمكن سحب أو شحن مبلغ معين. المبلغ يجب أن يتكون من أرقام فقط.
أيضاً, لسحب أو شحن مبلغ معين يمكن أيضا إدخال البيانات و الضغط على enter في الخانة الثانية أو الثالثة حسب نوع العملية.
أخيراً, قمتُ بعمل jar لكل من synchro و transaction و قمتُ بعمل import لملف الـ jar في المشروع, فأصبح هكذا :
لتحميل المشروع كاملا مع ملف jar لتجربة البرنامج :
تحياتي.
السلام عليكم أرجو التواصل معي على رقم الواتس 00491782824011