ماذا يعني التابع في البرمجة؟
التابع عمومًا هو ما يتبع شيئًا آخر، وهو مفهوم مستخدم في الرياضيات للربط بين مدخلات ومخرجات العلاقة الرياضية. أما في البرمجة فالمفهوم يختلف قليلًا، فالتوابع Functions بالبرمجة هي مجموعة من الأسطر البرمجية والتي تُحفظ أو تكتب خارج الجزء الرئيسي من البرنامج والذي يسمى غالبًا التابع Main.
يُقال عادةً أن التوابع في البرمجة هي أفعال الكائنات، وهذا قائم على تشبيه الكائنات البرمجية بالكائنات الحية، إذ لها صفت تدعى خصائص Properties وأفعال تقوم بها تدعى طرق Methods وظروف تمر عليها تدعى أحداث Events. وفي بعض لغات البرمجة الطرق Methods هي التوابع Functions نفسها، وفي لغات برمجة أخرى الطرق Methods هي توابع Functions وإجراءات Procedures.
التوابع يمكن أن تأخذ وسطاء Parameters ويمكن ألا تأخذ، والفكرة من ذلك هو التأثير على أسطر التابع البرمجية بمعاملات معينة أو تنفيذ التابع دون التأثير عليه!
وسنرى في الفقرات التالية الغاية من التابع سواءً أمررنا معه وسطاء أو لم نمرر.
تنفيذ الكود دون استخدام توابع
البرامج هي مجموعة من الأسطر البرمجية التي تُنفذ سطرًا سطرًا، وهي أشبه بقائمة مهام طويلة يقوم الكمبيوتر بتنفيذها مهمة مهمة.
مثال1: لنتخيل القصة التالية:
00- *عندي امتحان لستة مواد*
01- سأبدأ بالمادة الأولى
02- سأتحقق من عدد الدروس المتبقية لدي
03- سأراجع ملخصات الدروس السابقة
04- سأنشئ ملخصات للدروس المتبقية التي سأنهيها
05- سأراجع مادرست
06- ثم سأختبر نفسي
07- إذا (أموري تمام)
08- = انتقل للمادة التي تليها
09- وإلا
10- = أعيد المراجعة
11- سأبدأ بالمادة الثانية
12- سأتحقق من عدد الدروس المتبقية لدي
13- سأراجع ملخصات الدروس السابقة
14- سأنشئ ملخصات للدروس المتبقية التي سأنهيها
15- سأراجع مادرست
16- ثم سأختبر نفسي
17- إذا (أموري تمام)
18- = انتقل للمادة التي تليها
19- وإلا
20- = أعيد المراجعة
21- سأبدأ بالمادة الثالثة
22- سأتحقق من عدد الدروس المتبقية لدي
23- سأراجع ملخصات الدروس السابقة
24- سأنشئ ملخصات للدروس المتبقية التي سأنهيها
25- سأراجع مادرست
26- ثم سأختبر نفسي
27- إذا (أموري تمام)
28- = انتقل للمادة التي تليها
29- وإلا
30- = أعيد المراجعة
…
51- سأبدأ بالمادة الثانية
52- سأتحقق من عدد الدروس المتبقية لدي
53- سأراجع ملخصات الدروس السابقة
54- سأنشئ ملخصات للدروس المتبقية التي سأنهيها
55- سأراجع مادرست
56- ثم سأختبر نفسي
57- إذا (أموري تمام)
58- = انتقل للمادة التي تليها
59- وإلا
60- = أعيد المراجعة
61- نهاية البرنامج
هل لاحظت الروتينية والتكرار؟؟
لاحظ ما سيحدث لو استخدمنا التوابع:
التابع الرئيسي في البرنامج Main:
00- *عندي امتحان لستة مواد*
01- استدعاء تابع الدراسة (المادة الأولى)
02- استدعاء تابع الدراسة (المادة الثانية)
03- استدعاء تابع الدراسة (المادة الثالثة)
04- استدعاء تابع الدراسة (المادة الرابعة)
05- استدعاء تابع الدراسة (المادة الخامسة)
06- استدعاء تابع الدراسة (المادة السادسة)
07- نهاية البرنامج
تابع الدراسة (يأخذ وسيط: رقم المادة):
00- *هذا التابع يتم استدعاؤه من التابع الرئيسي في البرنامج*
01- سأبدأ بالمادة رقم المادة
02- سأتحقق من عدد الدروس المتبقية لدي
03- سأراجع ملخصات الدروس السابقة
04- سأنشئ ملخصات للدروس المتبقية التي سأنهيها
05- سأراجع مادرست
06- ثم سأختبر نفسي
07- إذا (أموري تمام)
08- = أخرج من التابع
09- وإلا
10- = أعيد المراجعة
هل لاحظت الفرق بين البرنامجين؟ عشرات الأكواد تم اختصارها، ماذا لو كان برنامجك فيه آلاف الأكواد؟؟ هل ستستخدم التوابع؟ أظن ذلك.
ماهو الفرق بين تنفيذ التابع مع تمرير وسطاء وبين تنفيذه دون تمرير وسطاء؟؟
التابع السابق تم تنفيذه مع تمرير وسطاء، ولوّنا الوسطاء بالأحمر لتمييزه عن الكلمات العادية في البرنامج. فلو لم نحتج تحديد ما سيقوم به البرنامج بهذا التابع لما احتجنا تمرير وسطاء. هذا وقد نحتاج لتمرير أكثر من وسيط بنفس الوقت!
هناك أكثر من نوع لتمرير الوسطاء، النوع الأول والأكثر شيوعًا هو بتمرير قيمة الوسيط Passing by Value والثاني تمرير مرجع أو عنوان الوسيط Passing by Reference.
الفرق بين تمرير الوسيط بالقيمة PassingByValue وتمريره بالعنوان PassingByReference
تمرير الوسيط بالقيمة هو أسهل أنواع تمرير الوسطاء، وهو أسهل على المتعلمين، وفيه يتم أخذ قيمة الوسيط وإرسالها للتابع لينفذ أكوادها وفق قيمة هذا الوسيط (تمامًا كما في المثال1). بينما تمرير الوسيط بالعنوان أو المرجع فإنه أصعب، مع أن مبدأه بسيط، وسمي تمريرًا بالعنوان أو المرجع لأنك ترسل موقع أو عنوان هذا الوسيط بالذاكرة للتابع.
بناءً على ما سبق فإن الفارق بين النوعين – تمرير القيمة أو تمرير المرجع – هو أن الأول يتم فيه إرسال قيمة الوسيط فقط بينما الثاني فإنك ترسل الوسيط بالكامل!
باختصار عند إرسال الوسيط كقيمة فإن التابع سيجري عملياته وحساباته على أسطره البرمجية دون التأثير على الوسيط، أما عند إرسال عنوان الوسيط فإن التابع سيجري عملياته وحساباته على أسطره البرمجة وعلى الوسيط! إذ إنك أرسلت عنوان الوسيط للتابع، هذا يعني أنك أعطيت الوسيط بالكامل للتابع ولديه صلاحيات التأثير عليه!
مثال2: لفهم الفرق بين نوعي تمرير الوسطاء، تعال معي لنتخيل القصة التالية:
أرسلت أخيك الصغير لبائع الخضروات، وأعطيته ورقة مكتوب عليه ما تحتاجه، بائع الخضروات سيأخذ الورقة (قيمة الوسيط) ويجري عملياته وحساباته على ما يملكه في دكانه (أسطره البرمجية).. هذا باختصار ما يحدث عند تمرير الوسيط كقيمة!
أرسلت أخيك لبيت أختك، أختك يمكنها تغيير ملابس أخيك مثلًا (التعديل على الوسيط).. هذا هو تمرير الوسيط كعنوان!
لاحظ ان البائع لا يمكنه التأثير على أخيك (التابع لا يمكنه التأثير على الوسيط، هو فقط يأخذ قيمته). أما أختك يمكنها التأثير عليه (التابع عنده صلاحيات التعديل على الوسيط في هذه الحالة).
المراجع: