مراجعة الكود في JavaScript: ما يجب التحقق منه وكيفية تقديم الملاحظات عمليًا

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا مراجعة الكود ليست مجرد "إيجاد الأخطاء"

\n

مراجعة الكود (Code review) ليست مجرد إجراء شكلي أو وسيلة لإيجاد الأخطاء المطبعية. في التطوير الحديث باستخدام JavaScript و Node.js، تعتبر الأداة الرئيسية للحفاظ على جودة الكود، وتبادل المعرفة في الفريق، ومنع الديون التقنية. ومع ذلك، يختصر العديد من المطورين المراجعة في فحص بناء الجملة، متجاهلين المشكلات المعمارية والأداء وقابلية القراءة.

\n

في هذه المقالة، سنشرح ما الذي يجب التحقق منه بالضبط في كود JavaScript (باستخدام Node.js كمثال)، وكيفية تقديم الملاحظات بطريقة لا تسيء إلى زميلك بل تساعده على النمو. ستساعد الأمثلة العملية للكود في ترسيخ المادة.

\n\n

1. ما يجب التحقق منه في كود JavaScript: قائمة مراجعة عملية

\n

لنبدأ بنقاط التحقق المحددة. سنقسمها إلى ثلاثة مستويات: بناء الجملة/الأسلوب، المنطق/الأمان، والهندسة المعمارية.

\n\n

1.1. أسلوب الكود والتنسيق

\n

الأمر بسيط هنا: استخدم أداة التحليل (ESLint) وأداة التنسيق (Prettier). لا ينبغي أن تكون هناك خلافات حول المسافات في المراجعة. قم بإعداد الإعدادات في المشروع مرة واحدة. تحقق من:

\n
    \n
  • أن الكود يتوافق مع قواعد eslint-config-airbnb أو إعداداتك المخصصة.
  • \n
  • عدم وجود console.log زائدة (إذا لم يكن وضع التطوير).
  • \n
  • أن أسماء المتغيرات ذات معنى: const userData وليس const x.
  • \n
\n\n

1.2. منطق العمل مع عدم التزامن (Promise, async/await)

\n

هذه منطقة شائعة للأخطاء في Node.js. تحقق من:

\n
    \n
  • معالجة الأخطاء في الدوال غير المتزامنة. عدم وجود try/catch قد يؤدي إلى تعطل العملية.
  • \n
  • الاستخدام الصحيح لـ await داخل الحلقات. إذا كانت المهام لا تعتمد على بعضها البعض، استخدم Promise.all.
  • \n
\n

سيء:

\n
// تنفيذ تسلسلي على الرغم من إمكانية التوازي\nconst results = [];\nfor (const id of ids) {\n  const data = await fetchData(id); // ننتظر كل طلب\n  results.push(data);\n}\n
\n

جيد:

\n
// تنفيذ متوازي\nconst promises = ids.map(id => fetchData(id));\nconst results = await Promise.all(promises);\n
\n\n

1.3. الأمان وتسرب الذاكرة

\n

بالنسبة لـ Node.js، من الضروري:

\n
    \n
  • عدم وجود حقن: لا تستخدم eval أو new Function دون حاجة ماسة.
  • \n
  • إغلاق التدفقات (streams)، واتصالات قاعدة البيانات، وواصفات الملفات.
  • \n
  • التحقق من صحة البيانات المدخلة. لا تثق أبدًا في جسم الطلب (req.body).
  • \n
\n\n

2. كيفية تقديم الملاحظات: علم النفس والتكتيكات

\n

حتى القائمة المثالية للفحوصات لن تنجح إذا كانت الملاحظات (feedback) تثير لدى مؤلف الكود الرغبة في إغلاق طلب السحب (PR) والاستقالة. إليك بعض القواعد.

\n\n

2.1. قاعدة "الساندويتش" (اختيارية ولكنها فعالة)

\n

ابدأ بتعليق إيجابي، ثم أشر إلى المشكلة، واختتم بالدعم. على سبيل المثال:

\n
    \n
  • "حل رائع باستخدام Map للتخزين المؤقت!"
  • \n
  • "ومع ذلك، هناك مشكلة محتملة هنا مع تغيير المصفوفة الأصلية. دعنا نستخدم .map() بدلاً من .forEach() مع push."
  • \n
  • "بخلاف ذلك، الكود نظيف، شكرًا على الإصلاح السريع!"
  • \n
\n\n

2.2. علق على الكود وليس على الشخص

\n

بدلاً من "لقد كتبت حلقة سيئة"، قل "يمكن استبدال هذه الحلقة بـ Array.reduce لتحسين قابلية القراءة". تجنب استخدام ضمير المخاطب "أنت" في السياق السلبي.

\n\n

2.3. قدم السياق والبدائل

\n

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

\n
"لا تستخدم var."
\n

تعليق جيد:

\n
"هنا، var ينشئ متغيرًا في النطاق العام، مما قد يؤدي إلى أخطاء. دعنا نستبدله بـ const لأن القيمة لا تتغير."

المدونات

توصيات الكتب