ما هي وظائف نقية في جافا سكريبت؟

وظائف نقية هي اللبنات الأساسية في البرمجة الوظيفية. وهم معشوقون بالبساطة والقابلية للاختبار.

في هذه المقالة ، ستجد قائمة تحقق تساعد في تحديد ما إذا كانت الوظيفة نقية أم لا.

الصورة

تحقق من القائمة


يجب أن تفي الوظيفة بشرطين لكي تعتبر "نقية":

- في كل مرة تُرجع الدالة نفس النتيجة عندما يتم استدعاؤها بنفس مجموعة الوسائط

- لا توجد آثار جانبية

دعنا نفكر بمزيد من التفاصيل.

1. نفس الإدخال => نفس الإخراج


قارن هذا:

const add = (x, y) => x + y; add(2, 4); // 6 

مع هذا:

 let x = 2; const add = (y) => { x += y; }; add(4); // x === 6 (the first time) 

في الحالة الأولى ، يتم إرجاع القيمة بناءً على المعلمات المحددة ، بغض النظر عن المكان / عند الاتصال به.

إذا أضفت 2 و 4 ، فستحصل دائمًا على 6.

لا شيء يؤثر على النتيجة.

وظائف النجاسة = نتائج غير متناسقة

المثال الثاني بإرجاع أي شيء. يعتمد على الحالة العامة للقيام بعمله عن طريق زيادة المتغير خارج مجال عمله.

هذا النموذج هو كابوس للمطورين.

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

أيهما أفضل؟

في هذه الحالة ، سوف تحصل على عدد أقل من الأخطاء التي تظهر فقط في ظل ظروف معينة؟

في هذه الحالة ، من المحتمل أن تنجح في بيئة متعددة الخيوط حيث يمكن للتبعيات الزمنية كسر النظام؟

بالتأكيد في الأول.

2. لا آثار جانبية


الصورة

هذا الاختبار هو قائمة مرجعية في حد ذاته.

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

  1. تعديل معلمات الإدخال
  2. console.log
  3. مكالمات HTTP (AJAX / fetch)
  4. تغيير نظام الملفات
  5. طلبات دوم

في الواقع ، لا يرتبط أي عمل تقوم به دالة بحساب النتيجة النهائية.

أنصحك بمشاهدة فيديو بوب مارتن.

هذه وظيفة "قذرة" لها تأثير جانبي.

 const impureDouble = (x) => { console.log('doubling', x); return x * 2; }; const result = impureDouble(4); console.log({ result }); 

console.log هنا هو تأثير جانبي ، لكنه لن يضر. سنستمر في الحصول على نفس النتائج ، بالنظر إلى البيانات نفسها.

ومع ذلك ، هذا يمكن أن يسبب مشاكل.

تغيير كائن "النجاسة"

 const impureAssoc = (key, value, object) => { object[key] = value; }; const person = { name: 'Bobo' }; const result = impureAssoc('shoeSize', 400, person); console.log({ person, result }); 

تم تغيير متغير الشخص إلى الأبد لأنه تم الإعلان عن الوظيفة من خلال بيان مهمة.

الحالة المشتركة تعني أن تأثير impureAssoc لم يعد واضحًا تمامًا. يشمل فهم التأثير على النظام الآن تتبع كل متغير لم يسبق له مثيل ولمعرفة تاريخه.

الدولة المشتركة = تبعيات الوقت.

يمكننا مسح impureAssoc ببساطة عن طريق إعادة كائن جديد مع الخصائص المطلوبة.

"نقوم بتنظيفه"

 const pureAssoc = (key, value, object) => ({ ...object, [key]: value }); const person = { name: 'Bobo' }; const result = pureAssoc('shoeSize', 400, person); console.log({ person, result }); 

تقوم PureAssoc الآن بإرجاع نتيجة الاختبار ، لذلك لا داعي للقلق إذا تغيرت في مكان آخر.

يمكن القيام به مثل هذا:

 const pureAssoc = (key, value, object) => { const newObject = { ...object }; newObject[key] = value; return newObject; }; const person = { name: 'Bobo' }; const result = pureAssoc('shoeSize', 400, person); console.log({ person, result }); 

قد يكون تغيير الإدخال خطيرًا ، ولكن تغيير النسخة ليس مشكلة. والنتيجة النهائية هي وظيفة قابلة للاختبار ويمكن التنبؤ بها تعمل بغض النظر عن المكان والزمان.

تقتصر التغييرات على هذه المساحة الصغيرة ، وما زلت تعيد القيمة.

ملخص

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

Source: https://habr.com/ru/post/ar437512/


All Articles