في علوم الحاسوب تُوجد بعض الأساليب التي يستخدمها المبرمجون لجعل البرامج أسهل وأفضل، يوجد الكثير من الطرق لتحقيق هذا الهدف المنشود مثل الدالة البرمجية Function.
سنتحدث في هذا المقال عن الدوال، لماذا نستخدمها وكيف يتم استخدامها.
في البداية سنجيب على السؤال التالي: ما هي الدالة؟ هي جزء من كود البرنامج، يتم تعريفه عن طريق المبرمج لينفذ شيئاً ما بواسطتها، حيث تقوم الدالة بأخذ قيم وتسمية ( arguments) معطيات كمدخلات، ثم تقوم بعمل بعض التعديلات على هذه المدخلات لتقوم بإخراج قيم أخرى، وفي أكثر الأحيان تقوم الدالة بأخذ القيم ووضعها في متغيرات أخرى تسمى بالـ (parameters) حتى يتم إجراء العمليات عليها داخل الدالة وهذه المتغيرات لا تعمل خارج الدالة أي أنها متغيرات خاصة بالدالة فقط.
ما المفهوم البرمجي للدالة “function”؟ تقوم بتخرين جزء من الكود البرمجي الذي يقوم بوظيفة معينة داخل بلوك “block” برمجي مُعرف مسبقاً ولكن السؤال كيف نستخدمها بعد تعريفها؟
يتم استدعاء “call” للدالة عندما تحتاجها باستخدام سطر برمجي واحد بدلاً من كتابته عدة أسطر في كل مرة تحتاجها.
مبدأ إعادة الاستخدام:
في البرمجة تعني استخدام نفس الكود البرمجي في عدة دوال ولكن ليس بالنسخ ثم اللصق “copy and paste” من جزء إلى آخر في الكود وهكذا.. تُعرف بأنها الطريقة التي يُمكن من خلالها استخدام نفس الكود البرمجي ولكن بدون الحاجة الي كتابته كاملاً في كل مرة.
وكما وَضحت مُسبقاً تُستخدم أساليب معينة لهذا الغرض وهذه الأساليب تتبع الفلسفة البرمجية العامة “philosophy of Don’t Repeat Yourself (DRY)” تنص على ما يلي: “كل جزء من المعرفة يجب أن يكون واضحاً ومحل ثقة ومُتماثلاً” يساعد ذلك المطورين على الحفاظ على هيكل تطبيقاتهم من الفوضوية والإحباط عند تشغيل هذه التطبيقات. ومن الطرق للقيام بهذا الغرض:
- الدوال “Functions”
- المكتبات البرمجية “Libraries”
- التفرعات/الفوركينج “Forking”
أولاً: الدوال “Functions“:
لكي نقوم بتعريف دالة ما فإننا نقوم بكتابة الكلمة “function” متبوعة باسم الدالة والبارمترات اللازمة والتي سوف يتم إجراء العمليات عليها بين قوسين ومن ثم تقوم بكتابة الكود اللازم وسط القوسين المعقوفين “{ }”.
والصيغة العامة للدالة هي:
Function function_name (parameter)
{
function code
}
لاحظ أن الكود السابق يتكون من عدة أجزاء:
1 ـ “Function” إن أي دالة يجب أن تبدأ بهذه الكلمة وهي تشير إلى أن الكود اللاحق له عبارة عن الدالة التي نريد تعريفها.
2 ـ ” function_name” أو اسم الدالة التي سوف نقوم بتعريفها، ونستطيع أن نحدد أي اسم باستثنـاء الدوال المعرفة فعلاً، ولكن يفضل أن يكون هذا الاسم دالاً على معنى الدالة، حتى يسهل تذكرها عند استدعاءها فيما بعد.
3 ـ الجزء الخاص بعوامل الدالة والذي يحتوي على البارامتر أو المتغيرات.
4 ـ {} كود الدالة بين القوسين المعقوفين، وكل ما يكتب بعدها لن يتم تنفيذه مبـاشرة، بل سيتم ذلك عند استدعاء الدالة.
5 ـ “return” وذلك لإعلام الدالة بأن وظيفتها قد انتهت بالإضافة إلى ذكر اسم المتغير المذكور في تعريف الدالة سابقاً.
وعند برمجة الدالة نقوم بكتابه اسم الدالة بدلاً من “function_name” ثم نقوم بتعريف المتغيرات “parameters”، ثم نقوم بكتابة الكود الذي سوف يقوم بالمطلوب بين القوسين بدلاً من “function code”.
ملاحظات على الدوال:
1 ـ عند إنشاء دالة جديدة، يجب أن تكون الدالة غير موجودة مسبقاً، لأنها لو كانت موجودة فعلاً فليس هناك سبب يدعوا لتكرار الجهد، بل يمكنك استخدام الدوال الجاهزة في دليل، على سبيل المثال php.net.
2 ـ لا يمكن أن يبدأ اسم الدالة بعدد.
3 ـ عدم وضع فاصلة منقوطة بعد نهاية الدالة.
عند استدعاء الدالة يوم البرنامج بترك الجزء الموجود به حالياً ويذهب لمكان الدالة المُستدعاه لتنفيذ ما بداخلها من السطر الأول إلى السطر الأخير في هذه الدالة ثم بعد ذلك يعود مرة أخرى إلى المكان الأول الذي تركه لتنفيذ الدالة ثم يستكمل بقية أسطر الكود البرمجي.
لماذا نكتب الدوال؟
1- تسمح لنا بتصور برنامجنا بمثابة مجموعة من الخطوات الفرعية. كل خطوة فرعية يمكن أن تكون وظيفتها الخاصة.
2- أنها تسمح لنا بإعادة استخدام الأكواد البرمجية بدلاً من إعادة كتابة.
3- تسمح لنا بالحفاظ على فهم أسماء المتغيرات بصورة واضحة.
4- تسمح لنا باختبار أجزاء صغيرة من برنامجنا في عزلة عن بقية، بشكل خاص في اللغات مثل ماتلاب,C، جافا وغيرها.
ما هي خطوات انشاء الدالة:
1- فهم الغرض من وظيفة ما.
2- تحديد البيانات التي تأخذها الدالة من المستخدم في شكل معاملات.
3- تحديد ما هي البيانات المتغيرات المطلوبة داخل الدالة لتحقيق هدفها.
4- تحديد مجموعة الخطوات التي سيستخدمها البرنامج لتحقيق هذا الهدف. (الخوارزميات)
مما تتكون الدالة ؟وما هي أجزاء الدالة؟
يُطلق على الدالة الصندوق الأسود “black boxes” لأننا لا نحتاج أن نعرف كيف تعمل الدوال فقط علينا أن نعرف ما المفترض أن يدخل للدالة وما المفترض أن يخرج منها.
عند تعريف الدالة في برنامج معين يجب اتباع الخطوات التالية:
1- اسم الدلة يصف الغرض منها.
2- المدخلات تُسمى “مُعاملات” تصف البيانات اللازمة للدالة لكي تعمل بصورة صحيحة وإعطاء كل جزء من البايانات اسم رمزي يعبر عما بداخله.
3- الحسابات أو العمليات على كل دالة.
4- قيم الخرج التي تمت حساباتها داخل الدالة وتظهر للخرج بواسطة متغيرات الخرج.
مساحة العمل للدوال “function workspace“ :
لكل دالة مساحتها المُحددة وهذا يعني أن كل مُتغير داخل الدالة يُستخدم فقط عند تنفيذ هذه الدالة.
ولكن وجود “مساحة عمل” منفصلة لكل دالة أمر بالغ الأهمية لهندسة البرمجيات المناسبة. إذا كانت كل دالة تشترك في كل متغير في برنامج بأكمله، سيكون من السهل تغيير قيم المتغيرات التي يجب عدم قصدها. وعلاوة على ذلك، سيكون من الصعب أن نتذكر ما هي “الأسماء” التي اُسِتخدمت في أماكن أخرى، وإعطاء أسماء جديدة لتمثيل أفكار مماثلة سيكون تحدياً .
الطريقة الوحيدة للحصول على المعلومات من الدالة التي تم استدعاؤها عن طريق إعادة هذه المعلومات إلى دالة الإخراج، بالإضافة إلى ذلك الدالة يمكنها فقط “رؤية” المعلومات التي “تم تمريرها” إليها عبر المُعاملات، فعندما ننشئ دالة ما يجب أن تمثل إجراءً عامًا يمكن تطبيقه في ظروف مُتعددة، على سبيل المثال إذا كنا نريد أن نجد متوسط درجات الصف لا يهم إذا كان ذلك لاختبار أو امتحان قصير “quiz” أو الواجبات “assignment” فإذاً يمكن للقائمة أن تدل على أنواع أخرى من الدرجات، كيف يمكننا أن نعرف ما هي قائمة الدرجات التي سوف يتم استدعاؤها؟
الجواب: نحن لا نهتم، أنت مبرمج الدالة، وتُوفر اسمك الخاص للبيانات، عند كتابة الدالة يجب على المُبرمج أن يعطي اسماً يحتوي على ما بداخله ومثال على ذلك سننشئ الدالة ” pseudocode “:
داخل الدالة “average_grade” يوجد معامل وهو “list_of_grades” وسيُستخدم في تخزين أي متغير يعطيه المستخدم، ويتم كتابة الغرض من الدالة مكان النقط في الكود أعلى وينتهي تعريف الدالة بجملة “end function” ولاستدعاء هذه الدالة يُكتب هكذا :
في هذا المثال تُخزن الدرجات في متغير”midterm_grades” كخرج للمستخدم بداخل الدالة تُخزن الدرجات في متغير “list_of_grades” كدخل من المستخدم لذلك عند تنفيذ البرنامج يكون كلا المتغيرين السابقين يدل علي الشيء ذاته ولكن في أوقات مختلفة يُطلق على المعامل. “list_of_grades” هو معامل رسمي “formal paramater” وهذا يعني أنه يقوم بحجز المكان لأي دخل ممكن من الدرجات.
أما المعامل “midterm_grades” فيُطلق عليه المعامل الفعلي “actual paramater” وهذا يعني المعامل الذي يُستخدم فعلياً لاستدعاء هذه الدالة مثل [90, 100, 70] .
2- المكتبات البرمجية “Libraries” :
ربما تكون سمعت عن مكتبات الارتباط الحيوي”Dynamic Link Libraries”؟ نعم هي ملفات “dll” المستخدمة في الحاسوب. هذه المكتبات هي عبارة عن مجموعة من البرامج التي تم تجميعها، والتي غالباً ما تستخدم من قبل البرامج الكبيرة والمشاريع على مستوى المؤسسات، لدعم التنفيذ لأنها يمكن تنفيذها عند الطلب.
إذا كنت قد استخدمت في أي وقت مضى حزم نوجيت “”NuGet، حاولت باستخدام ملفات dll أو إضافة أي تجميع إلى مجلد bin الخاص بك في تطبيق .NET أو تطبيق” ASP.NET” فإن احتمال أن تكون قد استخدمت بالفعل المكتبات من قبل وهي مألوفة بالنسبة لك، معظم الحزم التي يتم توزيعها لاستخدامها من قبل عملاء آخرين، هي مكتبات يمكن ربطها بالتنفيذ الخاص بك لأغراض يتم تعريفها.
يسمح معظم الإطار ” “frameworkبدعم إنشاء مكتبات خارجية لتوزيعها باستخدام أساليب مختلفة، يمكنك أيضاً ملاحظة أن هذا النظام (the namespace of the .NET Framework) موجود في مكتبة “System.dl”.
3- الفوركينج (التفرعات) “Forking“:
الفوكينج هو عملية استخدام كود برمجي لشخص آخر وإجراء تغييرات عليه لتلائم احتياجاتك الخاصة وتوزيعها واستخدامها ومشاركتها وما إلى ذلك. يُمكنك أيضاً كتابة بعض التفاصيل أكثر لذلك والقيام ببعض الإصلاحات، إضافة بعض الباتشات” patches” وقد استخدمت هذه المصطلحات والطريقة على نطاق واسع من قبل مختلف الشركات، لمشاريع مفتوحة المصدر، وجعل بعض التغييرات عليها ومن ثم توزيعها مع التسمية الخاصة بهم وباستخدام علامتهم التجارية.
المصادر:
- إعداد: أحمد سمير.
- مراجعة: أحمد سعد.
- تدقيق لغوي: داليا المتني.