اذهب إلى المحتوى
  • 0

ما المقصود بتقنية الـ Currying وما هي الـ currying function؟

منتصر احمد

السؤال

Recommended Posts

  • 0

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

function(a , b , c)

قابلة للإستدعاء كـ: 

function(a)(b)(c)

ويقتضي هذا اعادة دالة من داخل دالة للحصول على هذا النوع من التسلسل. فالدالة الأولى تقوم بإستقبال المعامل a وتعالجه ثم تعيد الوظيفة التي تأخذ المعامل الثاني b وهكذا.  أي أنه يعني ببساطة تحويل الوظائف والدوال ذات الوسيطات (المعاملات) المتعددة وتحليلها في سلسلة من الوظائف ذات معامل واحد.

لاحظ المثال: 

الدالة التالية تقوم بحساب مساحة مكعب نعطي أبعاده.

function calculateVolume(length, breadth, height) {
   return length * breadth * height;
}

console.log(calculateVolume(4, 5, 6));

يمكن كتابة هاته الدالة بتقنية currying كـ: 

function calculateVolume(length) {
     return function (breadth) {
          return function (height) {
               return length * breadth * height;
          }
     }
}
console.log(calculateVolume(4)(5)(6));

أو: 

function calculateVolume(length) {
     return (breadth) => {
          return (height) => {
               return length * breadth * height;
          }
     }
}
console.log(calculateVolume(4)(5)(6));

السبب في خلق النوع من التسلسل هو الحاجة الى الحصول على دوال جزئية بسهولة. فأنت لست مرغما على تمرير كامل المعاملات مرة واحدة بل سيكفي تمرير كل معامل عند توفره. مثال: نمرر المعامل length في مكان ونحفظ خرج الوظيفة ثم بعد توفر المعامل breadth نمرره ونحفظ الخرج ثم ان توفر المعامل height نمرره ثم نطبع الخرج.

أي انه هاته الوظيفة ستعيد:

  • اما دالة جزئية جديدة في حالة لم يكن عدد الوسطاء (المعاملات) كافيا 
  • أو تعيد النتيجة النهائية ان كان عدد الوسطاء كافيا. 

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

مثال واقعي: 

// دالة حساب السعر النهائي انطلاقا من سعر المنتج مضافا اليه العمولة ومطبقا عليه الخصم
function getFinalPrice(actualPrice, charges, discountRate) {
    var finalPrice;
 
    finalPrice = actualPrice + charges - (actualPrice * discountRate/100);

    return finalPrice;
}
function getFinalPrice(actualPrice) {
         return (charges) => {
              return (discountRate) => {
                  return actualPrice + charges - (actualPrice * discountRate/100);
              }
         }
}

console.log(getFinalPrice(100)(25)(12))

فان استوفت الوظيفة كامل معاملاتها، ستعيد لك خرجا يعبر عن السعر النهائي. وإن لم تستوف فإنها ستعيد دالة جزئية قابلة للإستدعاء مجددا callable. ولن يهم الخرج النهائي ولا المتغيرات الخارجية ان كنت ستقوم مستقبلا بتقليل كامل نسب الخصومات بغض النظر عنها بـ 1% أو ان كنت ستضيف 10$ على كل عملية شراء مهما كانت عمولتها الأصلية أو أي كان. 

فيما يلي مقالة مفصلة حول الموضوع: تقنية Currying في جافاسكربت

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 2 دقائق مضت قال Adnane Kadri:

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


function(a , b , c)

قابلة للإستدعاء كـ: 


function(a)(b)(c)

ويقتضي هذا اعادة دالة من داخل دالة للحصول على هذا النوع من التسلسل. فالدالة الأولى تقوم بإستقبال المعامل a وتعالجه ثم تعيد الوظيفة التي تأخذ المعامل الثاني b وهكذا.  أي أنه يعني ببساطة تحويل الوظائف والدوال ذات الوسيطات (المعاملات) المتعددة وتحليلها في سلسلة من الوظائف ذات معامل واحد.

