مفهوم الدوال
دالة تعني Function أو Method في اللغة الإنجليزية. و تسمى ميثود أيضاً في العربية.
ما هي فكرة الدوال؟
فكرة الدوال أنك إذا أردت أن تنفذ نفس الكود عدة مرات في البرنامج. تكتب هذا الكود مرة واحدة فقط و تنادي له فقط كلما أردت تنفيذه.
ماذا تعني كلمة دالة؟
الدالة في البرمجة عبارة عن كود جاهز يتنفذ فقط عندما تقوم بإستدعائه.
عندما تكتب إسم الدالة فهذا يعني أتك تطلب من البرنامج تنفيذ هذه الدالة.
ما هي فائدة الدوال في البرامج؟
للدوال فائدة مهمة جداً, لأنك في البرامج الفعلية مثلاً قد تستخدم نفس الكود ٢٠ مرة, فتخيل مثلاً لو أنك كلما ضغط على زر في برنامجك سيقوم البرنامج بتنفيذ نفس الكود الذي يتألف من ١٠ أسطر و برنامجك يحتوي على ٢٠ زر, فبدل أن تكتب نفس الـ ١٠ أسطر لكل زر من الـ ٢٠ زر, أكتبهم مرة واحدة بداخل دالة و إستدعي هذه الدالة مرة واحدة فقط لكل زر, هكذا تكون قد جعلت برنامجك أسرع و حجمه أصغر بكثير و هذا مهم جداً جداً في البرمجة.
أنواع الدوال
إلى كم نوع تقسم الدوال؟
يمكننا تقسيم الدوال لنوعين أساسيين:
دوال نوعها
void
أي تنفذ كود معين فقط و لا ترجع قيمة, أي لا تفعلreturn
.دوال لها نوع معين مثل (
int
أوdouble
أوString
.. ) تنفذ كود معين و ترجع قيمة , أي تفعلreturn
.
تعريف دالة نوعها void
في المثال التالي قمنا بتعريف دالة نوعها void
و إسمها DisplayMyInfo()
.
إنتبه: عند تعريف دالة نوعها void
لا نضع الكلمة return
.
تعريف دالة لها نوع محدد
في المثال التالي قمنا بتعريف دالة نوعها int
و إسمها getNumber()
.
إنتبه: عند تعريف دالة لها نوع محدد, يجب أن تفعل return
لقيمة من نفس نوعها.
هنا بما أن نوع الدالة هو int
, فعلنا return
لقيمة نوعها int
أيضاً و التي هي 50.
إنتبه
عند تعريف أي دالة نوعها ليس void
على الكمبيوتر, سيظهر لك أن هناك خطأ في الكود مباشرةً أثناء تعريفها.
فعلياً هذا ليس خطأ لكنه سيظل يظهر أن هناك خطأ في الكود إلى تفعل return
لأي قيمة في الدالة.
طريقة إختيار نوع الدالة التي تنوي تعريفها
قبل أن تقوم بكتابة أي دالة عليك أن تسأل نفسك السؤال التالي حتى تعرف ماذا يجب أن يكون نوعها.
السؤال هو: " لما أنا بحاجة إلى هذه الدالة؟ ".
هناك ثلاث إجابات محتلمة لهذا السؤال:
تريد عرض شيء للمستخدم, هنا أنت بحاجة لأن يكون نوع الدالة
void
.تريد تغيير قيمة لمتغير, هنا أنت بحاجة لأن يكون نوع الدالة
void
.تريد إرجاع قيمة لها نوع محدد, هنا أنت بحاجة لأن يكون نوع الدالة هو النوع الذي تريد إرجاعه.
لا تقلق إذا لم تفهم كل شيء الآن لأنك ستفهم كل شيء بتفصيل لاحقاً من خلال الأمثلة.
طريقة تعريف دالة في الخوارزميات و في لغة جافا
خطوات تعريف دالة جديدة
وضع
public static
من أجل لغة جافا فقط.تحديد نوع الدالة.
إعطاء إسم للدالة.
وضع قوسين
( )
من أجل الباراميترات التي يمكن وضعها للدالة (ستفهم المقصود في الدروس التالي).كتابة الأوامر التي ستتنفذ عند إستدعاء الدالة بين
{ }
.
مكان تعريف دالة جديدة
عندما تريد أن تعرّف أي دالة, قم بتعريفها خارج حدود الدالة main()
و ليس بداخلها, و عندما تحتاجها قم باستدعائها في الدالة main()
.
إذاً خارج حدود الدالة main()
نقوم بتعريف أي دالة نريد, و عندما نريد تنفيذ أي دالة نقوم فقط باستدعائها في الدالة main()
لكي يتم تنفيذها.
طريقة إستدعاء دالة معرّفة سابقاً
إستدعاء دالة تعني مناداة الدالة بإسمها حتى يتم تنفيذها.
لإستدعاء أي دالة قمت بتعريفها في الدالة main()
, أكتب إسمها فقط و عندها يفهم الكمبيوتر أنك تريد تنفيذ الأوامر الموضوعة في هذه الدالة.
لا تقلق ستفهم كل شيء من خلال الأمثلة.
نقاط مهمة حول الدوال
عند تشغيل أي برنامج, فإن الكمبيوتر يبحث عن الدالة
main()
, و عندما يجدها يبدأ بتنفيذ الأوامر الموجودة فيها بالترتيب, أي لا ينتقل من أمر إلى آخر إلا إذا أنهى تنفيذ الأمر السابق.لن يتم تنفيذ أي دالة أخرى غير الدالة
main()
ما لم تقم أنت باستدعائها بنفسك.يمكنك تعريف العدد الذي تريده من الدوال في برنامجك.
مصطلحات تقنية
المصطلح بالعربية | المصطلح بالإنجليزية | معناها في البرمجة |
---|---|---|
إستدعاء | call | تعني كتابة إسم الدالة التي نريد أن يتم تنفيذ الأوامر الموضوعة فيها. |
قفز | jump | هي مرحلة إنتقال سهم تنفيذ الأوامر إلى الدالة التي سيتم تنفيذها. |
إرجاع | return |
تعني إرجاع قيمة من نفس نوع الدالة. |
لا تقلق إذا لم تفهم معنى هذه المصطلحات الآن لأنها ستمر معك في الأمثلة.
أمثلة شاملة و بسيطة تعلمك كيف تعرف دالة ثم تستدعيها
ملاحظة
الهدف من هذه الأمثلة هو معرفة كيف تعمل الدوال و تسليط الضوء على الأخطاء التي يقع فيها معظم المبتدئين.
لذلك وضعنا الكود بلغة جافا فقط لأننا نريدك أن تفهم آلية العمل و تجرب الكود على الكمبيوتر كما هو لتفهمه أكثر.
في الدرس التالي ستتعلم كيف تعرف دوال جديدة كخوارزمية ثم تحولها إلى كود جافا كما كنا نفعل في الدروس السابقة.
المثال الأول
المثال التالي يعلمك طريقة بناء دالة مهمتها فقط عرض شيء للمستخدم.
الآن سنكتب دالة بسيطة إسمها DisplayMyInfo()
تطبع لنا فقط بعض المعلومات عندما نقوم باستدعائها.
كود الجافا
public class Methods { public static void DisplayMyInfo() { System.out.print("My name is Mhamad Harmush \n"); System.out.print("I am from Lebanon \n"); System.out.print("I made harmash.com when I was 20 years old \n"); } public static void main (String[] args) { DisplayMyInfo(); } }
شرح الكود
public static void DisplayMyInfo() { System.out.print("My name is Mhamad Harmush \n"); System.out.print("I am from Lebanon \n"); System.out.print("I made harmash.com when I was 20 years old \n"); }
هنا قمنا بتعريف دالة إسمها DisplayMyInfo()
تحتوي على 3 أوامر طباعة.
public static void main (String[] args) { DisplayMyInfo(); }
هنا قمنا بإستدعاء الدالة DisplayMyInfo()
حتى يتم تنفيذ جميع أوامر الطباعة الموضوعة بداخلها.
المثال الثاني
إنتبه
تعمدنا وضع هذا المثال لسبب واحد فقط و هو أن أغلب المبتدئين في الخوارزميات يرتبكون من فكرة الدالة التي ترجع قيمة في المكان الذي تم فيه إستدعاءها لأنهم يظنون أن القيمة التي سترجعها الدالة سيتم طباعتها أمام المستخدم.
الذي نريد إيصاله لك هو أن البرنامج التالي يعمل بشكل صحيح 100% لكنه لا يظهر أي نتيجة أمام المستخدم.
مع الإشارة إلى أن المثال الثالث سيعلمك كيف تخزن و تعرض القيمة التي سيتم إرجاعها.
المثال التالي يعلمك طريقة بناء دالة مهمتها فقط إرجاع قيمة للمستخدم.
الآن سنكتب دالة بسيطة إسمها GetNumber()
ترجع لنا العدد 50 فقط عندما نقوم باستدعائها.
كود الجافا
public class Methods { public static int GetNumber() { return 50; } public static void main (String[] args) { GetNumber(); } }
شرح الكود
public static int GetNumber() { return 50; }
هنا قمنا بتعريف دالة إسمها GetNumber()
ترجع القيمة 50 عندما يتم إستدعاءها في المكان الذي تم استدعاءها منه.
public static void main (String[] args) { GetNumber(); }
هنا قمنا بإستدعاء الدالة GetNumber()
حتى ترجع لنا القيمة 50 في المكان الذي قمنا باستدعاءها منه.
ملاحظة: هنا تم إرجاع القيمة 50 حقاً في المكان الذي قمنا فيه باستدعاء الدالة GetNumber()
حتى لو لم يظهر أي شيء في نتيجة التشغيل.
    لو قمنا بعرض القيمة التي أرجعتها الدالة لتأكدنا من ذلك.
