C++ में SOLID सिद्धांत: सिद्धांत और व्यवहार A से Z तक

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

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

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

C++ में SOLID सिद्धांत: सिद्धांत और व्यवहार A से Z तक

\n\n

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

\n\n

SOLID क्या है और इसकी आवश्यकता क्यों है?

\n

SOLID नियमों का एक सेट है जो डेवलपर को "खराब" कोड से बचने में मदद करता है। इन सिद्धांतों का पालन करने से मॉड्यूल के युग्मन (coupling) में कमी और सुसंगति (cohesion) में वृद्धि होती है। C++ में, जहाँ टेम्पलेट्स और एकाधिक वंशानुक्रम की शक्तिशाली क्षमताएँ आसानी से अराजकता पैदा कर सकती हैं, SOLID एक विश्वसनीय दिशासूचक के रूप में कार्य करता है। संक्षिप्त नाम का प्रत्येक अक्षर इस प्रकार समझाया गया है:

\n
    \n
  • S — Single Responsibility Principle (एकल उत्तरदायित्व सिद्धांत)
  • \n
  • O — Open-Closed Principle (खुला/बंद सिद्धांत)
  • \n
  • L — Liskov Substitution Principle (लिस्कोव प्रतिस्थापन सिद्धांत)
  • \n
  • I — Interface Segregation Principle (इंटरफ़ेस पृथक्करण सिद्धांत)
  • \n
  • D — Dependency Inversion Principle (निर्भरता उलटाव सिद्धांत)
  • \n
\n\n

एकल उत्तरदायित्व सिद्धांत (Single Responsibility)

\n

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

\n

C++ में व्यवहार: इस सिद्धांत का उल्लंघन अक्सर "दैवीय ऑब्जेक्ट" (god objects) की ओर ले जाता है, जो सब कुछ एक साथ करते हैं।

\n
// ❌ खराब: वर्ग SRP का उल्लंघन करता है\nclass Report {\npublic:\n    void generateReport() { /* डेटा जनरेशन */ }\n    void saveToFile(const std::string& filename) { /* फ़ाइल में लिखना */ }\n    void printReport() { /* प्रिंटर पर भेजना */ }\n};\n\n// ✅ अच्छा: उत्तरदायित्व को विभाजित करें\nclass ReportData {\npublic:\n    std::string generate() { return "Report data"; }\n};\n\nclass ReportSaver {\npublic:\n    void save(const std::string& data, const std::string& filename) {\n        std::ofstream file(filename);\n        file << data;\n    }\n};\n\nclass ReportPrinter {\npublic:\n    void print(const std::string& data) { /* प्रिंट */ }\n};
\n

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

\n\n

खुला/बंद सिद्धांत (Open-Closed)

\n

सिद्धांत: सॉफ्टवेयर इकाइयाँ (वर्ग, मॉड्यूल, फ़ंक्शन) विस्तार के लिए खुली होनी चाहिए, लेकिन संशोधन के लिए बंद होनी चाहिए।

\n

C++ में व्यवहार: यह अमूर्तता (abstraction) और बहुरूपता (polymorphism) के माध्यम से प्राप्त किया जाता है।

\n
// ❌ खराब: नई आकृति जोड़ने के लिए कोड बदलना होगा\nclass AreaCalculator {\npublic:\n    double calculateArea(std::string shapeType, double param) {\n        if (shapeType == "circle") {\n            return 3.14 * param * param;\n        } else if (shapeType == "square") {\n            return param * param;\n        }\n        return 0.0;\n    }\n};\n\n// ✅ अच्छा: बहुरूपता का उपयोग करें\nclass Shape {\npublic:\n    virtual double area() const = 0;\n    virtual ~Shape() = default;\n};\n\nclass Circle : public Shape {\n    double radius;\npublic:\n    Circle(double r) : radius(r) {}\n    double area() const override { return 3.14159 * radius * radius; }\n};\n\nclass Square : public Shape {\n    double side;\npublic:\n    Square(double s) : side(s) {}\n    double area() const override { return side * side; }\n};\n\nclass AreaCalculatorOCP {\npublic:\n    double calculate(const Shape& shape) {\n        return shape.area();\n    }\n};
\n

अब एक नई आकृति (जैसे, त्रिभुज) जोड़ने के लिए A

ब्लॉग

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