٢٥ مارس ٢٠٢١

كود النينجا

التعلم بدون تفكير هو فقدان العمل. الفكر بدون تعلم محفوف بالمخاطر.

Confucius (Analects)

استخدم النينجا المبرمج من الماضي هذه الحيل لشحذ عقل صانعي الكود.

معلمو مراجعة الكود يبحثون عنها في الاختبارت.

يستخدمها المبتدئين أحيانًا بشكل أفضل من مبرمج النينجا.

اقرأها بعناية واكتشف من أنت – نينجا ، مبتدئ ، أو ربما مراجع للكود؟

للسخريه

يحاول الكثيرون اتباع مسارات النينجا. قليل ينجح…

الإيجاز هو روح الطرافة(Brevity is the soul of wit)

اجعل الكود قصيرًا قدر الإمكان. أظهر مدى ذكائك.

دع ميزات اللغة الدقيقة ترشدك.

على سبيل المثال ، ألق نظرة على هذا العامل الثلاثي '?':

// مأخوذة من مكتبة جافا سكريبت معروفة
i = i ? i < 0 ? Math.max(0, len + i) : i : 0;

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

أخبرهم أن الأقصر دائمًا أفضل. استهلهم في مسارات النينجا.

المتغيرات من حرف واحد

داو يخفي في الكلام. فقط داو بدأ بشكل جيد وجيد منجز.

لاوزي (تاو تي تشينج)

هناك طريقة أخرى للكتابه بشكل أسرع وهي استخدام أسماء المتغيرات ذات الحرف الواحد في كل مكان. مثل a, b او c.

يختفي متغير قصير في الكود مثل نينجا حقيقي في الغابة. لن يتمكن أحد من العثور عليه باستخدام “بحث” المحرر. وحتى لو فعل شخص ما ، فلن يتمكن من معرفه معني A او B

… ولكن هناك استثناء. لن يستخدم النينجا الحقيقي أبدًا i كعداد في حلقه "for". في أي مكان ، ولكن ليس هنا. انظر حولك ، هناك العديد من الحروف الغريبة. على سبيل المثال, x او y.

يعتبر المتغير الغريب كعدّاد حلقة رائعًا بشكل خاص إذا كان جسم الحلقة يستغرق 1-2 صفحة (اجعله أطول إذا استطعت). ثم إذا نظر شخص ما بعمق داخل الحلقة ، فلن يتمكن بسرعه من معرفة المتغير المسمى x كعداد للحلقه.

استخدم الاختصارات

إذا كانت قواعد الفريق تمنع استخدام أسماء ذات أحرف واحدة وغامضة – اختصرها ، قم بعمل اختصارات.

مثل هذا:

  • listlst.
  • userAgentua.
  • browserbrsr.
  • …etc

فقط الشخص ذي الحدس الجيد حقًا سيكون قادرًا على فهم هذه الأسماء. حاول تقصير كل شيء. يجب أن يكون الشخص الجدير فقط قادرًا على دعم تطوير التعليمات البرمجية الخاصة بك.

ارتفاع عال. كن مجردة.

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

لاوزي (تاو تي تشينج)

أثناء اختيار اسم ، حاول استخدام الكلمة الأكثر تجريدًا. مثلobj, data, value, item, elem و هكذا.

  • الاسم المثالي للمتغير هو data. استخدمه في كل مكان تستطيع. في الواقع ، كل متغير يحمل data, صحيح؟

    … ولكن ماذا تفعل إذا data تم استخدامه بالفعل؟ جرب value، إنه عالمي أيضًا. بعد كل شيء ، يحصل المتغير في النهاية على value.

  • تسمية متغير حسب نوعه: str, num

    جربهم. قد يتساءل مبتدئ شاب – هل هذه الأسماء مفيدة حقًا للنينجا؟ في الواقع ، هم كذالك!

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

    من السهل معرفة نوع القيمة عن طريق التصحيح. لكن ما معنى المتغير؟ ما السلسلة / الرقم الذي يخزنه؟

    لا توجد طريقة لمعرفة دون تأمل جيد!

  • … ولكن ماذا لو لم يعد هناك مثل هذه الأسماء؟ ما عليك سوى إضافة رقم: data1, item2, elem5

