الدرس الثالث والعشرون: البرمجة الوظيفية (Functional Programming)
البرمجة الوظيفية هي نمط برمجي يعتمد على استخدام الدوال كأولويات رئيسية في كتابة البرامج. في هذا الدرس، سنتعرف على البرمجة الوظيفية وكيفية تطبيقها باستخدام JavaScript، من خلال فهم المفاهيم الأساسية مثل الدوال النقية (Pure Functions)، الدوال عالية الرتبة (Higher-order Functions)، بالإضافة إلى استخدام الأساليب الوظيفية للعمل مع المصفوفات مثل map
، filter
، و reduce
.
1. التعريف بـ Functional Programming
البرمجة الوظيفية هي نمط برمجي يعتمد على الدوال كـ “أوليات” ويتجنب التغييرات الجانبية (side effects) وحالة المتغيرات المتغيرة (mutable state). من أهم المبادئ في البرمجة الوظيفية:
- الدوال النقية (Pure Functions): هي دوال لا تؤثر على العالم الخارجي ولا تعتمد على حالة خارجية. تعطي نفس النتيجة دائمًا عندما يتم تمرير نفس المدخلات.
- اللامحدودية (Immutability): يعني أنه لا يتم تعديل البيانات في أماكنها الأصلية، بل يتم إنشاء نسخ جديدة من البيانات.
- الدوال عالية الرتبة (Higher-order Functions): هي دوال يمكنها قبول دوال كمدخلات أو إرجاع دوال كقيمة مخرجة.
2. التعامل مع المصفوفات باستخدام map, filter, و reduce
الدالة map()
تُستخدم map()
لإنشاء مصفوفة جديدة من خلال تطبيق دالة معينة على كل عنصر في المصفوفة الأصلية.
مثال على استخدام map()
:
const numbers = [1, 2, 3, 4, 5];
// استخدام map لتطبيق دالة على كل عنصر
const squaredNumbers = numbers.map(num => num * num);
console.log(squaredNumbers); // [1, 4, 9, 16, 25]
الدالة filter()
تُستخدم filter()
لإنشاء مصفوفة جديدة تحتوي على العناصر التي تحقق شرطًا معينًا، بناءً على دالة تُمرر إليها.
مثال على استخدام filter()
:
const numbers = [1, 2, 3, 4, 5];
// استخدام filter لتصفية الأعداد الفردية
const oddNumbers = numbers.filter(num => num % 2 !== 0);
console.log(oddNumbers); // [1, 3, 5]
الدالة reduce()
تُستخدم reduce()
لتطبيق دالة على كل عنصر في المصفوفة لتحويلها إلى قيمة واحدة. تُعتبر reduce()
واحدة من أقوى الأدوات في البرمجة الوظيفية.
مثال على استخدام reduce()
:
const numbers = [1, 2, 3, 4, 5];
// استخدام reduce لحساب مجموع الأعداد
const sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0);
console.log(sum); // 15
في هذا المثال:
- accumulator: القيمة المتراكمة التي يتم تحديثها في كل خطوة.
- currentValue: العنصر الحالي في المصفوفة.
- 0: هو القيمة الأولية لـ accumulator (يمكن أن تكون قيمة افتراضية أو أولية).
3. Pure Functions و Higher-order Functions
الدوال النقية (Pure Functions)
الدوال النقية هي دوال لا تؤثر على أي شيء خارج نطاقها ولا تعتمد على المتغيرات أو الحالة الخارجية. هذه الدوال دائمًا تعطي نفس النتيجة عندما يتم تمرير نفس المدخلات إليها.
مثال على دالة نقية:
// دالة نقية
function add(a, b) {
return a + b;
}
console.log(add(2, 3)); // 5
console.log(add(2, 3)); // 5 (النتيجة دائمًا نفسها)
الدالة add
هنا تعتبر دالة نقية لأنها لا تعتمد على أي حالة خارجية، ولا تؤثر على أي شيء خارج نطاقها.
الدوال عالية الرتبة (Higher-order Functions)
الدوال عالية الرتبة هي دوال يمكنها قبول دوال كمدخلات أو إرجاع دوال كقيمة مخرجة. هذه الدوال هي أساس البرمجة الوظيفية لأنها تتيح التعامل مع دوال أخرى كقيم.
مثال على دالة عالية الرتبة:
// دالة عالية الرتبة
function createMultiplier(multiplier) {
return function(value) {
return value * multiplier;
};
}
const double = createMultiplier(2); // دالة تضاعف الأرقام
console.log(double(5)); // 10
const triple = createMultiplier(3); // دالة تضاعف الأرقام بثلاثة
console.log(triple(5)); // 15
في هذا المثال:
createMultiplier
هي دالة عالية الرتبة لأنها ترجع دالة أخرى.- يمكننا إنشاء دوال مثل
double
وtriple
باستخدامcreateMultiplier
.
4. دمج map
, filter
, و reduce
مع البرمجة الوظيفية
من أهم مميزات البرمجة الوظيفية هي إمكانية دمج الدوال مثل map
، filter
، و reduce
لتحقيق عمليات معقدة بشكل بسيط وفعال.
مثال على دمج map
و filter
و reduce
:
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// استخدام map و filter و reduce لإيجاد مجموع الأعداد الزوجية بعد ضربها في 2
const sumOfDoubledEvenNumbers = numbers
.filter(num => num % 2 === 0) // تصفية الأعداد الزوجية
.map(num => num * 2) // ضرب الأعداد في 2
.reduce((acc, num) => acc + num, 0); // حساب المجموع
console.log(sumOfDoubledEvenNumbers); // 60 (2*2 + 4*2 + 6*2 + 8*2 + 10*2)
شرح الكود:
- أولاً، نستخدم
filter
لاستخراج الأعداد الزوجية. - بعد ذلك، نستخدم
map
لمضاعفة كل عدد. - أخيرًا، نستخدم
reduce
لحساب مجموع هذه الأعداد.
الخلاصة
- البرمجة الوظيفية (Functional Programming) هي نمط برمجي يعتمد على الدوال كأدوات أساسية للتعامل مع البيانات، ويعتمد على المفاهيم مثل الدوال النقية، اللامحدودية، والدوال عالية الرتبة.
- الدوال النقية (Pure Functions) هي دوال لا تؤثر على الحالة الخارجية وتُعطي نفس النتيجة دائمًا عند تمرير نفس المدخلات.
- الدوال عالية الرتبة (Higher-order Functions) هي دوال يمكنها قبول دوال كمدخلات أو إرجاع دوال.
- يمكن استخدام الدوال مثل
map
،filter
، وreduce
في JavaScript لتنفيذ عمليات على المصفوفات بطريقة وظيفية، مما يحسن من وضوح الكود وكفاءته.
البرمجة الوظيفية تساعد في كتابة كود نظيف، صلب، وأكثر قابلية للصيانة، وهي من الأدوات المهمة في تطوير التطبيقات الحديثة.
اكتشاف المزيد من كود التطور
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.