المثال الثالث
المثال التالي يعلمك طريقة التعامل مع القيمة التي ترجعها أي دالة في المكان الذي تم إستدعاءها منه.
تذكر أنه بإمكانك أن تعرض القيمة التي ترجعها الدالة أو أن تقوم بتخزينها في متغير من نفس نوع الدالة.
الآن سنقوم بإضافة بعض التعديلات على البرنامج السابق و استدعاء الدالة GetNumber()
مرتين.
في المرة الأولى سنعرض فقط القيمة التي ترجعها الدالة.
في المرة الثانية سنخزن القيمة التي ترجعها الدالة في متغير من نفس نوع الدالة.
كود الجافا
public class Methods { public static int GetNumber ( ) { return 50; } public static void main (String[] args) { System.out.print("The function return: " +GetNumber()+ "\n"); int a; a = GetNumber(); System.out.print("a = " +a+ "\n"); } }
شرح الكود
public static int GetNumber ( ) { return 50; }
هنا قمنا بتعريف دالة إسمها GetNumber()
ترجع القيمة 50 عندما يتم إستدعاءها في المكان الذي تم استدعاءها منه.
System.out.print("The function return: " +GetNumber()+ "\n");
هنا قمنا بعرض القيمة التي ترجعها الدالة GetNumber()
.
int a; a = GetNumber(); System.out.print("a = " +a+ "\n");
هنا قمنا بتجهيز المتغير a
لأننا سنستخدمه لتخزين القيمة التي ترجعها الدالة GetNumber()
.
ثم قمنا باستدعاء الدالة GetNumber()
و وضع العدد الذي سترجعه كقيمة للمتغير a
.
في الأخير قمنا بعرض قيمة المتغير a
للتأكد أنه قد تم وضع القيمة التي أرجعتها الدالة GetNumber()
فيه.