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

جافا سكريبت الكاري

تم النشر بتاريخ 2024-08-07
تصفح:101

JavaScript Currying

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

ما هو الكاري؟

الكاري هو عملية تحويل دالة تأخذ وسائط متعددة إلى سلسلة من الوظائف التي تأخذ كل منها وسيطة واحدة. على سبيل المثال، يمكن تحويل الدالة f(a, b, c) إلى f(a)(b)(c).

لماذا استخدام الكاري؟

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

مثال بسيط للكاري

لنبدأ بمثال أساسي لفهم كيفية عمل الكاري.

وظيفة غير متجانسة

إليك وظيفة بسيطة تضيف ثلاثة أرقام:

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

console.log(add(1, 2, 3)); // Output: 6

شرح: هذه الدالة المضافة تأخذ ثلاث وسيطات a، b، وc، وترجع مجموعها. عندما نستدعي add(1,2,3) فإنه يُرجع 6.


وظيفة الكاري

الآن، دعونا نحول هذه الوظيفة إلى إصدار الكاري:

function curryAdd(a) {
  return function(b) {
    return function(c) {
      return a   b   c;
    };
  };
}

console.log(curryAdd(1)(2)(3)); // Output: 6

شرح: تأخذ الدالة curryAdd وسيطة a وترجع دالة تأخذ وسيطة b، والتي بدورها ترجع دالة تأخذ وسيطة c. ترجع الدالة النهائية مجموع a وb وc. عندما نستدعي curryAdd(1)(2)(3)، فإنه يمرر الوسيطات 1 و2 و3 بشكل تسلسلي عبر الدوال المتداخلة، مما يؤدي إلى 6.

الكاري مع وظائف السهم

توفر وظائف الأسهم في JavaScript طريقة مختصرة لإنشاء وظائف متجانسة.

const curryAddArrow = a => b => c => a   b   c;

console.log(curryAddArrow(1)(2)(3)); // Output: 6

شرح: الدالة curryAddArrow هي دالة سهم تأخذ وسيطة a وترجع دالة سهم أخرى تأخذ b، والتي ترجع دالة سهم أخرى تأخذ وسيطة c. تقوم دالة السهم النهائية بإرجاع مجموع a وb وc. عندما نستدعي curryAddArrow(1)(2)(3)، فإنه يمرر الوسيطات 1 و2 و3 بشكل تسلسلي عبر وظائف الأسهم المتداخلة، مما يؤدي إلى 6.


حالة الاستخدام

1. وظائف التكوين

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

function logger(level) {
  return function (message) {
    console.log(`[${level}] ${message}`);
  };
}

const infoLogger = logger('INFO');
const errorLogger = logger('ERROR');

infoLogger('This is an info message');
errorLogger('This is an error message');

2. منسق السلسلة

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

function formatter(prefix) {
  return function (suffix) {
    return function (str) {
      return `${prefix}${str}${suffix}`;
    };
  };
}

const htmlFormatter = formatter('')('');
console.log(htmlFormatter('Hello')); // Hello

const parensFormatter = formatter('(')(')');
console.log(parensFormatter('123')); // (123)

الكاري في مكتبات جافا سكريبت الحديثة

يشيع استخدام الكاري في مكتبات JavaScript الحديثة مثل Lodash وRamda. على سبيل المثال، في Lodash، يمكنك استخدام طريقة _.curry لإنشاء وظائف الكاري بسهولة.

const _ = require('lodash');

function multiply(a, b, c) {
  return a * b * c;
}

const curriedMultiply = _.curry(multiply);

console.log(curriedMultiply(2)(3)(4)); // 24
console.log(curriedMultiply(2, 3)(4)); // 24

الكاري مع الحجج N

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

function curryAddition(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn(...args);
    } else {
      return function(...nextArgs) {
        return curried(...args, ...nextArgs);
      };
    }
  };
}

// This function sums an array of numbers
function add(...nums) {
  return nums.reduce((acc, num) => acc   num, 0);
}

// Creating a curried version of the addition function
const curriedAdd = curryAddition(add);

// Function to handle n arguments
function curriedAddN(...initialArgs) {
  function adder(...args) {
    if (args.length === 0) {
      return curriedAdd(...initialArgs);
    }
    initialArgs.push(...args);
    return adder;
  }
  return adder;
}

// Examples
const addFiveNumbers = curriedAddN();
console.log(addFiveNumbers(1)(2)(3)(4)(5)()); // 15

const addThreeNumbers = curriedAddN(1)(2)(3);
console.log(addThreeNumbers()); // 6

const addNumbersInSteps = curriedAddN(1, 2)(3)(4, 5);
console.log(addNumbersInSteps()); // 15

خاتمة

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

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

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

Copyright© 2022 湘ICP备2022001581号-3