الدوال البعدية callback function

السلام عليكم

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

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

تعريف الدوال البعدية callback function
الفكرة الأساسية هنا بعد أن تنتهي من تنفيذ عمل ما قم بمناداة الدالة البعدية
مثال
بعد أن تنتهي من تشغيل أغنية ما قم بتنفيذ دالة تختار الأغنية الجديدة التي ستقوم بتنفيذها
بعد أن تنتهي من كتابة كلمة ما قم بعرضها على المدقق الإملائي
ويجوز تسمية الدوال القبلية (الدوال التي تتم مناداتها قبل الخوض في غمار أمر ما) بنفس الاسم كون اسم الدوال البعدية callback methods ذو شعبية واسعة
مثال
قبل أن تقوم بتحريك الشكل الفلاني قم بتشغيل مؤثرات الصوت

أمثلة على أطر عمل توفر لك callback بشكل جيد
Servlet يوجد فيها دوال يمكنك كتابة شيفرتك فيها قبل وبعد إنشاء الـ request session application
JSF يوجد فيه دوال تمكنك من تنفيذ شيفرتك الخاصة قبل وبعد كل حالة من حالات دورة حياتها
android يوجد فيها دوال تمكنك من تنفيذ شيفرتك الخاصة بعد كل حالة من حالات دورة حياة Activity و service

لماذا أحتاج أن أتعرف عليها؟
1- تصميم إطار عمل خاص بك
2- تساعدك على فهم أطر العمل الموجودة والتعامل معها ببساطة

بعد أن تعرفنا على تعريف الدوال البعدية ورأينا أمثلة عليها يجب علينا أن نراها بمنظورين وعرفنا أنها مهمة لنا كمطورين نحتاج أن نعرف عن آلية عملها
منظور النموذج دالي الاتجاه function oriented model
تستطيع في هذه اللغات إنشاء مؤشر pointer على دالة بالتالي تستطيع تمرير دالة إلى دالة
وهذا يعني أن أمر الدوال بعد التنفيذ سهل في هذه اللغات حيث يتم في نهاية الدالة تنفيذ الدالة الممررة من الخارج
من الأمثلة على هذا النموذج لغة java script و لغة action script
-شكر خاص لصديقي محمد الخضري الذي أثرى معلوماتي عن هاتين اللغتين-
منظور النموذج كائني الاتجاه object oriented model
النموذج الكائني يتعامل مع كل شيء في إطار كائنات ولا يقبل بالدوال كمؤشر وعلى هذا فإن المفهوم الكائني يمنعك من تمرير دالة مثل أخوه الدالي
وعلى هذا توجب إيجاد حلول بديلة خصوصاً وأن مفهوم الدوال البعدية مهم لأطر العمل

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

public interface Checker{
	public boolean check (String word);
}

سيكون منظر دالة الكتابة

public void write(Checker checker ,KeyboardInterface keyboard){
	//bla bla bla
	//finish writeing
	checker.check(word);
	//do something with checker's result
}

وعلى المطور هنا أن يقوم ببناء الواجهة Checker وإنشاء كائن منها وتمريره إلى الدالة write ملاحظة يمكن تمرير المدقق من خلال صانع الكائنات constractor أو إذا كانت هناك نقطة بداية للحزمة ممكن عمل set له عن طريق دالة set
وهذه الطريقة مستخدمة بكثرة في jsf events
يمكنكم قراءة المقال التالي وفيه معلومات جيدة عن الموضوع
كيف تبني نظام أحداث خاص بحزمتك إطلالة على الأحداث في حزمة المحرك
بالطبع مع وجود فارق بين الأحداث والدوال البعدية حيث أن الأحداث تعنى بأمور تتكرر أما الدوال البعدية فهي تعنى بأمر يحدث مرة واحدة ومن منظور آخر يمكن اعتبار الأحداث قائمة أساساً على تكرار مناداة الدالة البعدية مرة بعد مرة

2- الطريقة الثانية هي توفير دوال protected في فئة ما بحيث يتم إعادة كتابتها من المطور
قد تكون لهذه الدوال سلوك افتراضي وقد تكون خالية غير مكتوب فيها شيء
وقد تكون هذه الدوال abstract أو concreate وبالأغلب تضعها على شكل abstract لتنبه المستخدم إلى وجوب بناء هذه الدوال
مثال

public class Activity{
	public void OnCreate(Bundle bundle){
		//do nothing or do default
	}
}

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

public class MyActivity extends Activity{
	public void OnCreate(Bundle bundle){
		super.onCreate(bundle);//لتقوم بتنفيذ السلوك الافتراضي قبل تنفيذ السلوك الذي تريد إضافته
		//do something here
	}
}

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

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

أخوكم شهيد الأقصى

Tags: , , , , , , , , ,

4 تعليقات to “الدوال البعدية callback function”

  1. يقول Zainab:

    السلام عليكم و رجمة الله وبركاته..
    بارك الله فيك أستاذي “شهيد الأقصى”..
    نصركم الله نصرا مؤزرا ، وبارك فيكم وفي جهادكم المبارك..وأقرّ أعيننا بنصركم وجهادكم.
    شهادةً أو نصرا.. و أجرا بإذن المولى..

  2. يقول admin:

    اللهم آمين اللهم آمين

  3. بارك الله فيك وفى مجهودك
    وفى انتظار جديدك اخى

  4. يقول admin:

    العفو أخي

Leave a Reply