الدوالُّ البرمجيةُ ( Functions)
والروتينُ الفرعيُّ (Subroutines)
تعلَّمْتُ في صفوفٍ سابقةٍ كيفَ أستخدِمُ اللَّبِناتِ البرمجيةَ المختلفةَ، وتعرَّفْتُ أنَّ لكلٍّ منْها وظيفةً مُعيَّنةً حُدِّدَتْ مُقدَّمًا Built-in فمثلًًا، لَبِنةُ الحركةِ (تحرَّكْ 5 خُطواتٍ ) يرادُ بها تحريكُ الكائنِ المُرتبِطِ بها مقدارَ 5 خطواتٍ. ويُطلَقُ على هذا النوعِ منَ اللَّبِناتِ اسمُ الدالَّةِ البرمجيةِ Function فما الذي يعنيهِ مصطلحُ الدالَّةِ؟ وهلْ توجدُ أنواعٌ للدوالِّ البرمجيةِ؟
مفهوم الدالة البرمجية في سكراتشالدالة البرمجية هي عبارة عن مجموعة من اللبنات البرمجية التي تُجمّع معًا لأداء مهمة محددة. تُستخدم الدوال لتنظيم الكود وجعله أكثر قابلية للقراءة وإعادة الاستخدام. فوائد الدالة البرمجية :
|
الدوالُّ البرمجيةُ ( Functions )
تُعرَّفُ الدالَّةُ البرمجيةُ بأنَّها مجموعةٌ منَ الأوامرِ البرمجيةِ التي تُجمَعُ معًا ضمنَ اسمٍ مُعيَّنٍ، ويُمكِنُ استدعاؤُها وتنفيذُها في أيٍّ منْ أجزاءِ البرنامجِ منْ دونِ حاجةٍ إلى كتابتِها مِرارًا وتكرارًا. يستفادُ منَ الدوالِّ البرمجيةِ في تنفيذِ مهامَّ مُحدَّدةٍ، أوْ حَلِّ مشكلاتٍ مُعيَّنةٍ. ولكلٍّ منْها خصائصُ عديدةٌ ميِّزُها منْ غيرِها، أنظرُ الشكلَ ( 4- 1) فهيَ تمتازُ بقابليتِها لإعادةِ الاستخدامِ، وتقبُّلِها المدخلاتِ، وإرجاعِها النتائجَ (المخرجاتُ)
وفي ما يأتي بيانٌ لهذهِ الخصائصِ:
- القابليةُ لإعادةِ الاستخدامِ: يُمكِنُ استدعاءُ الدالَّةِ البرمجيةِ مَرّاتٍ عديدةً في البرنامجِ؛ ما يُقلِّلُ منْ تكرارِ المقطعِ البرمجيِّ.
- تقبُّلُ المدخلاتِ: يُمكِنُ للدالَّةِ البرمجيةِ أنْ تقبلَ المدخلاتِ؛ لتخصيصِ وظيفتِها بناءً على القِيَمِ المعطاةِ.
- إرجاعُ النتائجِ: يُمكِنُ للدالَّةِ البرمجيةِ أنْ تُرجِعَ النتائجَ بعدَ تنفيذِها؛ ما يسمحُ باستخدامِ هذهِ النتائجِ في أماكنَ أُخرى منَ البرنامجِ.
مبدأُ عملِ الدالَّةِ البرمجيةِ
تعملُ الدالَّةُ البرمجيةُ على استقبالِ المدخلاتِ، ثمَّ إخضاعِها للأوامرِ البرمجيةِ؛ بُغْيَةَ إنتاجِ مخرجاتٍ(Return Value ) تتألَّفُ منْ قيمةٍ واحدةٍ يُمكِنُ الاستفادةُ منْها في أماكنَ أُخرى منَ البرنامجِ، أنظرُ الشكلَ( 4- 2).
تُعرَّفُ مدخلاتُ الدالَّةِ البرمجيةِ بأنَّها قيمةٌ أوْ معلومةٌ تُمرَّرُ إلى الدالَّةِ البرمجيةِ عندَ استدعائِها. تتمثَّلُ وظيفةُ المدخلاتِ في تغييرِ سلوكِ الدالَّةِ البرمجيةِ وتخصيصِها؛ ما يُمكِّنُ الدالَّةَ البرمجيةَ منَ التعاملِ معَ بياناتٍ مختلفةٍ في كلِّ مَرَّةٍ تُستدعى فيها.
فمثلًًا، يُمكِنُ استخدامُ لَبِنةِ الحركةِ في برمجيةِ سكراتش Scratch بطرائقَ تختلفُ تبعًا لاختلافِ الحاجةِ؛ فإذا تغيَّرَ
عددُ الخطواتِ التي يتحرَّكُها الكائنُ ليصبحَ( 10 ) خطواتٍ أوْ ( 50) خطوةً، أمكنَ إدخالُ قيمةٍ جديدةٍ للدالَّةِ في كلِّ مَرَّةٍ يتغيَّرُ فيها العددُ، وتُسمّى القيمةُ في هذهِ الحالةِ مدخلَ الدالَّةِ.
ولكنْ، ما النتائجُ ( أوِ المخرجاتُ) المُتوقَّعةُ بعدَ تنفيذِ هذهِ الدالَّةِ؟
يُمكِنُ تحديدُ المخرجاتِ المُتوقَّعةِ عندَ تنفيذِ كتلةٍ مُخصَّصةٍ بناءً على الأوامرِ التي تحويها. فمثاً، إذا كانَتِ الكتلةُ تعيدُ قيمةً واحدةً، فإنَّ هذهِ القيمةَ تكونُ منْ نوعِ البياناتِ المُحدَّدةِ؛ ففي الشكلِ السابقِ، أعادَتِ الكتلةُ قيمةً رقميةً، هيَ ( 10) في حينِ أعادَتْ بعضُ الكتلِ قيمةً نصيةً، مثلَ كتلةِ ( قلْ مرحبًا) وفي مُقابِلِ ذلكَ، توجدُ كتلٌ أُخرى لا تعيدُ القِيَمَ مباشرةً، وإنَّما تعملُ على تغييرِ الحالةِ الخاصةِ بمُتغيِّرٍ مُعيَّنٍ
أنواعُ الدوالِّ البرمجيةِ
تُصنَّفُ الدوالُّ البرمجيةُ إلى نوعينِ، هما: الدوالُّ البرمجيةُ
الجاهزةُ( Built-in) ودوالُّ المُستخدِمِ ( User-defined )
أنظرُ الشكلَ ( 4-3 )
أوَّلًا: الدوالُّ البرمجيةُ الجاهزة(Built in Functions)
تُعرَّفُ الدوالُّ البرمجيةُ بأنَّها لَبِناتُ الأوامرِ التي تُوفِّرُها بيئةُ
البرمجةِ سكراتش Scratch بصورةٍ افتراضيةٍ لتنفيذِ أوامرَ
مُحدَّدةٍ مُقدَّمًا منْ طرفِ البرمجيةِ نفسِها ( Built-in )
تشتملُ هذهِ اللَّبِناتُ على مجموعةٍ واسعةٍ منَ الوظائفِ
الأساسيةِ التي يُمكِنُ استخدامُها في إنشاءِ برامجَ ومشروعاتٍ
تفاعليةٍ. ومنْ أمثلتِها: لَبِناتُ الاستشعارِ، ولَبِناتُ الهيئةِ. أنظرُ
الشكلَ (4- 4)
إيجاد وظائف جديدة أو خاصة في سكراتشفي سكراتش، تُعرف الوظائف الجديدة أو الخاصة باسم "كتل مخصصة" أو "My Blocks". يمكنك إيجاد أو إنشاء وظائف جديدة في سكراتش من خلال الطرق التالية: 1. إنشاء كتل مخصصة: من خلالها يمكن تعريف وظائف خاصة لتلائم احتياجات المشروع.
|
ثانيًا: دوالُّ المُستخدِمِ أوِ الروتينُ الفرعيُّ ( Subroutine)
تتيحُ برمجيةُ سكراتش Scratch إنشاءَ لَبِناتٍ خاصةٍ بالمُستخدِمِ عنْ طريقِ نوعٍ جديدٍ منَ اللَّبِناتِ يُسمَى لَبِناتي My Blocks ويتضمَّنُ تحديدَ اسمٍ خاصٍّ بهذهِ اللَّبناتِ، وتعيينَ الوظيفةِ التي ستؤدّيها. ويُعرَفُ هذا النوعُ بدالَّةِ المُستخدِمِ User- Defined ويُطلَقُ عليْهِ أيضًا اسمُ الروتيناتِ الفرعيةِ Subroutines
يتطلَّبُ إنشاءُ روتينٍ فرعيٍّ باستخدامِ لَبِناتي My Blocks توافرَ عنصرينِ اثنينِ، هما:
- لَبِناتُ التعريفِ Definition Block : لَبِناتٌ يضافُ إليْها جميعُ اللَّبِناتِ التي يرادُ تنفيذُها عندَ
استدعاءِ الدالَّةِ أوْ تنفيذِها.
- لَبِناتُ الاسمِ Name Block : لَبِناتٌ تُستخدَمُ في استدعاءِ لَبِنةِ التعريفِ، ثمَّ تنفيذِها في البرنامجِ.
في ما يأتي الخطواتُ اللازمةُ لإنشاءِ روتينٍ فرعيٍّ باستخدامِ لَبِناتي My Blocks في برمجيةِ سكراتش Scratch :
1 - إنشاءُ مشروعٍ جديدٍ، أوْ فتحُ مشروعٍ موجودٍ في برمجيةِ
سكراتش Scratch
2 - الانتقالُ إلى بوّابةِ اللَّبِناتُ البرمجيةُ Blocks
3 - اختيارُ لَبِناتي My Blocks
4 - الضغطُ على خيارِ إنشاءُ لَبِنةٍ Make a Block فتظهرُ نافذةٌ مُنبثِقةٌ تحوي عددًا منَ الخياراتِ، هيَ:
أ- تسميةُ الكتلةِ المُخصَّصِة، وذلكَ بإدخالِ اسمِ هذهِ الكتلةِ في النافذةِ المُنبثِقةِ.
ب- إضافةُ حقلٍ رقمٌ أوْ نصٌّ .
ج- إضافةُ حقلٍ منطقيٌّ
د- إضافةُ نصٍّ.
5 - إكمالُ تعريفِ اللَّبِنةِ الجديدةِ، ثمَّ الضغطُ على زِرِّ موافقٌ OK
6 - بعدَ إنشاءِ اللَّبِنةِ، ستظهرُ لَبِنةٌ جديدةٌ في قائمةِ اللَّبِناتِ، يُمكِنُ استخدامُها في أيِّ وقتٍ، وإدخالُ
الأوامرِ فيها.
في سكراتش، يُمكن استدعاء الروتين الفرعي ( "My Block") بعدد محدود أو غير محدود من المرات، اعتمادًا على كيفية استخدامه داخل الكود البرمجي.
إذا أردْنا إنشاءَ برنامجٍ مُخصَّصٍ لرسمِ مُثلَّثٍ واحدٍ، فإنَّهُ يُمكِنُنا كتابةُ الأوامرِ البرمجيةِ اللازمةِ بصورةٍ سهلةٍ وقصيرةٍ كما في الشكلِ( 4- 5)
ولكنْ، إذا أردْنا رسمَ مُثلَّثٍ 3 مَرّاتٍ، فيجبُ عليْنا تكرارُ لَبِناتِ البرنامجِ 3 مَرّاتٍ؛ ما يجعلُهُ طويلًًا ومُعقَّدًا. ولحَلِّ هذهِ المشكلةِ، يُمكِنُنا استخدامُ الروتينِ الفرعيِّ، أنظرُ الشكلَ (6-4 )
إنَّ تكرارَ اللَّبِناتِ باستخدامِ الروتينِ الفرعيِّ الظاهرِ في الشكلِ السابقِ يؤدّي إلى تكرارِ رسمِ مُثلَّثٍ
بالأبعادِ نفسِها 3 مَرّاتٍ. ولكنْ، إذا أردْنا رسمَ المُثلَّثاتِ الثلاثةِ بأبعاد مختلفةٍ، فهلَ يجبُ عليْنا
كتابةُ مجموعةٍ منَ الروتيناتِ المختلفةِ؟
يُمكِنُ حَلُّ هذهِ المشكلةِ وأمثالِها بما وفَّرَتْهُ برمجيةُ سكراتش Scratch منْ إمكانيةِ إنشاءِ روتينٍ
فرعيٍّ وتعديلِ المعاملاتِ أوِ المدخلاتِ المُرتبِطةِ بهِ.
الروتينُ الفرعيُّ والمعاملاتُ
يُمكِنُ تضمينُ الروتينِ الفرعيِّ - بعدَ إنشائِهِ- لَبِنةَ معاملاتٍ أوْ لَبِنةَ مدخلاتٍ )نصٌّ أوْ رقمُ مدخلٍ ما يتيحُ استخدامَ الروتينِ نفسِهِ في تكرارِ تنفيذِ اللَّبِناتِ البرمجيةِ بمدخلاتٍ مختلفةٍ دائمًا. فمثلًًا، يُمكِنُ رسمُ مُثلَّثاتٍ مختلفةِ الحجومِ كما في الشكلِ ( 4- 7) عنْ طريقِ استدعاءِ الروتينِ (تغييرُ حجمِ المُثلَّثِ) ثمَّ تحديدِ قيمةِ المدخلِ لحجمِ المُثلَّثِ الأوَّلِ المرادِ رسمُهُ، وهيَ في هذهِ الحالةِ ( 95 ) كذلكَ يُمكِنُ رسمُ مُثلَّثاتٍ أُخرى مُتعدِّدةِ الحجومِ عنْ طريقِ استدعاءِ الروتينِ منْ جديدٍ، واستخدامِ مدخلاتٍ جديدةٍ كما في الشكلِ( 4- 7) عندئذٍ سيعملُ الروتينُ على رسمِ مُثلَّثينِ جديدينِ للمدخلاتِ، بحيثُ يحملُ أحدُهما القيمةَ ( 60 ) ويحملُ الآخرُ القيمةَ ( 40 )
تُراعي برمجيةُ سكراتش Scratch عناصرَ المواطنةِ الرقميةِ بتوفيرِها أكثرَ منْ 70 لغةً؛ ما يضمنُ الوصولَ إلى مجتمعٍ عالميٍّ منَ المُستخدِمينَ. ولا شكَّ في أنَّ هذا التعدُّدَ اللغويَّ يتيحُ للأطفالِ والشبابِ - منْ جميعِ الخلفياتِ الثقافيةِ واللغويةِ- المشاركةَ والتعلُّمَ باللغةِ الأُمِّ.
كذلكَ يستطيعُ المُستخدِمونَ تطويرَ مهاراتِهِمُ البرمجيةِ، والتفاعلَ معَ الآخرينِ على نحوٍ أكثرَ فاعليةً؛ ما يُعزِّزُ لديْهِمُ الشعورَ بالانتماءِ إلى مجتمعٍ عالميٍّ مشتركٍ، يتعاونُ فيهِ الجميعُ على التعلُّمِ والإبداعِ.