الدوال Methods
ما هي الدالة؟ لماذا نستخدمها؟ كيف ننشئها؟ وكيف نمرّر لها قيمًا ونستقبل نتيجة؟ مع شرح مفصّل وأمثلة عملية.
ما هي الدالة ولماذا نحتاجها؟
عندما يبدأ برنامجك بالنمو، ستلاحظ أنك تكرر نفس الكود في أكثر من مكان — مثل طباعة رسالة ترحيب، أو حساب مجموع رقمين، أو التحقق من شرط معيّن.
هنا تأتي فائدة الدوال (Methods): الدالة هي "قطعة كود لها اسم" — نكتبها مرة واحدة، ثم نستدعيها في أي مكان وفي أي وقت نريد.
أوضح وأسهل
الكود يصبح منظمًا وسهل القراءة
أسهل في التعديل
تعدّل مرة واحدة فقط بدل عشر مرات
أقل أخطاء
التكرار يعني أخطاء أكثر — الدوال تحل هذا
بنية الدالة — كيف تُكتب؟
كل دالة في Java تتبع نفس البنية. دعنا نفككها قطعة قطعة:
// الصيغة العامة للدالة
public static نوع_الإرجاع اسم_الدالة ( المدخلات ) { }
public static
كلمتان محجوزتان
public تعني يمكن الوصول للدالة من أي مكان. static تعني يمكن تشغيلها بدون إنشاء كائن — سنفهم هذا أعمق في درس OOP.
نوع_الإرجاع
ماذا ستُرجع الدالة؟
إذا كانت الدالة ستعيد رقمًا → int أو double
إذا كانت ستعيد نصًا → String
إذا لم تعد شيئًا → void
اسم_الدالة
الاسم الذي تختاره أنت
يبدأ بحرف صغير، ويكون وصفيًا يعبّر عما تفعله الدالة — مثل calculateSum أو printMessage.
المدخلات
Parameters — القيم التي تأخذها الدالة
قد تكون فارغة () أو تحتوي على متغيرات مثل (int a, int b).
النوع الأول — دالة void (تنفّذ ولا ترجع شيئًا)
void تعني "فراغ" — الدالة تُنفّذ مهمة وتنتهي بدون إعادة أي قيمة. مناسبة للطباعة أو تنفيذ إجراءات.
public static void sayHello() { System.out.println("مرحبًا بك في Java"); } // الاستدعاء — هنا تعمل الدالة فعليًا sayHello();
الناتج:
مرحبًا بك في Java
💡 فكرة مهمة جداً للمبتدئ
كتابة الدالة وحدها لا يعني أنها ستعمل! — هي مثل "وصفة طعام" محفوظة في كتاب. لن تُطبخ الوصفة إلا عندما تقرر تنفيذها فعليًا.
① تعريف الدالة (الوصفة)
public static void sayHello() {
println("مرحبًا");
}
② الاستدعاء (التنفيذ)
// داخل main:
sayHello();
// ← هنا تعمل فعليًا
النوع الثاني — دالة مع مدخلات (Parameters)
أحيانًا تريد أن تخصّص ما تقوم به الدالة بحسب قيمة معيّنة — مثل تحية شخص باسمه. هنا نمرّر للدالة مدخلات تُسمى Parameters.
الفرق بين Parameter و Argument
Parameter = المتغير في تعريف الدالة: String name
Argument = القيمة الفعلية عند الاستدعاء: "أحمد"
// تعريف الدالة مع parameter public static void greet(String name) { System.out.println("مرحبًا يا " + name); } // استدعاء بمدخلات مختلفة greet("أحمد"); ← تطبع: مرحبًا يا أحمد greet("سارة"); ← تطبع: مرحبًا يا سارة greet("محمد"); ← تطبع: مرحبًا يا محمد
مرحبًا يا أحمد مرحبًا يا سارة مرحبًا يا محمد
📦 دالة مع أكثر من مدخل
يمكن تمرير أكثر من قيمة للدالة بفصلها بفاصلة:
public static void printInfo(String name, int age) { System.out.println("الاسم: " + name + " | العمر: " + age); } printInfo("أحمد", 25); // الناتج: الاسم: أحمد | العمر: 25
النوع الثالث — دالة ترجع قيمة (return)
أحيانًا تريد من الدالة أن تحسب وتعيد لك الناتج بدل طباعته مباشرة — هنا نستخدم return.
عندما ترجع قيمة، يجب استبدال void بنوع القيمة التي ستُرجعها — مثل int أو double أو String.
// دالة تجمع رقمين وترجع الناتج public static int sum(int a, int b) { return a + b; } // الاستخدام int result = sum(5, 3); System.out.println("الناتج: " + result);
الناتج: 8
🔍 ماذا يحدث خطوة بخطوة؟
sum(5, 3) — نمرر 5 كـ a و 3 كـ b
5 + 3 = 8
return 8 — ترجع الناتج للمكان الذي استدعاها
result ثم يُطبع
📋 متى تستخدم void ومتى تستخدم return؟
| الحالة | النوع | مثال |
|---|---|---|
| الدالة تطبع أو تنفّذ إجراءً | void |
printMessage() |
| الدالة تحسب وتعيد رقمًا | int |
sum(a, b) |
| الدالة تعيد نصًا | String |
getGreeting(name) |
| الدالة تعيد صحيح أو خطأ | boolean |
isAdult(age) |
مثال كامل — كل الدوال معًا
دعنا نرى كيف تتعاون الدوال المختلفة داخل كلاس كامل:
public class Main { // ① دالة void — لا ترجع شيئًا public static void sayHello() { System.out.println("مرحبًا!"); } // ② دالة مع مدخل public static void greet(String name) { System.out.println("أهلًا يا " + name); } // ③ دالة ترجع قيمة public static int sum(int a, int b) { return a + b; } // نقطة بداية البرنامج public static void main(String[] args) { sayHello(); greet("أحمد"); int x = sum(10, 20); System.out.println("المجموع: " + x); } }
مرحبًا! أهلًا يا أحمد المجموع: 30
لاحظ أن الدوال الثلاث مكتوبة بجانب main داخل الكلاس — وليس داخل main نفسها. هذا مهم جداً في Java.
أخطاء شائعة عند المبتدئين ⚠️
تعريف الدالة داخل main
❌ خطأ
void main(...) {
void sayHello() {
println("hi");
}
}
✅ صحيح
void sayHello() {
println("hi");
}
void main(...) {
sayHello();
}
نسيان استدعاء الدالة
كتبت الدالة لكن لم تستدعها من main — لن تظهر أي نتيجة! تذكر: الدالة تحتاج sayHello(); لتعمل.
نوع الإرجاع لا يطابق return
❌ خطأ
public static int test() {
return "نص";
}
النوع int لكن ترجع String!
✅ صحيح
public static int test() {
return 42;
}
نسيان return في دالة غير void
إذا كان نوع الدالة int مثلاً، يجب أن يكون هناك return في نهايتها — وإلا سيظهر خطأ في الترجمة.
📋 ملخص الدرس
الدالة = قطعة كود لها اسم تُكتب مرة وتُستدعى متى شئت
void لا ترجع شيئًا — int/String/... ترجع قيمة
Parameters = مدخلات الدالة — يمكن تمرير أكثر من مدخل
الدوال تُكتب داخل الكلاس لكن خارج دالة main
⏭️ في الدرس القادم:
سنبدأ عالم البرمجة الكائنية (OOP) — ما هو Class وما هو Object؟ وكيف نبني برامج أكثر تنظيمًا وإبداعًا؟ 🚀