Clean Code بلغة C++: مبادئ كتابة الكود القابل للقراءة

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

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

ابدأ الدورة

Clean Code في C++: المبادئ والأمثلة



في تطوير البرمجيات الحديثة، كتابة كود يعمل هي نصف المهمة فقط. البراعة الحقيقية تظهر في القدرة على إنشاء كود يسهل قراءته وفهمه وتعديله. مفهوم Clean Code (الكود النظيف)، الذي شاعه روبرت مارتن (العم بوب)، ينطبق على أي لغة برمجة، بما في ذلك C++. في هذه المقالة، سنشرح المبادئ الأساسية لكتابة كود نظيف في C++ مع أمثلة عملية.



لماذا يعتبر Clean Code مهمًا لـ C++؟



C++ هي لغة قوية ولكنها معقدة. تمنح المطور حرية هائلة، لكن هذه الحرية يمكن أن تؤدي إلى الفوضى إذا لم يتم الالتزام بالانضباط. الكود غير النظيف في C++ قد يحتوي على سلوك غير محدد، تسرب للذاكرة، وتراكيب يصعب فهمها. الكود النظيف في C++ هو ضمان لـ:

  • تقليل وقت التصحيح: الكود القابل للقراءة أسهل في الاختبار والتحقق.
  • سهولة الصيانة: زميلك (أو أنت بعد ستة أشهر) سيفهم المنطق بسرعة.
  • تقليل عدد الأخطاء: الكود الواضح نادرًا ما يحتوي على أخطاء مخفية.
  • تحسين العمل الجماعي: نمط الكود الموحد يسرع مراجعة الكود.


المبدأ 1: الأسماء ذات المعنى



أول وأهم مبدأ في الكود النظيف هو التسمية الصحيحة للمتغيرات والدوال والكلاسات. يجب أن يجيب الاسم على أسئلة "لماذا؟" و"ماذا يفعل؟".



مثال سيء:

int d; // elapsed time in days


مثال جيد:

int elapsedTimeInDays;


تجنب الاختصارات (باستثناء الشائعة، مثل i لعداد الحلقة). استخدم camelCase للمتغيرات والدوال، وPascalCase للكلاسات. كن متسقًا.



قاعدة للدوال:

يجب أن يصف اسم الدالة بوضوح ما تفعله. إذا كانت الدالة تؤدي عدة إجراءات، فهذا سبب لتقسيمها.

// سيءvoid processData();

// جيدvoid calculateAverageScore();void validateUserInput();


المبدأ 2: يجب أن تكون الدوال صغيرة وتقوم بشيء واحد



قاعدة مستوى التجريد الواحد (Single Level of Abstraction) تنص على: لا ينبغي خلط العمليات عالية المستوى (مثل "الحصول على البيانات") مع العمليات منخفضة المستوى (مثل "فتح ملف وقراءة 4 بايتات") داخل دالة واحدة.



مثال سيء (دالة متجانسة):

void processOrder(Order& order) {    // التحقق    if (order.items.empty()) {        throw std::runtime_error("Order is empty");    }    // حساب الضريبة    double tax = 0.0;    for (auto& item : order.items) {        tax += item.price * 0.2;    }    // الحفظ في ملف    std::ofstream file("orders.log", std::ios::app);    file << order.id << "," << tax << std::endl;}


مثال جيد (تقسيم إلى دوال صغيرة):

void validateOrder(const Order& order) {    if (order.items.empty()) {        throw std::runtime_error("Order is empty");    }}

double calculateTax(const Order& order) { double tax = 0.0; for (auto& item : order.items) { tax += item.price * 0.2; } return tax;}

void logOrderToFile(const Order& order, double tax) { std::ofstream file("orders.log", std::ios::app); file << order.id << "," << tax << std::endl;}

void processOrder(Order& order) { validateOrder(order); double tax = calculateTax(order); logOrderToFile(order, tax);}


كل دالة الآن تقوم بعمل واحد فقط ولها اسم واضح.



المبدأ 3: تجنب تكرار الكود (DRY)



مبدأ DRY (Don't Repeat Yourself) هو أحد الركائز الأساسية للكود النظيف. إذا كنت

المدونات

توصيات الكتب