كود نظيف في JavaScript: المبادئ والأمثلة للمبتدئين
\n\nالكود النظيف (Clean Code) ليس مجرد مفهوم عصري، بل هو مهارة أساسية لأي مطور محترف. في عالم JavaScript (خاصة في بيئة Node.js)، يتم كتابة الكود بسرعة، لكن صيانته بدون مبادئ واضحة تصبح كابوسًا حقيقيًا. هذه المقالة موجهة للمبتدئين الذين يريدون كتابة كود ليس فقط يعمل، بل جميل، قابل للقراءة وقابل للتوسع.
\n\nالكود النظيف هو كود يسهل قراءته، وتعديله، واختباره. لا يثير الرغبة في إعادة كتابته من الصفر. دعنا نستعرض المبادئ الأساسية مع أمثلة عملية.
\n\n1. تسمية المتغيرات والدوال: قول الحقيقة
\n\nأبسط قاعدة وأكثرها تعقيدًا في نفس الوقت — يجب أن يعكس الاسم الجوهر. لا تبخل بالحروف، بل وفر الوقت في الفهم.
\n\nسيء (غير مفهوم):
\nconst d = new Date();\nconst arr = ['apple', 'banana', 'grape'];\nconst fn = (x) => x * 2;\n\nجيد (قابل للقراءة):
\nconst currentDate = new Date();\nconst fruitList = ['apple', 'banana', 'grape'];\nconst doubleValue = (value) => value * 2;\n\nقواعد التسمية:
\n- \n
- المتغيرات — أسماء (user, productList, errorMessage). \n
- الدوال — أفعال (getUser, calculateTotal, validateEmail). \n
- القيم المنطقية — ابدأ بـ
is,has,should(isActive, hasPermission, shouldUpdate). \n - تجنب الأرقام السحرية — ضعها في ثوابت. \n
// سيء\nconst t = 3600000; // ما هذا الرقم؟\n\n// جيد\nconst MILLISECONDS_IN_AN_HOUR = 3600000;\nconst timeout = MILLISECONDS_IN_AN_HOUR;\n\n2. الدوال: خطوة واحدة — إجراء واحد
\n\nمبدأ المسؤولية الواحدة (Single Responsibility Principle) ينطبق أيضًا على الدوال. يجب أن تقوم الدالة بشيء واحد وتقوم به بشكل جيد.
\n\nسيء (يفعل كل شيء مرة واحدة):
\nfunction processUserData(user) {\n const fullName = `${user.firstName} ${user.lastName}`;\n const email = user.email.toLowerCase();\n const isValid = email.includes('@');\n \n if (isValid) {\n const result = { fullName, email };\n saveToDatabase(result);\n sendWelcomeEmail(email);\n return result;\n } else {\n throw new Error('Invalid email');\n }\n}\n\nجيد (مقسم إلى دوال صغيرة):
\nfunction buildFullName(firstName, lastName) {\n return `${firstName} ${lastName}`;\n}\n\nfunction normalizeEmail(email) {\n return email.toLowerCase().trim();\n}\n\nfunction isValidEmail(email) {\n return email.includes('@');\n}\n\nfunction processUserData(user) {\n const fullName = buildFullName(user.firstName, user.lastName);\n const email = normalizeEmail(user.email);\n \n if (!isValidEmail(email)) {\n throw new Error('Invalid email');\n }\n \n const result = { fullName, email };\n saveToDatabase(result);\n sendWelcomeEmail(email);\n \n return result;\n}\n\nهذا الكود سهل الاختبار، سهل التعديل، وسهل الفهم.
\n\n3. إدارة التعقيد: تجنب التداخل العميق
\n\nالتداخل العميق لـ if و for هو عدو قابلية القراءة. استخدم الإرجاع المبكر (early return) و جمل الحماية (Guard Clauses).
سيء (جحيم عميق):
\nfunction processOrder(order) {\n if (order) {\n if (order.isPaid) {\n if (order.items.length > 0) {\n // ... 50 سطر من الكود\n }\n }\n }\n}\n\nجيد (هيكل مسطح):
\nfunction processOrder(order) {\n if (!order) {\n return;\n }\n