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

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

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

ابدأ الدورة

Clean Code على C++: كيف تكتب كودًا لا تخجل من عرضه على زملائك



يواجه كل مطور C++ عاجلاً أم آجلاً موقفًا يتحول فيه كوده الخاص إلى "غابة مظلمة" بعد شهر. متغيرات مثل int a، ودوال بطول 300 سطر، وأرقام سحرية في جميع أنحاء المشروع - هل يبدو ذلك مألوفًا؟ في هذه المقالة، سنقوم بتفصيل مبادئ Clean Code كما تُطبق على C++، بحيث يكون كودك ليس فقط وظيفيًا بل مفهومًا للآخرين (ولنفسك في المستقبل).



1. تسمية المتغيرات والدوال والكلاسات



الاسم الجيد هو نصف المعركة. في C++، من الشائع استخدام camelCase للمتغيرات والدوال، و PascalCase للكلاسات، و UPPER_CASE للثوابت (على الرغم من أن C++ الحديثة تفضل constexpr).



مثال سيء:

int d; // elapsed time in daysfloat x; // salary multiplierbool fl; // is file loaded?


مثال جيد:

int elapsedDays;float salaryMultiplier;bool isFileLoaded;


القاعدة بسيطة: يجب أن يجيب الاسم على السؤال "ما هذا؟" أو "ماذا يفعل؟". تجنب الاختصارات (باستثناء الاختصارات المقبولة عمومًا، مثل idx للفهرس). بالنسبة للمتغيرات المنطقية، استخدم بادئات مثل is أو has أو can.



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



مبدأ Clean Code الكلاسيكي — يجب أن تؤدي الدالة مهمة واحدة بالضبط. إذا لم تتمكن من ابتكار اسم قصير وواضح لدالة ما — فمن المحتمل أنها تقوم بالكثير.



مثال سيء:

void processData(std::vector<int>& data) {    // sorting    std::sort(data.begin(), data.end());    // removing duplicates    data.erase(std::unique(data.begin(), data.end()), data.end());    // calculating average    double sum = 0;    for (int val : data) sum += val;    double avg = sum / data.size();    // output    std::cout << "Average: " << avg << std::endl;}


مثال جيد:

std::vector<int> sortAndUnique(std::vector<int> data) {    std::sort(data.begin(), data.end());    data.erase(std::unique(data.begin(), data.end()), data.end());    return data;}

double calculateAverage(const std::vector<int>& data) { if (data.empty()) return 0.0; double sum = std::accumulate(data.begin(), data.end(), 0.0); return sum / data.size();}

void printAverage(const std::vector<int>& data) { auto processed = sortAndUnique(data); double avg = calculateAverage(processed); std::cout << "Average: " << avg << std::endl;}


كل دالة تحل مهمة واحدة، ومن السهل اختبارها وإعادة استخدامها. يجب ألا يتجاوز طول الدالة 20-30 سطرًا — هذا دليل جيد.



3. تجنب الأرقام السحرية والتكرار



الأرقام السحرية هي أرقام لا يتضح معناها من السياق. بدلاً من ذلك، استخدم الثوابت المسماة.



مثال سيء:

double calculatePrice(double base) {    return base * 1.2 + 5.0;}


مثال جيد:

constexpr double TAX_RATE = 1.2;constexpr double DELIVERY_FEE = 5.0;

double calculatePrice(double basePrice) { return basePrice * TAX_RATE + DELIVERY_FEE;}


ينطبق الشيء نفسه على تكرار الكود. إذا قمت بنسخ كتلة من الكود أكثر من مرة — فاستخرجها إلى دالة. مبدأ DRY (لا تكرر نفسك) هو أساس الكود القابل للصيانة.



4. التعليقات ليست عذرًا للكود السيء



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



مثال سيء:



                
                

المدونات

توصيات الكتب