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
التعليقات