اختبار الانتباه

فقط المبرمج اليقظ حقًا يجب أن يكون قادرًا على فهم كودك. ولكن كيف يمكنك التحقق من ذلك؟

إحدى الطرق – استخدم أسماء متغيرات مماثلة ، مثل date و data.

مزجها حيث يمكنك.

تصبح القراءة السريعة لمثل هذا الرمز مستحيلة. وعندما يكون هناك خطأ مطبعي … أمممم … نحن عالقون لفترة طويلة لشرب الشاي.

المرادفات الذكية

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

Laozi (Tao Te Ching)

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

على سبيل المثال, النظر في البادئات الوظيفية. إذا أظهرت داله رسالة على الشاشة – بدأتها ب display…, مثل displayMessage. ثم إذا ظهرت داله أخرى على الشاشة شيء آخر ، مثل اسم المستخدم, بدأتها ب show… (مثل showName).

افترض أن هناك اختلافًا دقيقًا بين هذه الدوال ، في حين أنه لا يوجد أي منها.

عقد اتفاق مع زملاء النينجا في الفريق: إذا بدأ جون في “إظهار” الدوال مع display... في الكود الخاص بيه, ثم يمكن أن يستخدم بيتر render.., وآن – paint.... لاحظ كم أصبح الكود أكثر إثارة للاهتمام وتنوعًا.

… والآن خدعة القبعة!

من أجل دالتين مع اختلافات مهمة – استخدم نفس البادئة!

على سبيل المثال ، الدالة printPage(page) سيستخدم طابعة. و الدالة printText(text) ستضع النص على الشاشة. دع القارئ غير المألوف يفكر جيدًا في الدالة المسماة بشكل مشابه printMessage: “أين تضع الرسالة؟ إلى طابعة أو على الشاشة؟”. لجعلها حقا تلمع, printMessage(message) يجب إخراجها في النافذة الجديدة!

إعادة استخدام الأسماء

بمجرد تقسيم الكل ، الأجزاء
بحاجة إلى أسماء.
هناك أسماء كافية بالفعل.
يجب على المرء أن يعرف متى يتوقف.

لاوزي (تاو تي تشينج)

أضف متغير جديد فقط عند الضرورة القصوى.

بدلاً من ذلك ، أعد استخدام الأسماء الموجودة. فقط اكتب القيم الجديدة فيها.

في دالة حاول استخدام المتغيرات التي تم تمريرها كمعلمات فقط.

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

من البدائل المتقدمة للنهج استبدال (!) بشكل خفي بالقيمة بشيء مماثل في منتصف حلقة أو دالة.

على سبيل المثال:

function ninjaFunction(elem) {
  // elem عشرون سطر من التعليمات البرمجية تعمل مع

  elem = clone(elem);

  // ! elem عشرون سطر أخرى ، تعمل الآن مع استنساخ
}

سوف يفاجأ أحد المبرمجين الزملاء الذين يرغبون في العمل مع elem في النصف الثاني من الوظيفة … فقط أثناء تصحيح الأخطاء ، بعد فحص الكود سيكتشفون أنهم يعملون مع clone!

ينظر إليها في التعليمات البرمجية بانتظام. فعال للغاية حتى ضد النينجا المتمرسين.

الشرطه السفليه للمتعة

ضع الشرطات السفلية _ و__ قبل أسماء المتغيرات. مثل _name أو __value. سيكون أمرا رائعا لو كنت تعرف معناها فقط. أو ، أفضل ، إضافتها للمتعة فقط ، دون معنى خاص على الإطلاق. أو معاني مختلفة في أماكن مختلفة.

أنت تقتل أرنبين بطلقة واحدة. أولاً ، يصبح الرمز أطول وأقل قابلية للقراءة ، والثاني ، قد يقضي المطور الزميل وقتًا طويلاً في محاولة لمعرفة ما يعنيه الخط السفلي.

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

اظهر حبك

دع الجميع يرون كم هي رائعة كياناتك! أسماء مثل superElement, megaFrame و niceItem سوف تنير القارئ بالتأكيد.

