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

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

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

ابدأ الدورة

Code review في JavaScript: ما يجب التحقق منه وكيفية تقديم الملاحظات



Code review (مراجعة الكود) — ليست مجرد فحص شكلي قبل دمج pull request. إنها أداة قوية لتحسين جودة الكود، وتبادل المعرفة في الفريق، ومنع الأخطاء في المراحل المبكرة. في عالم JavaScript و Node.js، حيث يؤدي التزامن غير المتزامن والكتابة الديناميكية إلى العديد من الفخاخ الخفية، تصبح المراجعة الجيدة أمرًا بالغ الأهمية.

في هذه المقالة، سنناقش بالضبط ما يجب الانتباه إليه عند مراجعة كود JavaScript، وكيفية تقديم الملاحظات لتكون مفيدة وليست مسيئة.



1. المنطق، البنية والأمان

أول ما يجب التحقق منه — هل يحل الكود المهمة المطلوبة. لا تتعمق فورًا في التنسيق. اسأل نفسك الأسئلة التالية:

  • هل يعمل المنطق بشكل صحيح؟ هل هناك حالات حافة (edge cases)؟ ماذا سيحدث إذا وصل null أو undefined أو مصفوفة فارغة؟
  • هل توجد ثغرات أمنية؟ في Node.js هذا مهم بشكل خاص. تحقق مما إذا كانت البيانات الخام من الطلب تُمرر مباشرة إلى استعلام SQL (SQL Injection) أو إلى eval(). هل يتم استخدام أدوات التعقيم (sanitizers) لـ HTML؟
  • هل البنية محترمة؟ هل يخالف الكود مبادئ SOLID؟ على سبيل المثال، هل تقوم دالة واحدة بأكثر من اللازم؟ هل تم فصل منطق الأعمال عن معالجات المسارات (route handlers)؟


// سيء: خلط المنطق مع طبقة HTTPapp.get('/user/:id', async (req, res) => {    const user = await db.query(`SELECT * FROM users WHERE id = ${req.params.id}`); // SQL Injection!    res.json(user);});

// جيد: فصل المسؤولياتconst getUserById = async (id) => { if (!id || typeof id !== 'string') throw new Error('Invalid ID'); return await db.query('SELECT * FROM users WHERE id = $1', [id]);};app.get('/user/:id', async (req, res) => { const user = await getUserById(req.params.id); res.json(user);});


2. التزامن غير المتزامن والعمل مع Promises

هذا هو كعب أخيل للعديد من مطوري JavaScript. عند مراجعة كود Node.js، تأكد من التحقق مما يلي:

  • معالجة الأخطاء. هل جميع الدوال غير المتزامنة مغلفة في try/catch؟ هل تم نسيان .catch() للـ Promises؟ هل هناك Promises يتيمة (unhandled promise rejections)؟
  • الاستخدام الصحيح لـ async/await. هل يوجد await غير ضروري حيث يمكن تشغيل الـ Promises بالتوازي عبر Promise.all؟
  • سباقات التوقيت (race conditions). هل يمكن أن يتم تنفيذ الكود بشكل غير صحيح عند الطلبات المتزامنة لنفس المورد (مثل ملف أو متغير عام)؟


// سيء: تنفيذ متسلسل للطلبات المستقلةconst user = await getUser(id);const posts = await getPosts(id);

// جيد: تنفيذ متوازيconst [user, posts] = await Promise.all([getUser(id), getPosts(id)]);

// سيء: نسيان معالجة الأخطاءrouter.get('/data', async (req, res) => { const data = await fetchData(); // إذا فشلت fetchData، سيسقط الخادم أيضًا res.json(data);});

// جيدrouter.get('/data', async (req, res, next) => { try { const data = await fetchData(); res.json(data); } catch (error) { next(error); // تمرير الخطأ إلى المعالج العام }});


3. جودة الكود، الأسلوب والتسمية

يجب أن يكون الكود قابلاً للقراءة مثل كتاب جيد. حتى لو كان المنطق صحيحًا، فإن الأسلوب السيئ سيؤدي إلى إبطاء التطوير في المستقبل.

  • تسمية المتغيرات والدوال. يجب أن تجيب الأسماء على سؤال "ما هذا؟" و"ماذا يفعل؟". تجنب المتغيرات المكونة من حرف واحد (باستثناء عدّادات الحلقات) والاختصارات مثل getUsrInf.
  • الأرقام والسلاسل السحرية. هل يتم استخراجها إلى ثوابت؟ const MAX_RETRIES = 3; أكثر وضوحًا

المدونات

توصيات الكتب