परिचय: OOP बनाम फंक्शनल दृष्टिकोण का विवाद क्यों खत्म नहीं होता?
\n\nयदि आपने कभी सोचा है कि नए प्रोजेक्ट के लिए C++ में कौन सी प्रोग्रामिंग शैली चुनें, तो आप अकेले नहीं हैं। C++ में फंक्शनल प्रोग्रामिंग और ऑब्जेक्ट-ओरिएंटेड दृष्टिकोण के बीच विवाद दशकों से चल रहा है। एक तरफ क्लासिक OOP है, जो विश्वविद्यालयों में पढ़ाया जाता है। दूसरी तरफ आधुनिक फंक्शनल तकनीकें हैं, जो C++11, C++14, C++17 और C++20 मानक लेकर आए हैं।
\n\nसाइट pythonlib.ru पर हम अक्सर आर्किटेक्चरल निर्णयों पर चर्चा करते हैं, और आज इस प्रश्न को हमेशा के लिए सुलझाने का समय आ गया है। कौन सी शैली तेज़ है? कौन सी बनाए रखना आसान है? और सबसे महत्वपूर्ण बात - क्या उन्हें जोड़ा जा सकता है?
\n\nइस लेख में हम कट्टरता से एक प्रतिमान की रक्षा नहीं करेंगे। इसके बजाय, हम वास्तविक कोड उदाहरणों का विश्लेषण करेंगे, प्रत्येक दृष्टिकोण के फायदे और नुकसान दिखाएंगे और व्यावहारिक सुझाव देंगे। चलिए शुरू करते हैं!
\n\nC++ में प्रतिमानों का संक्षिप्त अवलोकन
\n\nगहराई में जाने से पहले, आइए जल्दी से याद करें कि बात किस बारे में है।
\n\nऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP)
\n\nC++ में OOP तीन स्तंभों पर आधारित है: एनकैप्सुलेशन, इनहेरिटेंस और पॉलीमॉर्फिज्म। आप क्लासेस बनाते हैं जो डेटा और उनके प्रसंस्करण के तरीकों को जोड़ते हैं। यह क्लासिक दृष्टिकोण है जो 90 और 2000 के दशक में हावी था।
\n\nclass Animal {\npublic:\n virtual void speak() const = 0;\n virtual ~Animal() = default;\n};\n\nclass Dog : public Animal {\npublic:\n void speak() const override {\n std::cout << "Woof!" << std::endl;\n }\n};\n\nclass Cat : public Animal {\npublic:\n void speak() const override {\n std::cout << "Meow!" << std::endl;\n }\n};\n\nvoid makeSound(const Animal& animal) {\n animal.speak();\n}\n\n\nफंक्शनल प्रोग्रामिंग (FP)
\n\nC++ में फंक्शनल दृष्टिकोण शुद्ध Haskell नहीं है, बल्कि एक अनिवार्य भाषा के ढांचे में FP के विचारों का उपयोग है। मुख्य तत्व: लैम्ब्डा-फंक्शन, डेटा की अपरिवर्तनीयता, उच्च-क्रम फंक्शन और कम्पोज़ीशन।
\n\nstd::vector<int> numbers = {1, 2, 3, 4, 5};\n\n// फंक्शनल शैली: फ़िल्टरिंग और ट्रांसफॉर्मेशन\nauto result = numbers\n | std::views::filter([](int n) { return n % 2 == 0; })\n | std::views::transform([](int n) { return n * n; });\n\nfor (int n : result) {\n std::cout << n << " "; // आउटपुट: 4 16\n}\n\n\nव्यवहार में तुलना: तीन विशिष्ट कार्य
\n\nआइए तीन वास्तविक कार्य लें जिनका सामना C++ डेवलपर करता है, और देखें कि OOP और FP उन्हें कैसे हल करते हैं।
\n\nकार्य 1: डेटा संग्रह का प्रसंस्करण
\n\nशर्त: ऑर्डर की एक सूची है, महंगे (मूल्य > 1000) को फ़िल्टर करना है, तिथि के अनुसार सॉर्ट करना है और शीर्ष-5 प्रदर्शित करना है।
\n\nOOP शैली:
\n\nclass OrderProcessor {\npublic:\n void addOrder(Order order) { orders_.push_back(std::move(order)); }\n \n std::vector<Order> getTopExpensiveRecent(int count) const {\n auto filtered = orders_;\n filtered.erase(\n std::remove_if(filtered.begin(), filtered.end(),\n [](const Order& o) { return o.price <= 1000; }),\n filtered.end());\n \n std::sort(filtered.begin(), filtered.end(),\n [](const Order& a, const Order& b) {\n return a.date > b.date;\n });\n \n if (filtered.size() > count) {\n filtered.resize(count);\n }\n return filtered;\n }\n \nprivate:\n std::vector<Order> orders_;\n};\n\n\nफंक्शनल शैली:
\n\nauto getTopExpensiveRecent(const std::vector<Order>& orders, int count) {\n return orders\n | std::views::filter([](const Order& o) { return o.price >