OOP | البرمجة بمنهجية الأصناف والأشياء OOP الجزء (06)

تحدثنا عن أولى مكونات الأصناف وهي الخصائص

وأما المكون الثاني فهو المناهج وهي الوظائف Functions الاعتيادية التي نعرفها

إلا أنها تكون تابعة وملك للصنف وتستطيع التعامل مع كل ما هو داخل الصنف من حقول وخصائص ومناهج أخرى

وما كان عام منها فيمكن استدعاؤه من خارج الصنف وما كان خاص فيستدعى داخليا فقط

أما المكون الثالث فهو الأحداث Events

إن الأحداث وجدت لمهمات إشعارية وإخطارية وتنبيهية

كيف ذلك ؟ لنضرب المثال التالي حتى يكون الأمر أقرب للفهم

لنتخيل وجود شركة لها مجلس إدارة و مدراء ورؤساء أقسام وغيرهم

ولنفترض أن هناك طرد هام متوقع وصوله إلى الشركة

وبعد وصول الطرد يتوجب إقامة اجتماع عاجل يضم بعض من أعضاء المجلس ومدير الإنتاج و رئيس قسم الجودة

ليس من المعقول أن يقوم كل شخص من هؤولاء بالاتصال بالسكرتير كل عدة ساعات للاستفسار عن وصول الطرد

تخيلوا كم سيكون الأمر متعبا

ولنتخيل سيناريو آخر أفضل من هذا

قدم المدير إلى السكرتير لائحة بأسماء الأشخاص المعنيين بالاجتماع الطاريء وطلب منه أنه مجرد وصول الطرد، فعليه إخطار هؤولاء على الفور عبر جوالاتهم في أي وقت حتى لو منتصف الليل وهم في منازلهم

في هذه الحالة لم يعد هؤولاء يشغلوا بالهم بالاستفسار عن وصول الطرد لأنهم مطمئنين أنه طالما لم يصلهم خبر من السكرتير فإن الطرد لم يصل بعد، و أنه بمجرد وصول الطرد سيعلموا بذلك فورا.

إن هذا السيناريو تماما هو عمل الأحداث في الأصناف

إن الحدث هو وظيفة خاصة يكون تصريحها ضمن الصنف و أما جسمها فيكون في كل حاضن لكائنات من نوع هذا الصنف

بمعنى حدث النقر على الماوس الذي يتبع العنصر زر مصرح عنه داخل صنف الزر ويطلق داخله ولكن جسم الحدث يكون في الحاضن وهو النافذة أو أي عنصر حاوي آخر

إن الحدث وجد للتخلص من مسألة المؤقتات Timer ومهمة فحص أمر ما ليتم تنفيذ كود بناء على نتيجة الفحص

إذا فالحدث هو منهج ولكن بنمط خاص حيث لم يوضع للاستدعاء من قبل المستخدم علما أن ذلك جائز

ولكنه وضع ليتم تنفيذه بناء على حدوث أمر ما معين

ومهمة فحص التحقق من حدوث هذا الحدث تقع على عاتق الصنف نفسه الذي بدوره يقوم بقدح الحدث ليتم تنفيذه في كل الحواضن التي أدرجت نفسها في قائمة الإخطار

تخيلوا معي أن لدينا صنف يعبر عن مادة ضمن المخزون في برنامج إدارة المخازن StoreItem

وعلى أقل تقدير سيكون لهذا الصنف عدة خصائص منها :

رقم تصنيف المادة ID

واسم المادة Name

و الكمية الحالية Quantity

ووصف لهذه المادة Description

ولنفرض أن لديه عدة مناهج

زيادة كمية المخزون Add(int Qty)

إنقاص كمية من المخزون Remove(int Qty)

على فرض أننا نريد أن ننبه المستخدم عندما تقل كمية المخزون لأي مادة مشكلة من هذا الصنف بحيث يقوم بعمل اللازم لتأمين كمية جديدة قبل نفاد الكمية بشكل مفاجيء

جرت العادة أن يتم فحص الكمية مع حد أدنى معرف مسبقا بحيث إذا تبين أن الكمية أقل أظهر رسالة تنبيه وإلا يتابع بشكل طبيعي

