الدوال Methods

18:00 دقائق مجاني

ما هي الدالة؟ لماذا نستخدمها؟ كيف ننشئها؟ وكيف نمرّر لها قيمًا ونستقبل نتيجة؟ مع شرح مفصّل وأمثلة عملية.

ما هي الدالة ولماذا نحتاجها؟

عندما يبدأ برنامجك بالنمو، ستلاحظ أنك تكرر نفس الكود في أكثر من مكان — مثل طباعة رسالة ترحيب، أو حساب مجموع رقمين، أو التحقق من شرط معيّن.

هنا تأتي فائدة الدوال (Methods): الدالة هي "قطعة كود لها اسم" — نكتبها مرة واحدة، ثم نستدعيها في أي مكان وفي أي وقت نريد.

📖

أوضح وأسهل

الكود يصبح منظمًا وسهل القراءة

✏️

أسهل في التعديل

تعدّل مرة واحدة فقط بدل عشر مرات

🐛

أقل أخطاء

التكرار يعني أخطاء أكثر — الدوال تحل هذا

💬 تخيّل الدالة كـ "ماكينة" — تضع فيها مدخلات وتخرج لك نتيجة. يمكنك استخدام نفس الماكينة مئة مرة بدون إعادة بنائها.

بنية الدالة — كيف تُكتب؟

كل دالة في Java تتبع نفس البنية. دعنا نفككها قطعة قطعة:

// الصيغة العامة للدالة

public static نوع_الإرجاع اسم_الدالة ( المدخلات ) { }

public static

كلمتان محجوزتان

public تعني يمكن الوصول للدالة من أي مكان. static تعني يمكن تشغيلها بدون إنشاء كائن — سنفهم هذا أعمق في درس OOP.

نوع_الإرجاع

ماذا ستُرجع الدالة؟

إذا كانت الدالة ستعيد رقمًا → int أو double
إذا كانت ستعيد نصًا → String
إذا لم تعد شيئًا → void

اسم_الدالة

الاسم الذي تختاره أنت

يبدأ بحرف صغير، ويكون وصفيًا يعبّر عما تفعله الدالة — مثل calculateSum أو printMessage.

المدخلات

Parameters — القيم التي تأخذها الدالة

قد تكون فارغة () أو تحتوي على متغيرات مثل (int a, int b).

النوع الأول — دالة void (تنفّذ ولا ترجع شيئًا)

void تعني "فراغ" — الدالة تُنفّذ مهمة وتنتهي بدون إعادة أي قيمة. مناسبة للطباعة أو تنفيذ إجراءات.

VoidMethod.java
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 = القيمة الفعلية عند الاستدعاء: "أحمد"

ParameterMethod.java
// تعريف الدالة مع 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.

ReturnMethod.java
// دالة تجمع رقمين وترجع الناتج
public static int sum(int a, int b) {
    return a + b;
}

// الاستخدام
int result = sum(5, 3);
System.out.println("الناتج: " + result);
🖥️ الناتج: 8

🔍 ماذا يحدث خطوة بخطوة؟

1 نستدعي sum(5, 3) — نمرر 5 كـ a و 3 كـ b
2 الدالة تحسب 5 + 3 = 8
3 return 8 — ترجع الناتج للمكان الذي استدعاها
4 يُخزن 8 في المتغير result ثم يُطبع

📋 متى تستخدم void ومتى تستخدم return؟

الحالة النوع مثال
الدالة تطبع أو تنفّذ إجراءً void printMessage()
الدالة تحسب وتعيد رقمًا int sum(a, b)
الدالة تعيد نصًا String getGreeting(name)
الدالة تعيد صحيح أو خطأ boolean isAdult(age)

مثال كامل — كل الدوال معًا

دعنا نرى كيف تتعاون الدوال المختلفة داخل كلاس كامل:

Main.java
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؟ وكيف نبني برامج أكثر تنظيمًا وإبداعًا؟ 🚀