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

الدوال الصرفة هي وظائف لا تنتج آثارًا جانبية ، وعند استدعائها باستخدام نفس معلمات الإدخال ، ستُرجع دائمًا نفس المخرجات.

يمكنك استخدام وظائف خالصة للتأكد من أن التعليمات البرمجية الخاصة بك نظيفة وقابلة للصيانة والاختبار. هذه الوظائف مثالية لهذه المهام لأنها يمكن التنبؤ بها ولا تعدل الحالات الخارجية.

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

خصائص الوظيفة النقية

ل وظيفة لكي تكون "نقية" ، يجب أن تفي ببعض المتطلبات.

قيمة العائد الثابت

يجب أن تُرجع الدالة الصرفة دائمًا نفس القيمة مع إعطاء نفس المدخلات ، بصرف النظر عن عدد مرات استدعائها.

على سبيل المثال ، ضع في اعتبارك الوظيفة أدناه:

وظيفةتتضاعف(أ ، ب) {
يعود أ * ب ؛
}

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

سيؤدي استدعاء هذه الوظيفة عدة مرات باستخدام نفس الوسيطات إلى الحصول على نفس الإخراج في كل مرة. على سبيل المثال:

instagram viewer
تتضاعف(2, 3); // يُرجع 6
تتضاعف(2, 3); // يُرجع 6
تتضاعف(2, 3); // يُرجع 6

بدلاً من ذلك ، ضع في اعتبارك المثال أدناه:

وظيفةمضاعفة العدد العشوائي(الأس) {
يعود عدد * رياضيات.أرضية(رياضيات.عشوائي() * 10);
}

مضاعف RandomNumber (5); // نتائج غير متوقعة
مضاعف RandomNumber (5); // نتائج غير متوقعة
مضاعف RandomNumber (5); // نتائج غير متوقعة

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

أي آثار جانبية

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

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

على سبيل المثال ، ضع في اعتبارك المثال أدناه:

يترك العد = 0;

وظيفةزيادة راتب() {
العد ++ ؛
وحدة التحكم.log (عدد) ؛
}

زيادة راتب()؛ // السجلات 1
زيادة راتب()؛ // السجلات 2
زيادة راتب()؛ // السجلات 3

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

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

مثل ذلك:

وظيفةزيادة راتب(عدد) {
يعود العد + 1;
}

زيادة راتب(1); // يُرجع 2
زيادة راتب(1); // يُرجع 2
زيادة راتب(1); // يُرجع 2

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

مميزات وخصائص اخرى

بالإضافة إلى وجود قيمة عائد ثابتة وعدم حدوث أي آثار جانبية ، يجب عليك الالتزام بالقواعد التالية عندما تكون كذلك إنشاء وظيفة JavaScript أن تكون نقيًا:

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

مزايا الوظائف البحتة

الوظائف الصرفة لها فوائد معينة على الوظائف غير النقية ، وبعضها يتضمن ما يلي.

قابلية الاختبار

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

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

Memoization

نظرًا لأن الوظائف الصافية تنتج دائمًا نفس المخرجات لنفس المدخلات ولا تنتج أي آثار جانبية ، يمكنك بسهولة حفظها.

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

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

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

التزامن

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

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

وظائف نقية مقابل. وظائف غير نقية

يمكنك كتابة برامج باستخدام مجموعة من الوظائف النقية وغير النقية ، لأن لكل نوع استخداماته.

من السهل تحسين الوظائف البحتة واختبارها ومواءمتها ، مما يجعلها مناسبة لحالات الاستخدام مثل البرمجة الوظيفية والتخزين المؤقت والاختبار والبرمجة المتوازية ومهام معالجة البيانات.

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