إن عملية الفحص هذه يجب أن يكررها المستخدم في أكثر من موضع

مثلا عند محاولة كتابة فاتورة جديدة

أو عند فتح البرنامج

أو عند عمليات الجرد

أو عند طلب ذلك في أي وقت

ولنرى لو أردنا تحقيق هذا الأمر بمفهوم الأحداث

بالإمكان تعريف خاصية لدى الصنف تدعى الحد الأدنى للكمية MinQuantity

وبهذا تكون كل مادة تحوي بداخلها قيمة الحد الأدنى الخاص بها بدلا من تسجيلها في جدول خارجي

نقوم بتعرف حدث داخل صنف المادة نطلق عليه مثلا انخفاض المخزون عن الحد الأدنى

OnQuantityLessLimit مثلا

الأن داخل الصنف عندنا وفي قسم set التابع لخاصية الكمية والتي ستنفذ عند كل تغير لكمية المادة نقوم بعملية فحص القيمة الجديدة مع خاصية الحد الأدنى فإن كانت أكبر لا نفعل شيء

وإن كانت أقل نطلق الحدث

الآن ماذا يجري عندما يتم إطلاق الحدث

في كل مكان يتم التعامل مع متغير من نوع صنف المادة وتم إدراج الحدث داخله سيتم تنفيذ هذا الإجراء

على فرض أن لدينا نافذة ضمن برنامج المحاسبة خاصة بمتابعة المخزون

فبالإمكان إدراج حدث انخفاض المخزون ضمنه وبالتالي إن أي مادة يقل مخزونها سيتم تنفيذ هذا الحدث تلقائيا ممررا الكائن الذي أطلق الحدث وبعض البارمترات التي قد تلزم

كمثال لو أن ضمن البرنامج تم إنشاء 50 كائن من النوع صنف المادة كل واحد يعبر عن مادة ما تتعامل معها الشركة

ولكل كائن بياناته الخاصة من رقم واسم وكمية وحد أدنى

إن أي مادة من هؤولاء يقل مخزونها عن الحد الخاص بها سيقوم بإطلاق الحدث والذي سيلتقطه هو الحاضن أو الكائن الحاوي لهذه الكائنات ومن ثم يتم التعامل مع هذا الحدث

طبعا لن يكون هناك 50 حدث وإنما حدث واحد ولكن لديه بارمترين أحدهما المصدر قادح الحدث sender والآخر كائن e يحوي بارمترات تخص الحدث و الذي يكون ضمنه مجموعة خصائص تختلف باختلاف الحدث وفي مثالنا قد نمرر الكمية السابقة والكمية الجديدة لاتخاذ إجراء كأن نلغي عملية الشراء أو إرسال تنبيه ما

إن الأحداث نتعامل معها حتى ولو لم نعلم عن البرمجة الكائنية شيئا

فمن منا لم يستخدم حدث النقر على الماوس أو حدث تغير النص أو حدث ضغط مفتاح لوحة مفاتيح أو حدث تغير البند المختار في اللوائح

كل هذه أحداث

وستلاحظون أن لكل حدث خصائص مختلفة ضمن البارمتر e

فتحرك الماوس قد يعيد الإحداثيات X Y و تغير النص يعيد النص الجديد قبل أن يظهره على التكست بوكس لترك المجال لإلغاء العملية أو فلترة المدخلات

وكذلك حدث تغير بند اللائحة حيث يعيد البند المختار

ولاحظوا أيضا كيف نستيطع أن نربط الحدث بأكثر من كائن لتلافي مسألة التكرار

فمثلا لو لديك مجموعة عناصر من النوع صندوق تحديد CheckBox أو اختيار Option أو مجموعة أزرار

فيكفي ربطها بحدث واحد و تقوم أنت بفحص المرسل Sender لتقرر ماذا ستفعل

إن للأحداث ضمن الصنف فائدة كبيرة قل من يستثمرها

ولكن كلما حللنا المسائل التي نبرمجها بطريقة أقرب للواقع لأصبحت استفادتنا أكبر من ميزات هذه المنهجية بالبرمجة أي منهجية OOP

وكملاحظة إحدى التسميات يطلق عليها البرمجة المقادة بالأحداث Events Driven Programming