مقدمة: لماذا مراجعة الكود ليست مجرد "إيجاد الأخطاء"
\nمراجعة الكود (Code review) ليست مجرد إجراء شكلي أو وسيلة لإيجاد الأخطاء المطبعية. في التطوير الحديث باستخدام JavaScript و Node.js، تعتبر الأداة الرئيسية للحفاظ على جودة الكود، وتبادل المعرفة في الفريق، ومنع الديون التقنية. ومع ذلك، يختصر العديد من المطورين المراجعة في فحص بناء الجملة، متجاهلين المشكلات المعمارية والأداء وقابلية القراءة.
\nفي هذه المقالة، سنشرح ما الذي يجب التحقق منه بالضبط في كود JavaScript (باستخدام Node.js كمثال)، وكيفية تقديم الملاحظات بطريقة لا تسيء إلى زميلك بل تساعده على النمو. ستساعد الأمثلة العملية للكود في ترسيخ المادة.
\n\n1. ما يجب التحقق منه في كود JavaScript: قائمة مراجعة عملية
\nلنبدأ بنقاط التحقق المحددة. سنقسمها إلى ثلاثة مستويات: بناء الجملة/الأسلوب، المنطق/الأمان، والهندسة المعمارية.
\n\n1.1. أسلوب الكود والتنسيق
\nالأمر بسيط هنا: استخدم أداة التحليل (ESLint) وأداة التنسيق (Prettier). لا ينبغي أن تكون هناك خلافات حول المسافات في المراجعة. قم بإعداد الإعدادات في المشروع مرة واحدة. تحقق من:
\n- \n
- أن الكود يتوافق مع قواعد
eslint-config-airbnbأو إعداداتك المخصصة. \n - عدم وجود
console.logزائدة (إذا لم يكن وضع التطوير). \n - أن أسماء المتغيرات ذات معنى:
const userDataوليسconst x. \n
1.2. منطق العمل مع عدم التزامن (Promise, async/await)
\nهذه منطقة شائعة للأخطاء في Node.js. تحقق من:
\n- \n
- معالجة الأخطاء في الدوال غير المتزامنة. عدم وجود
try/catchقد يؤدي إلى تعطل العملية. \n - الاستخدام الصحيح لـ
awaitداخل الحلقات. إذا كانت المهام لا تعتمد على بعضها البعض، استخدمPromise.all. \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\n1.3. الأمان وتسرب الذاكرة
\nبالنسبة لـ Node.js، من الضروري:
\n- \n
- عدم وجود حقن: لا تستخدم
evalأوnew Functionدون حاجة ماسة. \n - إغلاق التدفقات (streams)، واتصالات قاعدة البيانات، وواصفات الملفات. \n
- التحقق من صحة البيانات المدخلة. لا تثق أبدًا في جسم الطلب (
req.body). \n
2. كيفية تقديم الملاحظات: علم النفس والتكتيكات
\nحتى القائمة المثالية للفحوصات لن تنجح إذا كانت الملاحظات (feedback) تثير لدى مؤلف الكود الرغبة في إغلاق طلب السحب (PR) والاستقالة. إليك بعض القواعد.
\n\n2.1. قاعدة "الساندويتش" (اختيارية ولكنها فعالة)
\nابدأ بتعليق إيجابي، ثم أشر إلى المشكلة، واختتم بالدعم. على سبيل المثال:
\n- \n
- "حل رائع باستخدام
Mapللتخزين المؤقت!" \n - "ومع ذلك، هناك مشكلة محتملة هنا مع تغيير المصفوفة الأصلية. دعنا نستخدم
.map()بدلاً من.forEach()مع push." \n - "بخلاف ذلك، الكود نظيف، شكرًا على الإصلاح السريع!" \n
2.2. علق على الكود وليس على الشخص
\nبدلاً من "لقد كتبت حلقة سيئة"، قل "يمكن استبدال هذه الحلقة بـ Array.reduce لتحسين قابلية القراءة". تجنب استخدام ضمير المخاطب "أنت" في السياق السلبي.
2.3. قدم السياق والبدائل
\nمجرد كتابة "هذا خطأ" هو أمر سيء. اشرح لماذا واقترح بديلاً. مثال على تعليق سيء:
\n"لا تستخدم var."\n
تعليق جيد:
\n"هنا،varينشئ متغيرًا في النطاق العام، مما قد يؤدي إلى أخطاء. دعنا نستبدله بـconstلأن القيمة لا تتغير."