C++ में क्लीन कोड: सिद्धांत और व्यावहारिक उदाहरण

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C++ में क्लीन कोड: सिद्धांत और व्यावहारिक उदाहरण

\n\n

प्रत्येक C++ डेवलपर को देर-सबेर अपने या दूसरों के कोड को बनाए रखने की समस्या का सामना करना पड़ता है। जटिल टेम्पलेट, ओवरलोडेड फ़ंक्शन और अंतहीन मैक्रोज़ प्रोजेक्ट को एक दुःस्वप्न में बदल देते हैं। रॉबर्ट मार्टिन द्वारा लोकप्रिय क्लीन कोड की अवधारणा, सरल लेकिन प्रभावी नियम प्रदान करती है जो कोड को समझने योग्य, सुरक्षित और संशोधित करने में आसान बनाती है। इस लेख में, हम C++ पर लागू क्लीन कोड के प्रमुख सिद्धांतों पर चर्चा करेंगे और दिखाएंगे कि उन्हें व्यवहार में कैसे लागू किया जाए।

\n\n

1. चर और फ़ंक्शन के नाम: बताएं कि आप क्या कर रहे हैं

\n\n

क्लीन कोड का पहला नियम यह है कि नाम डेवलपर के इरादे को प्रकट करना चाहिए। C++ में, पॉइंटर्स, रेफरेंस और ओवरलोड की प्रचुरता के कारण यह विशेष रूप से महत्वपूर्ण है।

\n\n

खराब उदाहरण:

\n
int d; // elapsed time in days\nvoid f(int* a, int n); // ???
\n\n

अच्छा उदाहरण:

\n
int daysSinceLastLogin;\nvoid processUserData(const std::vector<int>& userIds);
\n\n

पूरे शब्दों का उपयोग करें, एक-अक्षर वाले चर से बचें (छोटे लूप में इंडेक्स को छोड़कर)। बूलियन चर के लिए उपसर्ग is, has, should का उपयोग करें:

\n
bool isValidInput;\nbool hasPermissions;
\n\n

क्लासेस और स्ट्रक्चर को संज्ञा से नाम दें, और फ़ंक्शन को क्रिया या क्रिया संयोजन से: class UserAccount, void calculateSalary()।

\n\n

2. फ़ंक्शन: छोटे, एक ही जिम्मेदारी वाले

\n\n

फ़ंक्शन को केवल एक ही काम करना चाहिए और उसे अच्छी तरह से करना चाहिए। अधिकतम लंबाई 20-30 लाइनें है। यदि फ़ंक्शन इससे अधिक लंबा है, तो इसे सहायक फ़ंक्शन में विभाजित करें।

\n\n

खराब उदाहरण (मोनोलिथिक फ़ंक्शन):

\n
void processOrder(Order& order) {\n    // भुगतान जांच\n    // स्टॉक अपडेट\n    // ईमेल भेजना\n    // लॉगिंग\n    // रसीद जनरेट करना\n}
\n\n

अच्छा उदाहरण (डीकंपोज़िशन):

\n
void processOrder(Order& order) {\n    if (!validatePayment(order)) return;\n    updateInventory(order);\n    sendConfirmationEmail(order);\n    logTransaction(order);\n    generateReceipt(order);\n}
\n\n

साइड इफेक्ट से बचने का प्रयास करें। फ़ंक्शन को नाम में स्पष्ट उल्लेख के बिना ग्लोबल वेरिएबल या रेफरेंस द्वारा पारित आर्गुमेंट्स को नहीं बदलना चाहिए (resetData, fillBuffer)।

\n\n

3. मेमोरी और संसाधनों के साथ काम करना: RAII और स्मार्ट पॉइंटर्स

\n\n

C++ मेमोरी पर पूर्ण नियंत्रण देता है, लेकिन इससे मेमोरी लीक होती है। क्लीन कोड कच्चे new/delete के बजाय RAII (Resource Acquisition Is Initialization) इडियम और स्मार्ट पॉइंटर्स का उपयोग करने का सुझाव देता है।

\n\n

खराब उदाहरण (मैन्युअल प्रबंधन):

\n
void process() {\n    int* data = new int[100];\n    // ... बहुत सारा कोड ...\n    if (error) {\n        delete[] data;\n        return;\n    }\n    delete[] data;\n}
\n\n

अच्छा उदाहरण (RAII):

\n
void process() {\n    std::unique_ptr<int[]> data = std::make_unique<int[]>(100);\n    // ... कोड ...\n    // स्कोप से बाहर निकलने पर delete स्वचालित रूप से कॉल होता है\n}
\n\n

साझा स्वामित्व के लिए std::shared_ptr का उपयोग करें, कमजोर संदर्भों के लिए std::weak_ptr का उपयोग करें। आंतरिक डेटा पर कभी भी कच्चे पॉइंटर्स न लौटाएं - रेफरेंस या स्मार्ट पॉइंटर्स का उपयोग करें।

\n\n

4. त्रुटि प्रबंधन: अपवाद और रिटर्न कोड

\n\n

क्लीन कोड के लिए त्रुटियों के स्पष्ट और पूर्वानुमानित प्रबंधन की आवश्यकता होती है। C++ में दो मुख्य दृष्टिकोण हैं: अपवाद और रिटर्न कोड। प्रोजेक्ट के भीतर एक शैली चुनें।

\n\n

खराब उदाहरण (त्रुटियों को अनदेखा करना):

\n
int divide(int a, int b) {\n    return a / b; // शून्य से भाग!\n}
\n\n

अच्छा उदाहरण (अपवाद):

\n
int divide(i                

ब्लॉग

पुस्तक अनुशंसाएँ