C++ में SOLID सिद्धांत: स्वच्छ कोड के लिए व्यावहारिक गाइड

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

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

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

परिचय: C++ डेवलपर के लिए SOLID क्यों महत्वपूर्ण है?

\n\n

SOLID पाँच मौलिक ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग सिद्धांतों का संक्षिप्त नाम है, जिसे रॉबर्ट मार्टिन (अंकल बॉब) ने प्रतिपादित किया। C++ डेवलपर के लिए, ये सिद्धांत केवल सैद्धांतिक नहीं हैं, बल्कि एक व्यावहारिक उपकरण हैं जो लचीले, रखरखाव योग्य और परीक्षण योग्य एप्लिकेशन बनाने में मदद करते हैं। C++ की दुनिया में, जहाँ मेमोरी प्रबंधन और प्रदर्शन महत्वपूर्ण हैं, SOLID का पालन करने से "स्पेगेटी कोड" से बचा जा सकता है और रिफैक्टरिंग आसान हो जाती है।

\n\n

इस लेख में, हम C++ में ठोस उदाहरणों के साथ प्रत्येक SOLID सिद्धांत को समझेंगे। आप देखेंगे कि कैसे सिद्धांतों का उल्लंघन समस्याएँ पैदा करता है, और उन्हें कैसे ठीक किया जाए। हम आधुनिक C++ (C++11/14/17/20) का उपयोग करेंगे ताकि उदाहरण प्रासंगिक हों।

\n\n

1. Single Responsibility Principle (SRP) — एकल जिम्मेदारी का सिद्धांत

\n\n

सिद्धांत का सार

\n

एक क्लास में बदलाव का केवल एक ही कारण होना चाहिए। दूसरे शब्दों में, प्रत्येक क्लास सिस्टम की केवल एक कार्यक्षमता या पहलू के लिए जिम्मेदार होती है।

\n\n

C++ में SRP का उल्लंघन

\n

एक ऐसी क्लास पर विचार करें जो SRP का उल्लंघन करती है: यह एक साथ रिपोर्ट के डेटा और उसके फ़ॉर्मेटिंग का प्रबंधन करती है।

\n\n
class Report {\npublic:\n    void generateReport(const std::vector<Data>& data) {\n        // डेटा प्रोसेसिंग का लॉजिक\n        m_data = data;\n    }\n    \n    void saveToFile(const std::string& filename) {\n        // फ़ाइल में सेव करने का लॉजिक\n        std::ofstream file(filename);\n        for (const auto& item : m_data) {\n            file << item.toString() << "\\n";\n        }\n    }\n    \n    void printToConsole() {\n        // कंसोल पर आउटपुट का लॉजिक\n        for (const auto& item : m_data) {\n            std::cout << item.toString() << std::endl;\n        }\n    }\n    \nprivate:\n    std::vector<Data> m_data;\n};
\n\n

समस्या: यदि आउटपुट का फ़ॉर्मेट बदलता है, तो Report क्लास को बदलना होगा। यदि डेटा स्टोर करने का तरीका बदलता है — तो भी। यह SRP का उल्लंघन है।

\n\n

समाधान: जिम्मेदारी को विभाजित करें

\n\n
// केवल रिपोर्ट डेटा के लिए जिम्मेदार\nclass ReportData {\npublic:\n    void addData(const Data& item) {\n        m_data.push_back(item);\n    }\n    \n    const std::vector<Data>& getData() const {\n        return m_data;\n    }\n    \nprivate:\n    std::vector<Data> m_data;\n};\n\n// केवल सेव करने के लिए जिम्मेदार\nclass FileSaver {\npublic:\n    void save(const std::string& filename, const ReportData& report) {\n        std::ofstream file(filename);\n        for (const auto& item : report.getData()) {\n            file << item.toString() << "\\n";\n        }\n    }\n};\n\n// केवल कंसोल पर प्रिंट करने के लिए जिम्मेदार\nclass ConsolePrinter {\npublic:\n    void print(const ReportData& report) {\n        for (const auto& item : report.getData()) {\n            std::cout << item.toString() << std::endl;\n        }\n    }\n};
\n\n

अब प्रत्येक क्लास में बदलाव का एक ही कारण है, जो कोड को अधिक लचीला और परीक्षण में आसान बनाता है।

\n\n

2. Open-Closed Principle (OCP) — खुले/बंद का सिद्धांत

\n\n

सिद्धांत का सार

\n

सॉफ़्टवेयर संस्थाएँ (क्लास, मॉड्यूल, फ़ंक्शन) विस्तार के लिए खुली होनी चाहिए, लेकिन संशोधन के लिए बंद। इसका मतलब है कि आपको मौजूदा कोड को बदले बिना नई कार्यक्षमता जोड़ने में सक्षम होना चाहिए।

\n\n

C++ में OCP का उल्लंघन

\n

एक डिस्काउंट कैलकुलेशन सिस्टम की कल्पना करें, जहाँ प्रत्येक ग्राहक प्रकार के लिए if-else का उपयोग किया गया है।

\n\n
class DiscountCalculator {\npublic:\n    double calculateDiscount(const std::string& customerType, double amount) {\n        if (customerType == "regular") {\n            return amount * 0.1; // 10%\n        } else if (customerType == "vip") {\n            return amount * 0.2; // 20%\n        } else if (customerType == "premium") {\n            return amount * 0.3; // 30%\n        }\n                

ब्लॉग

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