* عبارة meme من لعبة Skyrim
إذا كنت لا تزال لا تستخدم وظائف الأسهم ، فلا تلوم نفسك - فهذه وظيفة والديك ؛ بدلاً من ذلك ، فكر في الفوائد التي يمكنك الحصول عليها من استخدامها كطالب مجتهد. اليوم تتم كتابة كل شفراتي باستخدام وظائف السهم.
هذا مثال على نفس الكود ، مكتوبًا بالأسلوب التقليدي أيضًا:
const arrowFunction = (arg1, arg2) => arg1 + arg 2;
const traditionalFunction = function(arg1, arg2) {
return arg1 + arg2;
};
قد تلاحظ أن الكود أقصر بكثير عند كتابته باستخدام وظيفة السهم. كل ما يكتب قبل السهم هو الوسيطات ، وبعد السهم يكون النتيجة المرجعة.
إذا كنت بحاجة إلى وظيفة تحتوي على إجراءات متعددة ، فيمكنك كتابتها على النحو التالي:
const arrowFunction = (arg1, arg2) => {
const result = arg1 + arg2;
return result;
};
غالبًا ما يشار إلى وظائف Arrow باسم وظائف lambda ، ولا يتم استخدامها فقط في JavaScript. تعد Python مثالًا جيدًا على الأماكن التي يمكن العثور فيها أيضًا على وظائف lambda.
في لغة بايثون ، يكون تركيبها كما يلي:
lambdaFunction = lambda a, b : a + b
تبسيط
يحفزك استخدام وظائف الأسهم على تبسيط التعليمات البرمجية وفقًا لمبدأ KISS (Keep-it-simple-stupid) ومبدأ المسؤولية الفردية (كل وظيفة مسؤولة عن إجراء واحد محدد فقط).
بشكل عام ، أكتبها بدون أقواس معقوفة {}. إذا كانت إحدى الوظائف صعبة القراءة أو كنت بحاجة إلى استخدام عدة تعبيرات فيها ، أنصحك بتقسيمها إلى عدة تعبيرات أصغر.
هذا الرمز أسهل في الكتابة ، وأسهل في إعادة الاستخدام والاختبار. أيضًا ، يمكن إعطاء الوظائف أسماء وصفية أكثر لتمثيل العمل الذي يقومون به بدقة.
وظائف من الدرجة الأولى
JavaScript له وظائف من الدرجة الأولى. هذه هي الوظائف التي يتم استخدامها مثل المتغيرات العادية. يمكنهم العمل كوسيطات لوظائف أخرى أو إعادتها كنتيجة. مثال على الأرجح تعرفه:
document.querySelector('#myButton').addEventListner('click', function() {
alert('click happened');
});
الموضح هنا هو دالة مجهولة تم تمريرها كوسيطة لإضافةEventListener. غالبًا ما تُستخدم هذه الطريقة في Javascript لردود النداء.
يختلف مثال إرجاع دالة - كما هو موضح أدناه:
const myFirstClassFunction = function(a) {
return function(b) {
return a + b;
};
};
myFirstClassFunction(1)(2); // => 3
ومع ذلك ، مع وظيفة السهم ، يبدو كل شيء أكثر نظافة:
const myFirstClassArrow = a => b => a + b;
myFirstClassArrow(1)(2); // => 3
كل شيء هنا بسيط: ما كتب قبل السهم الأخير هو الوسيطات ، وبعده الحساب. في الواقع ، نحن نعمل بعدة وظائف ، ويمكننا أيضًا استخدام مكالمات متعددة fn (call1) (call2) ؛
تطبيق جزئي
يمكنك البدء في استخدام وظائف الأسهم لتكوين وظائف قابلة للتطبيق جزئيًا ، مثل مكعبات Lego. سيسمح لك هذا بإنشاء وظائف خاصة عن طريق تمرير وسيطات محددة إليها. دعنا نقسمها في المثال أدناه:
const add = a => b => a + b;
const increaseCounter = counter => add(1)(counter);
increaseCounter(5); // => 6
const pointFreeIncreaseCounter = add(1);
pointFreeIncreaseCounter(5); // => 6
يشبه هذا استخدام الوظائف ذات المتغيرات الافتراضية ، لكن التطبيق الجزئي يمنح المزيد من المرونة.
تسمى هذه الوظائف بالكاري. إنها سلسلة من الوظائف الأحادية والوظائف الأحادية الشائعة في البرمجة الوظيفية.
البرمجة الوظيفية
كما قد تكون خمنت ، السبب الرئيسي لوظائف السهم هو البرمجة الوظيفية. إنه نموذج نمط تصريحي يعتمد على تكوين وظائف بسيطة.
تعد البرمجة الوظيفية بديلاً عن OOP الذي يفضله العديد من المطورين (بما في ذلك مؤلف المقال). يمكنك المجادلة حول أي أسلوب ، لكنني أعتقد أن البرمجة الوظيفية رائعة ويجب أن تشعر بعدم الارتياح بمجرد التفكير في أنك فكرت بطريقة مختلفة.
تعتمد الوظائف البحتة فقط على المدخلات وتعيد دائمًا بعض القيمة. لا يغيرون (يغيروا) المتغيرات الأخرى ولا يعتمدون على البيانات الخارجية خارج قيم الإدخال. هذا يؤدي إلى الشفافية المرجعية ، مما يجعل البرمجة أسهل.
ونعم ، من الممكن دائمًا كتابة كمية كبيرة من التعليمات البرمجية دون تغيير متغير واحد.
كما ترى ، تم تصميم وظائف الأسهم لتحويل البيانات بين الإدخال والإخراج. لا يحتاجون حتى إلى إرجاع تعبير مختزل بدون دعامات مجعدة.
وظائف السهم - الخاتمة
تعمل وظائف الأسهم على جعل بناء الجملة أقصر ، مما يقلل من وقت كتابة التعليمات البرمجية وقراءتها واختبارها ، وتبسيطها. فكر في الأمر ، لأنك على الأرجح مطور متقدم ، واستخدام هذه النصائح سيجعلك أكثر تقدمًا ويزيد من ملاءمتك. البرمجة الوظيفية رائعة حقًا. يحولك إلى فنان يجعل وظائف قصيرة أنيقة خارج الكود.
مثال وظيفي حقيقي
لفهم ما هو مخفي في حفرة الأرانب ، دعنا نلقي نظرة على مثال لاستخدام مكتبة مفتوحة المصدر @ 7urtle / lambda
import {trim, upperCaseOf, lengthOf, lastLetterOf, includes, compose} from '@7urtle/lambda';
const endsWithPunctuation = input =>
includes(lastLetterOf(input))('.?,!');
const replacePunctuationWithExclamation = input =>
substr(lengthOf(input) - 1)(0)(input) + '!';
const addExclamationMark = input =>
endsWithPunctuation(input)
? replacePunctuationWithExclamation(input)
: input + '!';
const shout = compose(addExclamationMark, upperCaseOf, trim);
shout(" Don't forget to feed the turtle.");
// => !
استخدام وظائف السهم وتعلم البرمجة الوظيفية يسبب الإدمان للغاية. يتيح لك ذلك كتابة رمز أقصر بأداء أفضل وإمكانية إعادة الاستخدام.
يمكن أن يكون JavaScript خادعًا في عدم تناسقه بين استخدام بناء جملة مثل C وميزات البرمجة الوظيفية. لمساعدة الناس على الفهم بشكل أفضل وتوفير الوصول إلى المواد التعليمية ، قمت بتطوير مكتبة @ 7urtle / lambda. يمكنك إتقان البرمجة الوظيفية وفقًا لسرعتك الخاصة وسيساعدك موقع www.7urtle.com على تعلم هذا النموذج من خلال تزويدك بجميع الأدوات التي تحتاجها.