"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > استكشاف البرمجة الوظيفية في جافا سكريبت

استكشاف البرمجة الوظيفية في جافا سكريبت

تم النشر بتاريخ 2024-11-05
تصفح:983

Exploring Functional Programming in JavaScript

ما هي البرمجة الوظيفية؟

البرمجة الوظيفية هي نموذج برمجي يتعامل مع الحساب باعتباره تقييمًا للوظائف الرياضية. إنه يتجنب تغيير الحالة والبيانات القابلة للتغيير. الفكرة الأساسية هي بناء برامج باستخدام وظائف خالصة، وتجنب الآثار الجانبية، والعمل مع هياكل البيانات غير القابلة للتغيير.

تشمل الخصائص الرئيسية للبرمجة الوظيفية ما يلي:

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

المفاهيم الأساسية للبرمجة الوظيفية في جافا سكريبت

دعونا نستكشف بعض أهم المفاهيم التي تحدد FP في JavaScript.

1. وظائف خالصة

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

مثال:

// Pure function example
function add(a, b) {
  return a   b;
}

add(2, 3); // Always returns 5

الوظيفة الخالصة لها العديد من المزايا:

  • قابلية الاختبار: بما أن الدوال الخالصة تُرجع دائمًا نفس المخرجات لنفس المدخلات، فمن السهل اختبارها.
  • القدرة على التنبؤ: تتصرف بشكل متسق ويسهل تصحيحها.

2. الثبات

الثبات يعني أنه بمجرد إنشاء متغير أو كائن، لا يمكن تعديله. بدلاً من ذلك، إذا كنت بحاجة إلى تغيير شيء ما، يمكنك إنشاء مثيل جديد.

مثال:

const person = { name: "Alice", age: 25 };

// Attempting to "change" person will return a new object
const updatedPerson = { ...person, age: 26 };

console.log(updatedPerson); // { name: 'Alice', age: 26 }
console.log(person); // { name: 'Alice', age: 25 }

من خلال الحفاظ على البيانات غير قابلة للتغيير، يمكنك تقليل مخاطر الآثار الجانبية غير المقصودة، وخاصة في التطبيقات المعقدة.

3. وظائف من الدرجة الأولى

في JavaScript، تعتبر الوظائف مواطنة من الدرجة الأولى. هذا يعني أنه يمكن تعيين الدوال إلى متغيرات، وتمريرها كوسيطات إلى دوال أخرى، وإرجاعها من الدوال. هذه الخاصية هي المفتاح للبرمجة الوظيفية.

مثال:

const greet = function(name) {
  return `Hello, ${name}!`;
};

console.log(greet("Bob")); // "Hello, Bob!"

4. وظائف ذات ترتيب أعلى

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

مثال:

// Higher-order function
function map(arr, fn) {
  const result = [];
  for (let i = 0; i  x * x);

console.log(squared); // [1, 4, 9, 16]

تعتبر Array.prototype.map وfilter وreduce في JavaScript أمثلة مدمجة لوظائف ذات ترتيب أعلى تساعد في البرمجة الوظيفية.

5. التركيب الوظيفي

التركيب الوظيفي هو عملية دمج وظائف متعددة في وظيفة واحدة. يتيح لنا ذلك إنشاء سلسلة من العمليات، حيث يصبح مخرجات إحدى الوظائف مدخلاً للوظيفة التالية.

مثال:

const multiplyByTwo = (x) => x * 2;
const addFive = (x) => x   5;

const multiplyAndAdd = (x) => addFive(multiplyByTwo(x));

console.log(multiplyAndAdd(5)); // 15

يعد تكوين الوظيفة تقنية قوية لإنشاء تعليمات برمجية قابلة لإعادة الاستخدام وقابلة للصيانة.

6. الكاري

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

مثال:

function add(a) {
  return function(b) {
    return a   b;
  };
}

const addFive = add(5);
console.log(addFive(3)); // 8

تتيح لك هذه التقنية إنشاء وظائف متخصصة دون الحاجة إلى إعادة كتابة المنطق.

7. العودة

Recursion هو أسلوب برمجة وظيفي آخر حيث تستدعي الوظيفة نفسها لحل نسخة أصغر من نفس المشكلة. يُستخدم هذا غالبًا كبديل للحلقات في FP، حيث تتضمن الحلقات حالة قابلة للتغيير (والتي تحاول البرمجة الوظيفية تجنبها).

مثال:

function factorial(n) {
  if (n === 0) return 1;
  return n * factorial(n - 1);
}

console.log(factorial(5)); // 120

يمكّنك Recursion من كتابة تعليمات برمجية أكثر وضوحًا وأكثر قابلية للقراءة للمهام التي يمكن تقسيمها إلى مشكلات فرعية أصغر.

8. تجنب الآثار الجانبية

تحدث التأثيرات الجانبية عندما تقوم إحدى الوظائف بتعديل بعض الحالات الخارجية (مثل تغيير متغير عام أو التفاعل مع DOM). في البرمجة الوظيفية، الهدف هو تقليل الآثار الجانبية، والحفاظ على الوظائف متوقعة ومكتفية بذاتها.

مثال على الآثار الجانبية:

let count = 0;

function increment() {
  count  = 1;  // Modifies external state
}

increment();
console.log(count);  // 1

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

بديل FP:

function increment(value) {
  return value   1;  // Returns a new value instead of modifying external state
}

let count = 0;
count = increment(count);
console.log(count);  // 1

مزايا البرمجة الوظيفية

يوفر اعتماد البرمجة الوظيفية في JavaScript فوائد عديدة:

  • تحسين إمكانية القراءة : الطبيعة التصريحية لـ FP تجعل التعليمات البرمجية أسهل في القراءة والفهم. أنت تركز على وصف "ماذا" بدلاً من "كيف".
  • قابلية إعادة الاستخدام والنمطية: تعمل الوظائف النقية وتكوين الوظائف على تعزيز التعليمات البرمجية المعيارية القابلة لإعادة الاستخدام.
  • القدرة على التنبؤ: تعمل الوظائف الخالصة والثبات على تقليل عدد الأخطاء وجعل الكود أكثر قابلية للتنبؤ.
  • اختبار أسهل: يعد اختبار الوظائف النقية أمرًا مباشرًا نظرًا لعدم وجود آثار جانبية أو تبعيات على الحالة الخارجية.
  • التزامن والتوازي: يتيح FP تنفيذًا أسهل للعمليات المتزامنة والمتوازية لأنه لا توجد حالات مشتركة قابلة للتغيير، مما يجعل من السهل تجنب ظروف السباق والجمود.

مكتبات البرمجة الوظيفية في جافا سكريبت

بينما تتمتع JavaScript بدعم من الدرجة الأولى للبرمجة الوظيفية، يمكن للمكتبات تحسين قدرتك على كتابة التعليمات البرمجية الوظيفية. تشمل بعض المكتبات الشائعة ما يلي:

  1. Lodash (وحدة FP): توفر Lodash وظائف مساعدة لمهام البرمجة الشائعة، وتسمح لك وحدة FP الخاصة بها بالعمل بأسلوب أكثر وظيفية.

مثال:

   const _ = require('lodash/fp');
   const add = (a, b) => a   b;
   const curriedAdd = _.curry(add);
   console.log(curriedAdd(1)(2)); // 3
  1. Ramda: Ramda هي مكتبة مصممة خصيصًا للبرمجة الوظيفية في JavaScript. إنه يعزز الثبات وتكوين الوظيفة.

مثال:

   const R = require('ramda');
   const multiply = R.multiply(2);
   const add = R.add(3);
   const multiplyAndAdd = R.pipe(multiply, add);

   console.log(multiplyAndAdd(5)); // 13
  1. Immutable.js: توفر هذه المكتبة هياكل بيانات ثابتة غير قابلة للتغيير تساعدك على اتباع مبادئ FP.

مثال:

   const { Map } = require('immutable');

   const person = Map({ name: 'Alice', age: 25 });
   const updatedPerson = person.set('age', 26);

   console.log(updatedPerson.toJS()); // { name: 'Alice', age: 26 }
   console.log(person.toJS()); // { name: 'Alice', age: 25 }

خاتمة

توفر البرمجة الوظيفية نموذجًا قويًا لكتابة تعليمات برمجية JavaScript نظيفة ويمكن التنبؤ بها وقابلة للصيانة. من خلال التركيز على الوظائف النقية، والثبات، وتجنب الآثار الجانبية، يمكن للمطورين بناء برامج أكثر موثوقية. على الرغم من أن كل مشكلة لا تتطلب نهجًا وظيفيًا، إلا أن دمج مبادئ FP يمكن أن يعزز بشكل كبير مشاريع JavaScript الخاصة بك، مما يؤدي إلى تحسين تنظيم التعليمات البرمجية وقابلية الاختبار والنمطية.

مع استمرارك في العمل باستخدام JavaScript، حاول دمج تقنيات البرمجة الوظيفية حيثما كان ذلك مناسبًا. ستصبح فوائد FP واضحة مع نمو قاعدة التعليمات البرمجية الخاصة بك وتصبح أكثر تعقيدًا.

تعليمات سعيدة!


بيان الافراج تم نشر هذه المقالة على: https://dev.to/manjushsh/exploring-functional-programming-in-javascript-3904?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3