مراجعة الكود بلغة جافا: ما الذي تبحث عنه في كود الآخرين

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

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

ابدأ الدورة

لماذا مراجعة الكود ليست انتقادًا، بل تتعلق بالجودة

\n

تخيل: تفتح طلب سحب (pull request) من زميل. هناك 500 سطر من الكود، ورائحة النسخ واللصق، وفي مكان ما نسي شخص ما إغلاق مورد. مهمتك ليست مجرد العثور على الأخطاء، بل جعل الكود أفضل. مراجعة الكود بلغة جافا ليست رقابة شرطية، بل إبداع مشترك. المراجع الجيد ينقذ الفريق من الديون التقنية، أما السيئ فيثبط الهمم أو يسمح بمرور الثغرات.

\n

في هذه المقالة، سأشرح ما يجب التحقق منه في مراجعة الكود بلغة جافا، حتى لا تضيع الوقت في التفاصيل الصغيرة، ولكن لا تفوت الأمور الحرجة. ستحصل على قائمة تحقق جاهزة وأمثلة من الممارسة.

\n\n

البنية والتصميم: انظر إلى الجذر

\n

قبل الغوص في التفاصيل، قيّم الصورة العامة. البنية السيئة لا تُعالج بالتنسيق.

\n

انتهاك مبادئ SOLID

\n

تحقق مما إذا كانت الفئة قد تحولت إلى "كائن إلهي". مثال على انتهاك مبدأ المسؤولية الفردية:

\n
public class OrderService {\n    public void createOrder(Order order) {\n        // التحقق\n        // حساب الخصم\n        // إرسال البريد الإلكتروني\n        // تسجيل السجلات\n        // الحفظ في قاعدة البيانات\n    }\n}\n
\n

هنا خمسة أسباب للتغيير. الصحيح هو فصل تسجيل السجلات والإرسال إلى خدمات منفصلة.

\n

التعقيد المفرط

\n

أحيانًا يحل الكود مشكلة بسيطة بطريقة معقدة. اسأل نفسك: "هل يمكن أن يكون أبسط؟" إذا كانت الإجابة نعم، فاكتب ذلك في المراجعة. تذكر مبدأ KISS.

\n\n

الأمان: ثغرات لا يجب تفويتها

\n

مراجعة كود جافا يجب أن تتضمن التحقق من الأمان. حتى لو كان المشروع داخليًا.

\n

حقن SQL

\n

ربط السلاسل النصية هو شر:

\n
// سَيء\nString query = "SELECT * FROM users WHERE name = '" + userName + "'";\nStatement stmt = connection.createStatement();\nResultSet rs = stmt.executeQuery(query);\n
\n

الصحيح هو استخدام PreparedStatement:

\n
// جيد\nString query = "SELECT * FROM users WHERE name = ?";\nPreparedStatement pstmt = connection.prepareStatement(query);\npstmt.setString(1, userName);\nResultSet rs = pstmt.executeQuery();\n
\n

تسريب البيانات الحساسة

\n

تحقق من عدم تسجيل كلمات المرور أو الرموز المميزة أو أرقام البطاقات. استخدم @ToString.Exclude في Lombok أو التجاهل الصريح.

\n

مقارنة غير آمنة للكائنات

\n
// سَيء (مقارنة المراجع)\nif (password == storedPassword) { ... }\n// جيد\nif (password.equals(storedPassword)) { ... }\n
\n\n

الأداء: نقاط الاختناق

\n

لا تقم بالتحسين المبكر، لكن لا تفوت أيضًا حالات التباطؤ الواضحة.

\n

عمليات غير ضرورية في الحلقات

\n
// سَيء: يتم استدعاء length() في كل مرة\nfor (int i = 0; i < list.size(); i++) { ... }\n// جيد\nint size = list.size();\nfor (int i = 0; i < size; i++) { ... }\n
\n

استخدام Stream للمهام البسيطة

\n

أحيانًا تكون الحلقة العادية أسرع في القراءة والأداء:

\n
// مفرط\nlist.stream().filter(x -> x > 5).collect(Collectors.toList());\n// بسيط\nList<Integer> result = new ArrayList<>();\nfor (int x : list) {\n    if (x > 5) result.add(x);\n}\n
\n

تسرب الذاكرة

\n

تحقق مما إذا تم نسيان إغلاق InputStream أو Connection أو Session. استخدم try-with-resources:

\n
try (Connection conn = getConnection();\n     PreparedStatement stmt = conn.prepareStatement(sql)) {\n    // العمل\n} catch (SQLException e) {\n    log.error("خطأ في قاعدة البيانات", e);\n}\n
\n\n

قابلية القراءة والأسلوب: الكود ككتاب

\n

قائمة التحقق لمراجعة الكود تتضمن بالضرورة قابلية القراءة. الكود يُكتب مرة واحدة، ويُقرأ عشرات المرات.

\n

الأرقام والسلاسل السحرية

\n
// سَيء\nif (status == 3) { ... }\n// جيد\nprivate static final int STATUS_COMPLETED = 3;\nif (status == STATUS_COMPLETED) { ... }\n
\n

الطرق الطويلة

المدونات

توصيات الكتب