في البرمجة الوظيفية يشبه البرنامج سلسلة من التحويلات: تدخل البيانات إلى دالة فتتحول، ثم تدخل الدالة التالية، وفي النهاية تعطي النتيجة. وبدلاً من تغيير القيم، تُنشئ قيماً جديدة.
الأفكار الرئيسية#
- الدالة النقية (Pure): تعطي دائماً المخرج نفسه للمدخل نفسه ولا تغيّر شيئاً خارج نفسها.
- عدم قابلية التغيير (Immutability): لا تتغير البيانات بعد إنشائها؛ تُنشأ نسخة جديدة.
- الدالة عالية الرتبة (Higher-order): دالة تأخذ دالة أخرى مدخلاً أو تُرجعها.
مثال#
const prices = [100, 250, 80];
const total = prices
.filter(p => p > 90)
.map(p => p * 1.1)
.reduce((a, b) => a + b, 0);هنا أُنجزت التصفية والتحويل والجمع بلا حلقة يدوية ودون تغيير المصفوفة الأصلية.
لماذا لها أنصار#
الدوال النقية سهلة الاختبار وسلوكها سهل التوقع. وعندما لا يتغير شيء من الخارج تقلّ الأخطاء الغريبة المرتبطة بترتيب التنفيذ. وهذا أنفع في البرامج المتزامنة.
أين تراها#
حتى لو لم تستخدم لغة وظيفية خالصة كهاسكل، فإن دوالاً مثل map وfilter في جافا سكريبت وبايثون مبنية على الفكرة نفسها.
خطأ شائع#
الظن بأن عليك الاختيار بين الوظيفية وكائنية التوجه. عملياً تستفيد معظم المشاريع من الاثنين.