لاحظ المثال: 

الدالة التالية تقوم بحساب مساحة مكعب نعطي أبعاده.


function calculateVolume(length, breadth, height) {
   return length * breadth * height;
}

console.log(calculateVolume(4, 5, 6));

يمكن كتابة هاته الدالة بتقنية currying كـ: 


function calculateVolume(length) {
     return function (breadth) {
          return function (height) {
               return length * breadth * height;
          }
     }
}
console.log(calculateVolume(4)(5)(6));

أو: 


function calculateVolume(length) {
     return (breadth) => {
          return (height) => {
               return length * breadth * height;
          }
     }
}
console.log(calculateVolume(4)(5)(6));

السبب في خلق النوع من التسلسل هو الحاجة الى الحصول على دوال جزئية بسهولة. فأنت لست مرغما على تمرير كامل المعاملات مرة واحدة بل سيكفي تمرير كل معامل عند توفره. مثال: نمرر المعامل length في مكان ونحفظ خرج الوظيفة ثم بعد توفر المعامل breadth نمرره ونحفظ الخرج ثم ان توفر المعامل height نمرره ثم نطبع الخرج.

أي انه هاته الوظيفة ستعيد:

  • اما دالة جزئية جديدة في حالة لم يكن عدد الوسطاء (المعاملات) كافيا 
  • أو تعيد النتيجة النهائية ان كان عدد الوسطاء كافيا. 

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

مثال واقعي: 


function getFinalPrice(actualPrice, charges, discountRate) {
    var finalPrice;
 
    finalPrice = actualPrice + charges - (actualPrice * discountRate/100);

    return finalPrice;
}

function getFinalPrice(actualPrice) {
         return (charges) => {
              return (discountRate) => {
                  return actualPrice + charges - (actualPrice * discountRate/100);
              }
         }
}

console.log(getFinalPrice(100)(25)(12))

فان استوفت الوظيفة كامل معاملاتها، ستعيد لك خرجا يعبر عن السعر النهائي. وإن لم تستوف فإنها ستعيد دالة جزئية قابلة للإستدعاء مجددا callable. ولن يهم الخرج النهائي ولا المتغيرات الخارجية ان كنت ستقوم مستقبلا بتقليل كامل نسب الخصومات بغض النظر عنها بـ 1% أو ان كنت ستضيف 10$ على كل عملية شراء مهما كانت عمولتها الأصلية أو أي كان. 

فيما يلي مقالة مفصلة حول الموضوع: تقنية Currying في جافاسكربت

متي استخدمها

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 2 دقائق مضت قال Mohamed Montaser3:

متي استخدمها

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

لاحظ المثال المرفق آخر الإجابة:

بتاريخ 5 دقائق مضت قال Adnane Kadri:

مثال واقعي: 


// دالة حساب السعر النهائي انطلاقا من سعر المنتج مضافا اليه العمولة ومطبقا عليه الخصم
function getFinalPrice(actualPrice, charges, discountRate) {
    var finalPrice;
 
    finalPrice = actualPrice + charges - (actualPrice * discountRate/100);

    return finalPrice;
}

function getFinalPrice(actualPrice) {
         return (charges) => {
              return (discountRate) => {
                  return actualPrice + charges - (actualPrice * discountRate/100);
              }
         }
}

console.log(getFinalPrice(100)(25)(12))

فان استوفت الوظيفة كامل معاملاتها، ستعيد لك خرجا يعبر عن السعر النهائي. وإن لم تستوف فإنها ستعيد دالة جزئية قابلة للإستدعاء مجددا callable. ولن يهم الخرج النهائي ولا المتغيرات الخارجية ان كنت ستقوم مستقبلا بتقليل كامل نسب الخصومات بغض النظر عنها بـ 1% أو ان كنت ستضيف 10$ على كل عملية شراء مهما كانت عمولتها الأصلية أو أي كان.

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...