الدوال (Functions) في Dart

🔹 ما هي الدوال (Functions)؟

الدالة (Function) في Dart هي كتلة من التعليمات البرمجية تُستخدم لأداء مهمة معينة. تساعد الدوال على إعادة استخدام الكود، تقليل التكرار، وجعل الكود أكثر تنظيمًا وسهولة في الصيانة.


🔹 إنشاء دالة في Dart

الصيغة العامة لتعريف دالة:

returnType functionName(parameters) {
  // كود الدالة
  return value; // اختياري
}
Dart

📌 شرح الصيغة:

  • returnType هو نوع البيانات التي ستُرجعها الدالة (مثل int, String, void, إلخ).
  • functionName هو اسم الدالة.
  • parameters هي القيم المدخلة (اختيارية).
  • return value تُستخدم لإرجاع قيمة (اختياري).

1️⃣ دالة بدون إرجاع (void) وبدون معاملات

🔹 هذه الدالة تنفذ كودًا معينًا لكنها لا تُرجع أي قيمة.

مثال: طباعة رسالة

void sayHello() {
  print('مرحبا بك في Dart!');
}

void main() {
  sayHello(); // استدعاء الدالة
}
Dart

🔹 الناتج:


2️⃣ دالة تُرجع قيمة (return)

🔹 يمكن للدالة إرجاع قيمة معينة باستخدام return.

مثال: حساب مجموع عددين

int sum(int a, int b) {
  return a + b;
}

void main() {
  int result = sum(5, 3);
  print('المجموع: $result');
}
Dart

🔹 الناتج:


3️⃣ دالة تحتوي على معاملات (Parameters)

🔹 يمكن تمرير معاملات (Arguments) إلى الدالة عند استدعائها.

مثال: دالة تحسب مربع رقم

int square(int number) {
  return number * number;
}

void main() {
  print(square(4)); // 16
  print(square(7)); // 49
}
Dart

4️⃣ دالة بمعاملات اختيارية (Optional Parameters)

🔹 يمكن جعل بعض المعاملات اختيارية باستخدام الأقواس [ ].

مثال: دالة تحيي المستخدم باسم اختياري

void greet([String name = 'ضيف']) {
  print('مرحبا، $name!');
}

void main() {
  greet();        // مرحبا، ضيف!
  greet('Ali');   // مرحبا، Ali!
}
Dart

5️⃣ دالة تحتوي على معاملات مسماة (Named Parameters)

🔹 تُستخدم {} لجعل المعاملات مسماة (Named Parameters) بحيث يمكن تمريرها بترتيب عشوائي.

مثال: دالة تحسب محيط المستطيل

double perimeter({double length = 1, double width = 1}) {
  return 2 * (length + width);
}

void main() {
  print(perimeter(length: 5, width: 3)); // 16
  print(perimeter(width: 4, length: 2)); // 12
}
Dart

6️⃣ دالة تحتوي على معامل مسمى إجباري (required)

🔹 عند استخدام required، يصبح تمرير هذا المعامل إجباريًا عند استدعاء الدالة.

مثال: حساب مساحة مستطيل بمعاملات إجبارية

double area({required double length, required double width}) {
  return length * width;
}

void main() {
  print(area(length: 5, width: 3)); // 15
}
Dart

7️⃣ دالة مختصرة (Arrow Function)

🔹 تُستخدم الأسهم (=>) لإنشاء دوال مختصرة عند وجود سطر واحد فقط في جسم الدالة.

مثال: دالة لحساب ضعف العدد

int doubleNumber(int num) => num * 2;

void main() {
  print(doubleNumber(4)); // 8
}
Dart

🔹 تعادل هذه الدالة الكود التالي ولكن بشكل مختصر:

int doubleNumber(int num) {
  return num * 2;
}
Dart

8️⃣ الدوال المجهولة (Anonymous Functions)

🔹 تُستخدم الدوال المجهولة (Lambda Functions) عندما لا تحتاج إلى تعريف دالة كاملة.

مثال: استخدام دالة مجهولة داخل forEach()

void main() {
  List<int> numbers = [1, 2, 3, 4];

  numbers.forEach((num) {
    print('الرقم: $num');
  });
}
Dart

🔹 الناتج:

الرقم: 1
الرقم: 2
الرقم: 3
الرقم: 4
Dart

9️⃣ تمرير دالة كمعامل (Higher-Order Function)

🔹 يمكن تمرير دالة كمعامل إلى دالة أخرى.

مثال: دالة تأخذ دالة أخرى كمعامل

void executeFunction(Function callback) {
  callback();
}

void sayHello() {
  print('مرحبًا بك!');
}

void main() {
  executeFunction(sayHello);
}
Dart

🔹 الناتج:


🔹 الخلاصة

الدوال في Dart توفر طريقة قوية لتنظيم الكود، وتقليل التكرار، وزيادة كفاءة البرامج.
✅ يمكن أن تحتوي الدالة على معاملات اختيارية أو إجبارية، ويمكن أن تُرجع قيمة أو لا تُرجع شيئًا.
يمكن استخدام الدوال المجهولة، الدوال المختصرة، وتمرير الدوال كمعاملات لجعل الكود أكثر مرونة.

💡 ما نوع الدالة التي تستخدمها أكثر في مشاريعك؟ 🚀