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