Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تمرير الدوال كوسطاء

جزء من قسم Logic & Flow في رحلة Dart على Coddy — الدرس 45 من 65.

في البرمجة، يمكن للدوال أن تفعل ما هو أكثر من مجرد قبول قيم بسيطة مثل الأرقام أو السلاسل النصية - حيث يمكنها أيضاً قبول دوال أخرى كمعاملات. يُطلق على هذا المفهوم القوي اسم "الدالة من الرتبة العليا" (higher-order function)، وهو يفتح آفاقاً جديدة تماماً لكتابة كود مرن وقابل لإعادة الاستخدام.

عندما تمرر دالة كوسيط، فإنك تمنح دالة أخرى بشكل أساسي القدرة على تحديد العملية التي يجب تنفيذها. فكر في الأمر كأنك تعطي شخصاً ما أداة وتتركه يختار كيفية استخدامها على مواد مختلفة.

void processNumbers(List<int> numbers, Function operation) {
  for (int number in numbers) {
    operation(number);
  }
}

في هذا المثال، يأخذ processNumbers قائمة ودالة كمعاملات. معامل الدالة operation يمكن أن يكون أي دالة تقبل عدداً صحيحاً. هذا يعني أنه يمكنك تمرير دالة تطبع الأرقام، أو تضاعفها، أو تقوم بأي عملية أخرى تحتاجها.

هذا النهج يجعل الكود الخاص بك مرنًا للغاية - فبدلاً من كتابة دوال منفصلة لكل عملية ممكنة، تكتب دالة واحدة يمكنها العمل مع العديد من العمليات المختلفة عن طريق قبولها كمعاملات (parameters).

challenge icon

التحدي

سهل

أنشئ برنامجًا يوضح تمرير الدوال كوسطاء من خلال بناء معالج أرقام مرن. سيقوم برنامجك بإنشاء دوال معالجة مختلفة وتمريرها إلى دالة معالجة رئيسية تطبق العملية على قائمة من الأرقام.

  1. اقرأ مدخلاً نصياً يحتوي على أرقام مفصولة بفواصل (على سبيل المثال، "1,2,3,4,5")
  2. اقرأ مدخلاً نصياً يمثل نوع العملية ("double"، أو "square"، أو "increment")
  3. قم بتقسيم المدخل الأول إلى قائمة من النصوص وتحويل كل منها إلى عدد صحيح
  4. أنشئ ثلاث دوال منفصلة:
    • doubleNumber - تأخذ عدداً صحيحاً وتعيد قيمته مضروبة في 2
    • squareNumber - تأخذ عدداً صحيحاً وتعيد قيمته مضروبة في نفسها
    • incrementNumber - تأخذ عدداً صحيحاً وتعيد قيمته مضافاً إليها 1
  5. أنشئ دالة رئيسية تسمى processNumbers تأخذ قائمة من الأعداد الصحيحة ودالة كمعاملات
  6. يجب أن تقوم الدالة processNumbers بتطبيق الدالة المعطاة على كل رقم في القائمة وإرجاع قائمة جديدة بالنتائج
  7. بناءً على مدخل نوع العملية، قم بتمرير الدالة المناسبة إلى processNumbers
  8. اعرض النتائج بالتنسيق الموضح أدناه تماماً

على سبيل المثال، إذا كانت المدخلات هي "2,4,6,8" و "double"، يجب أن يخرج برنامجك:

Number Processor
================
Original numbers: [2, 4, 6, 8]
Operation: double
Processing numbers...
Result: [4, 8, 12, 16]
Operation completed successfully

إذا كانت المدخلات هي "3,5,7" و "square"، يجب أن يخرج برنامجك:

Number Processor
================
Original numbers: [3, 5, 7]
Operation: square
Processing numbers...
Result: [9, 25, 49]
Operation completed successfully

إذا كانت المدخلات هي "10,20,30" و "increment"، يجب أن يخرج برنامجك:

Number Processor
================
Original numbers: [10, 20, 30]
Operation: increment
Processing numbers...
Result: [11, 21, 31]
Operation completed successfully

يجب أن يوضح برنامجك مفهوم الدوال العليا (higher-order functions) من خلال تمرير إحدى دوال العمليات الثلاث كوسطاء إلى الدالة processNumbers. استخدم الجمل الشرطية لتحديد الدالة التي سيتم تمريرها بناءً على مدخل نوع العملية. يجب أن تقوم الدالة processNumbers بالتكرار عبر قائمة المدخلات، وتطبيق الدالة المعطاة على كل عنصر، وجمع النتائج في قائمة جديدة.

ورقة مرجعية

الدوال من الرتبة العليا (Higher-order functions) هي دوال يمكنها قبول دوال أخرى كمعاملات، مما يتيح كتابة كود مرن وقابل لإعادة الاستخدام.

لتمرير دالة كوسيط (argument)، قم بتعريف معامل من النوع Function:

void processNumbers(List<int> numbers, Function operation) {
  for (int number in numbers) {
    operation(number);
  }
}

يتيح لك ذلك تمرير دوال مختلفة لإجراء عمليات متنوعة على نفس البيانات، مما يجعل الكود الخاص بك أكثر نمطية (modular) ويتجنب الحاجة إلى كتابة دوال منفصلة لكل عملية محتملة.

جرّب بنفسك

import 'dart:io';

void main() {
  // قراءة المدخلات
  String? numbersInput = stdin.readLineSync();
  String? operation = stdin.readLineSync();
  
  // تحويل المدخلات النصية إلى قائمة من الأعداد الصحيحة
  List<int> numbers = numbersInput!.split(',').map((e) => int.parse(e.trim())).toList();
  
  // TODO: (doubleNumber, squareNumber, incrementNumber) قم بإنشاء دوال العمليات الثلاث
  
  // TODO: التي تأخذ قائمة ودالة كمعاملات processNumbers قم بإنشاء دالة
  
  // TODO: استخدم العبارات الشرطية لتحديد الدالة التي سيتم تمريرها بناءً على نوع العملية
  
  // TODO: مع الدالة المناسبة وقم بتخزين النتيجة processNumbers قم باستدعاء
  
  // طباعة النتائج بالتنسيق المطلوب
  print('Number Processor');
  print('================');
  print('Original numbers: $numbers');
  print('Operation: $operation');
  print('Processing numbers...');
  // TODO: اطبع قائمة النتائج هنا
  print('Operation completed successfully');
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow