البرمجة الوظيفية هي نموذج برمجي يتعامل مع الحساب باعتباره تقييمًا للوظائف الرياضية. إنه يتجنب تغيير الحالة والبيانات القابلة للتغيير. الفكرة الأساسية هي بناء برامج باستخدام وظائف خالصة، وتجنب الآثار الجانبية، والعمل مع هياكل البيانات غير القابلة للتغيير.
تشمل الخصائص الرئيسية للبرمجة الوظيفية ما يلي:
دعونا نستكشف بعض أهم المفاهيم التي تحدد FP في JavaScript.
الوظيفة النقية هي التي لا تسبب آثارًا جانبية، أي أنها لا تعدل أي حالة خارجية. يعتمد ذلك فقط على معلمات الإدخال الخاصة به، ونظرًا لنفس الإدخال، فإنه سيُرجع دائمًا نفس الإخراج.
مثال:
// Pure function example function add(a, b) { return a b; } add(2, 3); // Always returns 5
الوظيفة الخالصة لها العديد من المزايا:
الثبات يعني أنه بمجرد إنشاء متغير أو كائن، لا يمكن تعديله. بدلاً من ذلك، إذا كنت بحاجة إلى تغيير شيء ما، يمكنك إنشاء مثيل جديد.
مثال:
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 }
من خلال الحفاظ على البيانات غير قابلة للتغيير، يمكنك تقليل مخاطر الآثار الجانبية غير المقصودة، وخاصة في التطبيقات المعقدة.
في JavaScript، تعتبر الوظائف مواطنة من الدرجة الأولى. هذا يعني أنه يمكن تعيين الدوال إلى متغيرات، وتمريرها كوسيطات إلى دوال أخرى، وإرجاعها من الدوال. هذه الخاصية هي المفتاح للبرمجة الوظيفية.
مثال:
const greet = function(name) { return `Hello, ${name}!`; }; console.log(greet("Bob")); // "Hello, Bob!"
الوظائف ذات الترتيب الأعلى هي تلك التي تأخذ وظائف أخرى كوسائط أو ترجعها. إنها حجر الزاوية في البرمجة الوظيفية وتسمح بقدر أكبر من المرونة وإعادة استخدام التعليمات البرمجية.
مثال:
// 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 أمثلة مدمجة لوظائف ذات ترتيب أعلى تساعد في البرمجة الوظيفية.
التركيب الوظيفي هو عملية دمج وظائف متعددة في وظيفة واحدة. يتيح لنا ذلك إنشاء سلسلة من العمليات، حيث يصبح مخرجات إحدى الوظائف مدخلاً للوظيفة التالية.
مثال:
const multiplyByTwo = (x) => x * 2; const addFive = (x) => x 5; const multiplyAndAdd = (x) => addFive(multiplyByTwo(x)); console.log(multiplyAndAdd(5)); // 15
يعد تكوين الوظيفة تقنية قوية لإنشاء تعليمات برمجية قابلة لإعادة الاستخدام وقابلة للصيانة.
الكاري هو أسلوب تحويل دالة تأخذ وسائط متعددة إلى سلسلة من الوظائف التي تأخذ كل منها وسيطة واحدة. إنها مفيدة بشكل خاص لإنشاء وظائف قابلة لإعادة الاستخدام ومطبقة جزئيًا.
مثال:
function add(a) { return function(b) { return a b; }; } const addFive = add(5); console.log(addFive(3)); // 8
تتيح لك هذه التقنية إنشاء وظائف متخصصة دون الحاجة إلى إعادة كتابة المنطق.
Recursion هو أسلوب برمجة وظيفي آخر حيث تستدعي الوظيفة نفسها لحل نسخة أصغر من نفس المشكلة. يُستخدم هذا غالبًا كبديل للحلقات في FP، حيث تتضمن الحلقات حالة قابلة للتغيير (والتي تحاول البرمجة الوظيفية تجنبها).
مثال:
function factorial(n) { if (n === 0) return 1; return n * factorial(n - 1); } console.log(factorial(5)); // 120
يمكّنك Recursion من كتابة تعليمات برمجية أكثر وضوحًا وأكثر قابلية للقراءة للمهام التي يمكن تقسيمها إلى مشكلات فرعية أصغر.
تحدث التأثيرات الجانبية عندما تقوم إحدى الوظائف بتعديل بعض الحالات الخارجية (مثل تغيير متغير عام أو التفاعل مع 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 فوائد عديدة:
بينما تتمتع JavaScript بدعم من الدرجة الأولى للبرمجة الوظيفية، يمكن للمكتبات تحسين قدرتك على كتابة التعليمات البرمجية الوظيفية. تشمل بعض المكتبات الشائعة ما يلي:
مثال:
const _ = require('lodash/fp'); const add = (a, b) => a b; const curriedAdd = _.curry(add); console.log(curriedAdd(1)(2)); // 3
مثال:
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
مثال:
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 واضحة مع نمو قاعدة التعليمات البرمجية الخاصة بك وتصبح أكثر تعقيدًا.
تعليمات سعيدة!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3