مقدمة: لماذا الكود النظيف ليس رفاهية بل ضرورة
\nكل مطور جافا واجه موقفًا حيث، عند فتح مشروع قديم، يقضي ساعات في فهم ما كتبه هو نفسه قبل بضعة أشهر. وماذا عن كود الآخرين؟ الكود غير النظيف يبطئ التطوير، ويزيد من عدد الأخطاء، ويحبط الفريق. أصبح كتاب روبرت مارتن "Clean Code" مرجعًا للمبرمجين، لكن مبادئه غالبًا ما تظل نظرية. في هذه المقالة، سنشرح المفاهيم الأساسية للكود النظيف بلغة جافا مع أمثلة حقيقية يمكن تطبيقها اليوم.
\nالكود النظيف لا يتعلق بالصيغة المثالية أو اتباع الموضة. إنه يتعلق بالاحترام للزملاء، ولنفسك في المستقبل، وفي النهاية، للأعمال. الكود القابل للقراءة أسهل في الصيانة والاختبار وإعادة الهيكلة. دعنا نرى كيف نحول كود جافا من "يعمل" إلى "نظيف".
\n\n1. أسماء ذات معنى: تحدث بلغة مجال المشكلة
\nالقاعدة: يجب أن يجيب الاسم على أسئلة "لماذا؟"، "ماذا؟"، "كيف؟"
\nالتسمية السيئة هي العدو الرئيسي للكود النظيف. المتغيرات مثل int a، String d أو List<Integer> list1 لا تحمل معلومات. الاسم الجيد يجب أن يكشف عن نية المبرمج.
// سيء\nint d; // elapsed time in days\nList<Integer> lst;\n\n// جيد\nint daysSinceCreation;\nList<Integer> customerIds;\n\nتجنب المعلومات المضللة
\nلا تستخدم accountList إذا لم تكن List، بل مثلاً Set أو Map. لا تختصر الواضح: usrNm بدلاً من userName.
أسماء الفئات والطرق
\n- \n
- الفئات: أسماء (
Customer،OrderProcessor). \n - الطرق: أفعال (
calculateTotal()،saveToDatabase()). \n - المتغيرات المنطقية: مسندات (
isActive،hasPermission). \n
// سيء\npublic class Data {\n public void proc() { ... }\n}\n\n// جيد\npublic class InvoiceCalculator {\n public BigDecimal calculateTotalAmount() { ... }\n}\n\n2. الدوال: قصيرة، ذرية، وبدون آثار جانبية
\nالمبدأ الأول: يجب أن تقوم الدالة بشيء واحد فقط
\nالدالة المثالية في جافا هي من 4 إلى 20 سطرًا. إذا كانت الدالة تقوم بأكثر من إجراء واحد، فيجب تقسيمها. العلامة الكلاسيكية: إذا كان بإمكانك استخراج دالة أخرى ذات اسم ذي معنى من الدالة - فافعل ذلك.
\n\n// سيء: الدالة تقوم بثلاثة أشياء\npublic void processOrder(Order order) {\n if (order == null) throw new IllegalArgumentException();\n // 1. التحقق\n if (order.getItems().isEmpty()) {\n logger.warn("Empty order");\n return;\n }\n // 2. حساب التكلفة\n BigDecimal total = BigDecimal.ZERO;\n for (Item item : order.getItems()) {\n total = total.add(item.getPrice().multiply(BigDecimal.valueOf(item.getQuantity())));\n }\n // 3. إرسال البريد الإلكتروني\n emailService.sendConfirmation(order.getCustomerEmail(), total);\n}\n\n// جيد: كل دالة تقوم بشيء واحد\npublic void processOrder(Order order) {\n validateOrder(order);\n BigDecimal total = calculateTotal(order);\n sendConfirmationEmail(order, total);\n}\n\nprivate void validateOrder(Order order) {\n if (order == null || order.getItems().isEmpty()) {\n throw new IllegalArgumentException("Invalid order");\n }\n}\n\nprivate BigDecimal calculateTotal(Order order) {\n return order.getItems().stream()\n .map(item -> item.getPrice().multiply(BigDecimal.valueOf(item.getQuantity())))\n .reduce(BigDecimal.ZERO, BigDecimal::add);\n}\n\nقاعدة الكشاف: اترك المخيم أنظف مما وجدته
\nفي كل مرة تقوم فيها بتعديل ملف، قم بتحسينه: أعد تسمية متغير سيء، قسم دالة طويلة. هذا يمنع تدهور الكود.
\n<