في الواقع ، من جهة ، شيء مكتوب: super.., mega.., nice.. لكن من ناحية أخرى – لا يجلب أي تفاصيل. قد يقرر القارئ البحث عن معنى خفي والتأمل لمدة ساعة أو ساعتين من وقت العمل المدفوع.

تداخل المتغيرات الخارجية

عندما تكون في النور ، لا يمكنك رؤية أي شيء في الظلام.
عندما تكون في الظلام ، يمكنك رؤية كل شيء في الضوء.

Guan Yin Zi

استخدم نفس الأسماء للمتغيرات داخل وخارج الدالة. بسيطة. لا جهود لاختراع أسماء جديدة.

let user = authenticateUser();

function render() {
  let user = anotherValue();
  ...
  ...many lines...
  ...
  ... // <-- مبرمج يريد العمل مع المستخدم هنا و ...
  ...
}

مبرمج يقفز داخل render ربما سيفشل في ملاحظة وجود user محلي تظليل الخارجي.

ثم سيحاولون العمل مع user بافتراض أنه المتغير الخارجي, نتيجة كل هذا authenticateUser()… انتشر الفخ! مرحبا المصحح …

الآثار الجانبية في كل مكان!

هناك دوال تبدو وكأنها لا تغير أي شيء. مثل isReady(), checkPermission(), findTags()… ويفترض أنهم يقومون بإجراء الحسابات والعثور على البيانات وإعادتها دون تغيير أي شيء خارجها. وبعبارة أخرى ، بدون “آثار جانبية”.

خدعة جميلة حقًا هي إضافة إجراء “مفيد” لهم ، إلى جانب المهمة الرئيسية.

تعبير عن المفاجأة المذهلة على وجه زميلك عندما يرون وظيفة مسماة is.., check.. أو find... تغيير شيء – سيوسع بالتأكيد حدودك العقلانية.

طريقة أخرى للمفاجأة هي إرجاع نتيجة غير قياسية.

أظهر تفكيرك الأصلي! دع استدعاء checkPermission لا يسترجع true/false, ولكن كائن معقد مع نتائج الشيك.

هؤلاء المطورين الذين يحاولون الكتابة if (checkPermission(..)), سوف يتساءل لماذا لا يعمل. قل لهم: “اقرأ المستندات!”. وتعطي هذه المقالة.

دوال قوية!

يتدفق Tao العظيم في كل مكان ،
إلى اليسار وإلى اليمين.

لاوزي (تاو تي تشينج)

لا تحد من الدالة بما هو مكتوب باسمها. كن أوسع.

على سبيل المثال ، الدالة validateEmail(email) يمكن (إلى جانب التحقق من صحة البريد الإلكتروني) إظهار رسالة خطأ وطلب إعادة إدخال البريد الإلكتروني.

يجب ألا تكون الإجراءات الإضافية واضحة من اسم الوظيفة. مبرمج النينجا الحقيقي سيجعلهم غير واضحين من الكود كذلك.

يؤدي ضم العديد من الإجراءات إلى إجراء واحد إلى حماية كودك من إعادة الاستخدام.

تخيل ، مطور آخر يريد فقط التحقق من البريد الإلكتروني ، وليس إخراج أي رسالة. وظيفتك validateEmail(email) أن كلاهما لن يناسبهما. لذلك لن يكسروا تأملكم بسؤال أي شيء عنه.

ملخص

جميع “النصائح” الواردة أعلاه مستمدة من الكود الحقيقي … وأحيانًا يكتبها مطورون متمرسون. ربما أكثر خبرة منك ؛)

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

التعليقات

إقرأ هذا قبل أن تضع تعليقًا…
  • إذا كان لديك اقتراحات أو تريد تحسينًا - من فضلك من فضلك إفتح موضوعًا فى جيتهاب أو شارك بنفسك بدلًا من التعليقات.
  • إذا لم تستطع أن تفهم شيئّا فى المقال - وضّح ماهو.
  • إذا كنت تريد عرض كود استخدم عنصر <code> ، وللكثير من السطور استخدم <pre>، ولأكثر من 10 سطور استخدم (plnkr, JSBin, codepen…)