مراجعة الكود في C++: ما يجب التحقق منه وكيفية تقديم الملاحظات
مراجعة الكود (Code Review) هي مرحلة إلزامية في التطوير، خاصة في لغة C++. توفر هذه اللغة حرية هائلة، ولكن معها تأتي المسؤولية. بالنسبة للمطورين المبتدئين، قد تبدو عملية المراجعة مخيفة، لكنها في الواقع أداة تعلم قوية. في هذه المقالة، سنشرح ما يجب الانتباه إليه عند فحص كود C++ وكيفية تقديم الملاحظات لتكون مفيدة وليست مسيئة.
1. الصحة الأساسية وأمان الذاكرة
أول ما يجب التحقق منه في أي كود C++ هو التعامل الصحيح مع الذاكرة. لا تحتوي C++ على جامع قمامة (Garbage Collector)، لذا فإن الأخطاء هنا حرجة.
ما يجب التحقق منه:
- تسرب الذاكرة: يجب أن يقابل كل
newdelete، وكلnew[]يقابلهdelete[]. من الأفضل استخدام المؤشرات الذكية (std::unique_ptr،std::shared_ptr). - تجاوز حدود المصفوفات: استخدام
std::vector::at()بدلاً من العامل[]لالتقاط الأخطاء. - المؤشرات المعلقة: مؤشرات تشير إلى ذاكرة تم تحريرها بالفعل.
- التحرير المزدوج: تكرار
deleteلنفس كتلة الذاكرة.
// سيء: إدارة يدوية للذاكرةint* arr = new int[100];// ... العمل ...delete[] arr; // من السهل نسيانه
// جيد: استخدام RAIIstd::vector<int> arr(100);// سيتم تحرير الذاكرة تلقائياًنصيحة للمراجع: إذا رأيت مؤشرات خام (int* ptr) أو new/delete يدوي - فهذه علامة حمراء. اقترح استخدام std::unique_ptr أو حاويات STL.
2. استخدام المكتبة القياسية (STL)
توفر C++20/23 مكتبة قياسية غنية. غالباً ما يكتب المبتدئون حلولاً مخصصة حيث يمكن استخدام حلول جاهزة.
قائمة التحقق:
- الحاويات: بدلاً من المصفوفات الخام -
std::vector،std::array،std::map. - الخوارزميات: بدلاً من الحلقات اليدوية -
std::find،std::sort،std::copy. - السلاسل النصية:
std::stringبدلاً منchar*. - التدفقات:
std::ifstream/std::ofstreamبدلاً منfopenالخاصة بلغة C.
// سيء: بحث يدويbool found = false;for (int i = 0; i < vec.size(); ++i) { if (vec[i] == target) { found = true; break; }}
// جيد: خوارزمية STLbool found = std::find(vec.begin(), vec.end(), target) != vec.end();كيفية تقديم الملاحظات: بدلاً من قول "هذا خطأ"، قل: "منطق رائع! توجد دالة جاهزة في STL تسمى std::find تفعل نفس الشيء ولكن بشكل أقصر وأكثر أماناً. هل نجرب استخدامها؟".
3. أسلوب الكود، التسمية، والثبات
قابلية قراءة الكود هي نصف النجاح. حتى الكود الذي يعمل بشكل مثالي يكون عديم الفائدة إذا كان من المستحيل صيانته.
ما يجب الانتباه إليه:
- التسمية: المتغيرات -
snake_case(حسب معيار C++)، الفئات -PascalCase. تجنب الأسماء المكونة من حرف واحد (باستثناءiللعدادات). - الثبات: المعاملات التي لا تتغير يجب أن تكون
const. الدوال التي لا تغير الكائن -const. - التنسيق: نمط موحد للمسافات البادئة (عادة 4 مسافات)، مسافات حول العوامل.
- الأرقام السحرية: ضعها في ثوابت (
constexpr int MAX_SIZE = 100;).
// سيء: غير قابل للقراءةint a = 5;for(int i=0;i<10;i