यह लेख रूबी में विधि प्रतिनिधिमंडल के बारे में है।
आप सीखेंगे कि delegate
का उपयोग कैसे करें विधि, Forwardable
मॉड्यूल और SimpleDelegator
कक्षा।
हमें प्रतिनिधिमंडल की आवश्यकता क्यों है ?
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, कक्षाओं के एक साथ काम करने के दो तरीके हैं।
वे हैं :
- विरासत
- रचना
वंशानुक्रम के साथ, आप वर्ग पदानुक्रम बनाते हैं, जहां एक अभिभावक वर्ग किसी भी वर्ग के साथ विधियों, स्थिरांक और आवृत्ति चर परिभाषाओं को साझा करता है जो इससे प्राप्त होता है।
उदाहरण के लिए :
रूबी में, प्रत्येक वस्तु Object
. से विरासत में मिलती है डिफ़ॉल्ट रूप से कक्षा।
इसलिए आपको puts
. जैसी विधियों तक पहुंच प्राप्त होती है , class
&object_id
।
रचना के साथ एक वर्ग दूसरे वर्ग से वस्तुओं का निर्माण (या दिया जाता है) करता है ... फिर वह इन वस्तुओं का उपयोग उन्हें कार्य सौंपने के लिए करता है।
उदाहरण के लिए :
एक कंप्यूटर कई भागों (वस्तुओं) से बना होता है और प्रत्येक भाग एक काम को अच्छी तरह से करना जानता है।
यदि आप स्क्रीन पर कुछ प्रस्तुत करना चाहते हैं तो कंप्यूटर ग्राफिक्स कार्ड को बताएगा कि क्या दिखाना है, लेकिन यह नहीं कि कैसे करना है।
वह है रचना !
लेकिन क्या होगा यदि आप कंप्यूटर हैं और आप ग्राफिक्स कार्ड विधियों तक पहुंच देना चाहते हैं?
आपको उनके बीच किसी तरह का "पुल" बनाना होगा।
आइए देखें कि यह कैसे करना है।
रूबी विधि प्रतिनिधिमंडल - उदाहरण
हमारे पास दो वर्ग हैं:
Computer
Memory
निम्न कोड को देखते हुए :
क्लास कंप्यूटर डीफ़ इनिशियलाइज़ @मेमोरी =मेमोरी। न्यू एंडएंडक्लास मेमोरी डीफ़ इनिशियलाइज़ @डेटा =[] एंड डीफ़ राइट (डेटा) @डेटा <<डेटा एंड डीफ़ रीड (इंडेक्स) @डेटा [इंडेक्स] एंडेंडकंप्यूटर =कंप्यूटर.नया
हम केवल Computer
. के माध्यम से मेमोरी तक पहुंचने में सक्षम होना चाहते हैं ।
यह कई कारणों से हो सकता है :
- आपके पास केवल 1 मेमोरी यूनिट है, इसका मतलब है कि आपको केवल 1 मेमोरी ऑब्जेक्ट चाहिए। एक वस्तु में पहुंच को केंद्रीकृत करके आप उसे प्राप्त कर सकते हैं।
- आप यह नियंत्रित करना चाहते हैं कि कौन मेमोरी (विभिन्न एप्लिकेशन) तक पहुंच सकता है और मेमोरी के किन हिस्सों का वे उपयोग कर सकते हैं।
- आप सुरक्षा या डिबगिंग उद्देश्यों के लिए प्रत्येक मेमोरी एक्सेस को लॉग करना चाहते हैं।
अब, यदि आप ऐसा करने का प्रयास करते हैं :
कंप्यूटर.लिखें("रूबीगाइड्स")
यह NoMethodError
के साथ विफल हो जाएगा क्योंकि कोई write
नहीं है Computer
पर विधि ।
अपरिभाषित विधि 'लिखें'
Computer
वर्ग नहीं जानता किwrite
से आपका क्या मतलब है ।जब तक...
आप एक
write
. बनाएं विधि!यहां बताया गया है :
क्लास कंप्यूटर डीफ़ इनिशियलाइज़ @memory =Memory.new end def write(data) @memory.write(data) end def read(index) @memory.read(index) endendहम अनुरोधों को
@memory
. पर भेज रहे हैं वस्तु।वह विधि प्रतिनिधिमंडल है।
<ब्लॉकक्वॉट>नोट :यह इन विधियों को आपके सार्वजनिक इंटरफ़ेस का हिस्सा बनाता है (वे सभी के लिए उपलब्ध हो जाते हैं) और आप हमेशा ऐसा नहीं चाहते हैं।
क्या किसी प्रकार का विधि प्रतिनिधिमंडल के लिए शॉर्टकट . है ?
हाँ!
आइए एक नजर डालते हैं...
फॉरवर्डेबल मॉड्यूल का उपयोग कैसे करें
अब :
आप
Forwardable
. का उपयोग कर सकते हैं प्रतिनिधि विधियों को परिभाषित करने के लिए रूबी के साथ मॉड्यूल शामिल है।यह इस तरह काम करता है :
'फॉरवर्डेबल' क्लास की आवश्यकता है कंप्यूटर फॉरवर्डेबल def_delegators :@memory, :read, :write def Initialize @memory =Memory.new endendका विस्तार करेंयह आपको हमारे द्वारा पहले बनाए गए तरीकों को हटाने की अनुमति देता है और यह वही काम करेगा।
Forwardable आपके लिए विधि तर्क (ब्लॉक सहित!) का ध्यान रखेगा, इसलिए आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।
क्या यह अच्छा नहीं है?
रेल प्रतिनिधि पद्धति का उपयोग कैसे करें
यदि आप रेल, या स्वयं ActiveSupport रत्न का उपयोग कर रहे हैं, तो आपके पास
delegate
तक पहुंच है विधि।यह इस तरह काम करता है :
कक्षा कंप्यूटर प्रतिनिधि :पढ़ें, :लिखें, को :@memory def इनिशियलाइज़ @memory =Memory.new endend
delegate
विधि एकprefix
लेती है तर्क, जो आपको विधि नामों में एक उपसर्ग जोड़ने की अनुमति देता है।उदाहरण :
कक्षा कंप्यूटर प्रतिनिधि:पढ़ें, लिखें, उपसर्ग:"मेमोरी", से::@मेमोरी डीईएफ़ इनिशियलाइज़ @memory =Memory.new endendपरिणामस्वरूप दो विधियां :
memory_read
memory_write
SimpleDelegator के साथ सब कुछ कैसे डेलिगेट करें
आपके द्वारा अभी सीखी गई इन तकनीकों का उपयोग विशिष्ट विधियों को अग्रेषित करने या प्रत्यायोजित करने के लिए किया जाता है।
लेकिन अगर आप किसी वस्तु को लपेटना चाहते हैं और उसकी सभी विधियों को उजागर करना चाहते हैं...
आप SimpleDelegator
. का उपयोग कर सकते हैं कक्षा!
यहां बताया गया है :
आवश्यकता 'प्रतिनिधि' वर्ग CoolArrayअब
CoolArray
आपके द्वारा पास की गई वस्तु की तरह व्यवहार करता हैnew
।यह क्यों उपयोगी है?
आप मूल वर्ग को बदले बिना इस ऑब्जेक्ट में नए तरीके जोड़ सकते हैं।
वीडियो ट्यूटोरियल
सारांश
आपने रूबी में वस्तु संरचना के बारे में सीखा है और विभिन्न तकनीकों का उपयोग करके विधियों को कैसे सौंपना है!
अगर आपको यह लेख अच्छा लगा हो तो कृपया इसे शेयर करें अपने रूबी दोस्तों के साथ।
पढ़ने के लिए धन्यवाद