प्रोग्रामिंग में डेलीगेशन एक प्रोग्राम के एक हिस्से से दूसरे हिस्से को कार्य सौंपने को संदर्भित करता है। यह ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में एक आवश्यक तकनीक है, जो यह सुनिश्चित करके स्वच्छ, रखरखाव योग्य कोड को सशक्त बनाती है कि प्रत्येक ऑब्जेक्ट या मेथड एक विशिष्ट कार्य या व्यवहार के लिए जिम्मेदार है।
रूबी और अन्य ऑब्जेक्ट-ओरिएंटेड भाषाओं में महारत हासिल करने के लिए डेलीगेशन को समझना और उपयोग करना महत्वपूर्ण है। डेलीगेशन चिंताओं के विभाजन को बढ़ावा देता है, जिससे आपका कोड अधिक मॉड्यूलर और समझने, परीक्षण करने और रिफैक्टर करने में आसान होता है।
इस लेख में, हम रूबी में डेलीगेशन प्राप्त करने के तीन तरीकों में गोता लगाएंगे: एक्सप्लिसिट डेलीगेशन का उपयोग करना, Forwardable मॉड्यूल, और ActiveSupport::Delegate (रेल्स के लिए)।
शुरू करते हैं!
रूबी में डेलीगेशन
आइए एक्सप्लिसिट डेलीगेशन — एक मेथड के भीतर एक मेथड को कॉल करने — पर चर्चा करके शुरू करें। फिर हम बिल्ट-इन Forwardable मॉड्यूल का पता लगाएंगे और यह कैसे डेलीगेशन को सुव्यवस्थित कर सकता है। अंत में, हम ActiveSupport::Delegate को कवर करेंगे, एक रेल्स-विशिष्ट डेलीगेशन टूल जिसमें कुछ आसान विशेषताएं हैं।
एक्सप्लिसिट डेलीगेशन
अपने सरलतम रूप में, डेलीगेशन को किसी अन्य मेथड के भीतर एक मेथड को स्पष्ट रूप से कॉल करके प्राप्त किया जा सकता है। यह दृष्टिकोण अक्सर तब नियोजित किया जाता है जब डेलीगेटेड मेथड एक अलग ऑब्जेक्ट से संबंधित होता है या जब डेलीगेशन इतना सरल होता है कि अधिक उन्नत तकनीकों के उपयोग की गारंटी नहीं देता है।
रूबी में एक्सप्लिसिट डेलीगेशन लागू करना सीधा है। आइए एक Printer क्लास का उदाहरण लें जो टेक्स्ट प्रिंट करने के लिए HP ऑब्जेक्ट का उपयोग करता है:
उपरोक्त उदाहरण में, Printer क्लास का प्रिंट मेथड HP क्लास के फॉर्मेट मेथड को कॉल करके फॉर्मेटिंग कार्य को स्पष्ट रूप से डेलीगेट करता है। यह डेलीगेशन प्रिंटिंग जिम्मेदारी को सरल और पठनीय तरीके से दूसरी क्लास को आउटसोर्स करता है।
एक्सप्लिसिट डेलीगेशन वास्तविक दुनिया के एप्लिकेशन में आम है, क्योंकि यह चिंताओं के विभाजन और रखरखाव योग्य कोड को बढ़ावा देने में मदद करता है। उदाहरण के लिए, आप इस तकनीक को उन एप्लिकेशन में उपयोग होते हुए पा सकते हैं जिनमें विभिन्न सेवाओं के बीच संचार की आवश्यकता होती है, जहां एक सेवा किसी विशिष्ट कार्य को करने के लिए दूसरी को कॉल करती है।
इसके अलावा, एक्सप्लिसिट डेलीगेशन थर्ड-पार्टी लाइब्रेरी के चारों ओर एडाप्टर या रैपर बनाते समय उपयोगी हो सकता है, क्योंकि यह आपको बाहरी कोड के साथ इंटरैक्शन को अलग करने की अनुमति देता है।
सारांश में, एक्सप्लिसिट डेलीगेशन रूबी में ऑब्जेक्ट्स के बीच कार्यों को डेलीगेट करने का एक सीधा और प्रभावी तरीका है। एक मेथड के भीतर एक मेथड को कॉल करके, आप आसानी से जिम्मेदारियों को डेलीगेट कर सकते हैं, जिससे आपका कोड अधिक रखरखाव योग्य बनता है और चिंताओं के विभाजन को बढ़ावा मिलता है।
रूबी का Forwardable मॉड्यूल
Forwardable मॉड्यूल एक बिल्ट-इन रूबी लाइब्रेरी है जो एक्सप्लिसिट डेलीगेशन की तुलना में मेथड को डेलीगेट करने के लिए अधिक सुव्यवस्थित और लचीला दृष्टिकोण प्रदान करता है। अपने क्लास में Forwardable मॉड्यूल को शामिल करके, आप def_delegator और def_delegators जैसे मेथड तक पहुंच प्राप्त करते हैं, जिससे डेलीगेशन आसान हो जाता है।
Forwardable मॉड्यूल के साथ शुरुआत करने के लिए, इसे अपने क्लास में शामिल करें और एक या एकाधिक मेथड को डेलीगेट करने के लिए क्रमशः def_delegator और def_delegators मेथड का उपयोग करें। आइए एक नए Formatter क्लास के साथ हमारे Printer उदाहरण को फिर से देखें और Forwardable मॉड्यूल को लागू करें:
उपरोक्त उदाहरण में, हमने Formatter क्लास से फॉर्मेट मेथड को डेलीगेट करने के लिए def_delegator का उपयोग किया है। यदि आपको एक साथ कई मेथड डेलीगेट करने की आवश्यकता है, तो आप def_delegators का उपयोग कर सकते हैं। उदाहरण के लिए, यदि Formatter क्लास में capitalize जैसे अतिरिक्त मेथड थे, तो आप उन्हें इस तरह डेलीगेट कर सकते हैं:
Forwardable मॉड्यूल का उपयोग करते समय, कुछ महत्वपूर्ण संभावित कमियों पर विचार करना चाहिए:
- सबसे पहले, सुनिश्चित करें कि डेलीगेशन का उपयोग करने से पहले लक्ष्य ऑब्जेक्ट आरंभ किया गया है। अन्यथा, आप त्रुटियों का सामना कर सकते हैं।
- दूसरा, डेलीगेशन का अत्यधिक उपयोग कोड पठनीयता में संभावित भ्रम पैदा कर सकता है, क्योंकि यह स्पष्ट नहीं हो सकता है कि कौन से मेथड क्लास से संबंधित हैं और कौन से डेलीगेटेड हैं।
- अंत में, डायरेक्ट मेथड कॉल की तुलना में Forwardable का उपयोग करते समय मामूली प्रदर्शन ओवरहेड हो सकता है। हालांकि, यह ओवरहेड आमतौर पर अधिकांश एप्लिकेशन में नगण्य होता है।
Forwardable मॉड्यूल के बारे में अधिक गहन जानकारी के लिए, Forwardable दस्तावेज़ीकरण देखें।
रेल्स एप्लिकेशन के लिए ActiveSupport::Delegate
ActiveSupport::Delegate रेल्स द्वारा प्रदान की गई एक डेलीगेशन उपयोगिता है, जो संबंधित ऑब्जेक्ट्स को मेथड डेलीगेट करने के लिए संक्षिप्त सिंटैक्स प्रदान करती है। जबकि यह रूबी के बिल्ट-इन Forwardable मॉड्यूल के साथ समानताएं साझा करता है, ActiveSupport::Delegate रेल्स एप्लिकेशन के लिए अनुकूलित अतिरिक्त विकल्प और सुविधाएँ प्रदान करता है।
ActiveSupport::Delegate का उपयोग करने के लिए, बस अपने क्लास में delegate मेथड को कॉल करें और डेलीगेट किए जाने वाले मेथड(एस) को लक्ष्य ऑब्जेक्ट के साथ निर्दिष्ट करें। आइए Printer और Formatter उदाहरण को फिर से देखें और ActiveSupport::Delegate का उपयोग करके डेलीगेशन लागू करें:
ActiveSupport::Delegate अतिरिक्त विकल्प और सुविधाएँ प्रदान करता है जो विभिन्न परिदृश्यों में उपयोगी हो सकते हैं। उदाहरण के लिए, आप डेलीगेटेड मेथड को प्रीफिक्स करने के लिए :prefix विकल्प का उपयोग कर सकते हैं। यदि आप एक साथ कई मेथड डेलीगेट करना चाहते हैं, तो बस उन्हें to: विकल्प से पहले सूचीबद्ध करें:
यह Printer क्लास में formatter_format, formatter_bold, और formatter_italic जैसे मेथड जेनरेट करता है, जो Formatter क्लास में संबंधित मेथड को डेलीगेट करते हैं।
ActiveSupport::Delegate आमतौर पर वास्तविक दुनिया के रेल्स प्रोजेक्ट्स में संबंधित मॉडल या ऑब्जेक्ट्स के बीच मेथड डेलीगेट करने के लिए उपयोग किया जाता है। उदाहरण के लिए, यदि आपके पास एक User मॉडल है जो belongs_to एक ऑर्गनाइज़ेशन है, तो आप organization मॉडल से name मेथड को User मॉडल में इस तरह डेलीगेट कर सकते हैं:
यह आपको उपयोगकर्ता ऑब्जेक्ट के माध्यम से ऑर्गनाइज़ेशन के नाम तक पहुंचने की अनुमति देता है: user.organization_name।
निष्कर्ष में, ActiveSupport::Delegate रेल्स एप्लिकेशन के लिए एक शक्तिशाली उपकरण है जो मेथड के संक्षिप्त और अभिव्यंजक डेलीगेशन को सक्षम करता है। इसके अतिरिक्त विकल्पों और सुविधाओं का लाभ उठाकर, आप रखरखाव योग्य और सुव्यवस्थित कोड बना सकते हैं जो रेल्स प्रोजेक्ट्स के संदर्भ में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के सिद्धांतों का पालन करता है।
ActiveSupport::Delegate और सभी उपलब्ध विकल्पों के बारे में अधिक गहन जानकारी के लिए, रेल्स ActiveSupport दस्तावेज़ीकरण देखें।
डेलीगेशन तकनीकों की तुलना
एक्सप्लिसिट डेलीगेशन डेलीगेशन के लिए सबसे सीधा दृष्टिकोण है, जिसके लिए मैन्युअल रूप से परिभाषित मेथड की आवश्यकता होती है जो डेलीगेटेड ऑब्जेक्ट से वांछित मेथड को कॉल करते हैं। हालांकि यह तकनीक सरल है और किसी बाहरी लाइब्रेरी की आवश्यकता नहीं है, यह डेलीगेटेड मेथड की बढ़ती संख्या के लिए बहुत वर्बोज़ हो सकती है।
रूबी में बिल्ट-इन Forwardable मॉड्यूल, def_delegator और def_delegators मेथड का उपयोग करके मेथड को डेलीगेट करने का एक अधिक सुव्यवस्थित तरीका प्रदान करता है।
ActiveSupport::Delegate, रेल्स के ActiveSupport लाइब्रेरी का हिस्सा, मेथड डेलीगेशन को संभालने का एक घोषणात्मक तरीका प्रदान करता है। एक साफ सिंटैक्स और प्रीफिक्सिंग जैसे अतिरिक्त विकल्पों के साथ, यह रेल्स संदर्भ में एक अभिव्यंजक उपकरण है। एक्सप्लिसिट डेलीगेशन की तुलना में, ActiveSupport::Delegate अधिक अभिव्यंजक और कम वर्बोज़ है, विशेष रूप से जब कई मेथड डेलीगेट किए जा रहे हों। हालांकि, इसे रेल्स की आवश्यकता होती है, इसलिए यह गैर-रेल्स रूबी प्रोजेक्ट्स के लिए उपयुक्त नहीं है।
डेलीगेशन तकनीक चुनना आपकी विशिष्ट आवश्यकताओं और एप्लिकेशन पर निर्भर करता है। जबकि एक्सप्लिसिट डेलीगेशन सरलता और स्पष्टता प्रदान करता है, Forwardable मॉड्यूल एक अधिक सुव्यवस्थित दृष्टिकोण प्रदान करता है, और ActiveSupport::Delegate एक शक्तिशाली, रेल्स-विशिष्ट समाधान प्रदान करता है। इन विकल्पों को समझने से आप वह तकनीक चुन सकते हैं जो आपके प्रोजेक्ट और कोडिंग शैली के लिए सबसे उपयुक्त है।
समापन
एक्सप्लिसिट डेलीगेशन से लेकर बिल्ट-इन Forwardable मॉड्यूल या रेल्स-विशिष्ट ActiveSupport::Delegate का उपयोग करने तक, प्रत्येक तकनीक अपने अद्वितीय लाभ और संभावित कमियां प्रदान करती है। आपको जिस तकनीक को चुनना चाहिए वह आपके विशिष्ट संदर्भ, आपके प्रोजेक्ट की प्रकृति, और आपकी व्यक्तिगत कोडिंग शैली पर निर्भर करता है।
इन तकनीकों को समझना न केवल आपके रूबी प्रोग्रामिंग कौशल को व्यापक बनाता है बल्कि आपको अधिक मॉड्यूलर, पठनीय, और रखरखाव योग्य कोड लिखने के लिए भी सुसज्जित करता है। इस ज्ञान के साथ, आप वाक्पटु डिजाइन के साथ जटिल समस्याओं से निपटने के लिए बेहतर तैयार हैं।
हैप्पी डेलीगेटिंग!
P.S. यदि आप Ruby Magic पोस्ट को प्रेस से निकलते ही पढ़ना चाहते हैं, तो हमारे Ruby Magic न्यूज़लेटर की सदस्यता लें और कभी भी एक भी पोस्ट न चूकें!
Jeff Morhous
हमारे अतिथि लेखक Jeff Morhous एक सॉफ्टवेयर इंजीनियर हैं जो मरीजों को उनकी आवश्यक दवाएं प्राप्त करने में मदद करने के लिए कोड लिखते हैं और बग ठीक करते हैं। इन दिनों वे रूबी ऑन रेल्स के साथ वेब एप्लिकेशन बनाने पर केंद्रित हैं, लेकिन अतीत में उन्होंने iOS और Android डेवलपमेंट के लिए Swift, Java, और Kotlin का उपयोग किया है।
Jeff Morhous के सभी लेख