(1) Function in dart

1. مقدمة عن الدوال في Dart
📌 التعريف:

الدالة (Function) هي وحدة من الكود قابلة لإعادة الاستخدام تقوم بتنفيذ مهمة معينة.

الهدف منها تنظيم الكود، تسهيل القراءة، وتقليل التكرار.

✅ الفوائد:
  • إعادة استخدام الكود.
  • تسهيل اختبار الكود (Testability).
  • تسهيل الصيانة والتوسعة.
  • تحسين الأداء والتنظيم.
🛠️ ملاحظة:

في Dart، كل شيء هو كائن (Object)، حتى الدوال تعتبر كائنات من نوع Function.

✅ 2. تعريف الدوال (Function Definition)
📌 الصيغة العامة:
Type functionName() {
  // body
  return value;
}
JavaScript
🧪 مثال:
int sum(int a, int b) {
  return a + b;
}
JavaScript
📌 شرح:
  • int → نوع القيمة التي ترجعها الدالة.
  • sum → اسم الدالة.
  • (int a, int b) → المعطيات (parameters).
  • return a + b; → ناتج الدالة.
✳️ أنواع الدوال حسب البنية:
✅ 1. دالة لا تعيد شيئًا (void):
void printMessage() {
  print("Welcome to Dart!");
}

printMessage();
JavaScript
✅ 2. دالة تعيد قيمة:
String greet() {
  return "Hello yasin";
}

greet();
JavaScript
✅ 3. دالة بدون بارامترات:
int getYear() {
  return DateTime.now().year;
}
JavaScript
✅ 3. استدعاء الدوال (Function Call)
📌 كيف يتم الاستدعاء؟

بعد تعريف الدالة، تستدعيها باسمها وتمرير البارامترات إن وجدت.

🧪 أمثلة:
void main() {
  printMessage();                     // دالة بدون معطيات
  print(greet("Yasin"));             // دالة مع معطى
  int result = sum(5, 7);            // دالة تعيد قيمة
  print("Sum: $result");
}
JavaScript
⚠️ محاذير:
  • لا تستدعِ الدالة قبل تعريفها في نطاق محلي.
  • تأكد من تطابق نوع المعطيات مع ما تطلبه الدالة.
  • احذر من تمرير null بدون دعم null-safety.
✅ 4. الدوال بأنواع مختلفة من المعطيات
📌 أنواع المعطيات:
✅ 1. المعطيات الإلزامية (Required Parameters):
void printUser(String name, int age) {
  print("Name: $name, Age: $age");
}
JavaScript
✅ 2. المعطيات الاختيارية positional optional (بين [ ]):
void printUser([String? name, int? age]) {
  print("Name: $name, Age: $age");
}
JavaScript
✅ 3. المعطيات المسماة (Named Parameters):
void printUser({String? name, int? age}) {
  print("Name: $name, Age: $age");
}
JavaScript
✅ 4. معطيات مسماة مع قيم افتراضية:
void printUser({String name = "غير معروف", int age = 0}) {
  print("Name: $name, Age: $age");
}
JavaScript
🧪 استدعاء دالة بمعطيات مسماة:
printUser(name: "Yasin", age: 25);
printUser(); // تستخدم القيم الافتراضية
JavaScript
✳️ المقارنة:
النوعترتيب مهم؟اسم البارامتر مطلوب؟يمكن إعطاء قيمة افتراضية؟
Requiredنعملالا
Optional positionalنعملانعم
Namedلانعم (مع required)نعم
⚠️ ملاحظات:
  • يفضل استخدام المعطيات المسماة لزيادة وضوح الكود.
  • المعطيات الاختيارية positional تسبب صعوبة في القراءة.
✅ 5. إرجاع القيم (Return Values)
📌 return:

كلمة مفتاحية تُستخدم لإرجاع قيمة من الدالة إلى المكان الذي تم استدعاؤها فيه.

🧪 مثال:
double calculateArea(double radius) {
  return 3.14 * radius * radius;
}
JavaScript
🧪 دالة بدون return (تعيد void):
void showResult() {
  print("No result to return.");
}
JavaScript
✅ الفوائد:
  • تسمح لك بإرجاع نتائج المعالجة.
  • تسهل استخدام نتائج الدالة في أماكن أخرى بالكود.
⚠️ ملاحظات:
  • لا يمكن استخدام return في دوال void إلا لإنهاء التنفيذ فقط بدون قيمة.
  • يجب تطابق نوع القيمة المُرجعة مع returnType.
📌 مثال تطبيقي شامل:
String formatMessage(String name, {int age = 18}) {
  return "Welcome $name, you are $age years old.";
}

void main() {
  String msg = formatMessage("Yasin");
  print(msg);
}
JavaScript
✅ التوصيات العامة:
  • اجعل الدوال صغيرة وواضحة.
  • استخدم أسماء معبرة توضح ما تقوم به الدالة.
  • قلل المعطيات قدر الإمكان، واستعمل المعطيات المسماة عند الحاجة.
  • أعد استخدام الدوال بدلًا من تكرار الكود.
✅ أولًا: ما هي الدالة بدون بارامترات؟

هي دالة لا تحتاج إلى استقبال أي قيمة عند استدعائها. فقط تنفذ مهمة معينة، مثل الطباعة أو إرجاع قيمة ثابتة.

✅ 1. دالة بدون بارامترات وبدون إرجاع (void)
📌 التعريف:
void sayHello() {
  print("Hello, welcome to Dart!");
}
JavaScript
📌 الاستدعاء:
void main() {
  sayHello(); // استدعاء الدالة
}
JavaScript
🧪 الناتج:
Hello, welcome to Dart!
JavaScript
✅ 2. دالة بدون بارامترات ولكن تُرجع قيمة (return)
📌 التعريف:
String getGreeting() {
  return "Good morning!";
}
JavaScript
📌 الاستدعاء مع الطباعة:
void main() {
  print(getGreeting()); // استدعاء وطباعة ناتج الدالة
}
JavaScript
🧪 الناتج:
Good morning!
JavaScript

✅ 3. دالة تحسب وتعيد نتيجة بدون استقبال معطيات
int getLuckyNumber() {
  return 7;
}

void main() {
  int number = getLuckyNumber();
  print("Your lucky number is: $number");
}
JavaScript
🧪 الناتج:
Your lucky number is: 7
JavaScript
✅ 4. استخدام دالة void لطباعة عدة أسطر
void printWelcomeMessage() {
  print("**************************");
  print("*   Welcome to Dart!     *");
  print("**************************");
}

void main() {
  printWelcomeMessage(); // استدعاء الدالة
}
JavaScript
✅ 5. استخدام دالة داخل دالة (Nested Call)
String getName() {
  return "Yasin";
}

void greet() {
  print("Hello, ${getName()}!");
}

void main() {
  greet();
}
JavaScript
🧪 الناتج:
Hello, Yasin!
JavaScript
✅ ملخص التوصيات:
الحالةالنوعكلمة returnمثال
تنفذ أمر فقطvoidvoid sayHi()
تُرجع قيمة ثابتةغير voidString getName()
تُرجع قيمة محسوبةغير voidint getScore()
✅ ⚠️ ملاحظات هامة:
  • إذا لم تستخدم return في دالة غير void، ستحصل على خطأ.
  • الدوال void تُستخدم غالبًا للطباعة، الإشعارات، أو الأوامر البسيطة.
  • الأفضل دائمًا جعل اسم الدالة يعبر بدقة عن مهمتها.