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