प्रतिनिधिमंडल (वस्तु-उन्मुख प्रोग्रामिंग)

From alpha
Jump to navigation Jump to search

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

प्रत्यायोजन शब्द का प्रयोग वस्तुओं के बीच विभिन्न अन्य संबंधों के लिए भी किया जाता है; अधिक के लिए प्रतिनिधिमंडल (प्रोग्रामिंग) देखें। अक्सर भ्रमित होने वाली अवधारणाएं किसी अन्य वस्तु का उपयोग कर रही होती हैं, जिसे अधिक सटीक रूप से परामर्श या वस्तु एकत्रीकरण कहा जाता है; और किसी अन्य वस्तु पर संबंधित सदस्य का मूल्यांकन करके एक वस्तु पर एक सदस्य का मूल्यांकन करना, विशेष रूप से प्राप्त करने वाली वस्तु के संदर्भ में, जिसे अधिक सटीक रूप से अग्रेषण (वस्तु-उन्मुख प्रोग्रामिंग) के रूप में संदर्भित किया जाता है (जब एक रैपर ऑब्जेक्ट खुद को लपेटे हुए ऑब्जेक्ट में पास नहीं करता है)।[1][2][lower-alpha 1] प्रतिनिधिमंडल पैटर्न डेलिगेशन को लागू करने के लिए एक सॉफ़्टवेयर डिज़ाइन पैटर्न है, हालांकि इस शब्द का उपयोग परामर्श या अग्रेषण के लिए भी किया जाता है।

अवलोकन

तथाकथित स्व-कॉल भेजने के लिए विधि लुकअप नियमों का उपयोग करने वाली प्रोग्रामिंग भाषा सुविधा के रूप में प्रतिनिधिमंडल की इस भावना को हेनरी लिबरमैन ने अपने 1986 के पेपर यूजिंग प्रोटोटाइपिकल ऑब्जेक्ट्स टू इंप्लीमेंट शेयर्ड बिहेवियर इन ऑब्जेक्ट-ओरिएंटेड सिस्टम्स में परिभाषित किया था।

प्रत्यायोजन गतिशील बाइंडिंग (कंप्यूटर विज्ञान) पर निर्भर है, क्योंकि इसके लिए आवश्यक है कि दी गई विधि कॉल रनटाइम पर कोड के विभिन्न खंडों को आमंत्रित कर सके[citation needed]. इसका उपयोग प्रोग्राम घटकों के व्यवहार को अनुकूलित करने के साधन के रूप में पूरे macOS (और इसके पूर्ववर्ती NeXTStep) में किया जाता है।[3] यह विंडोज़ को प्रबंधित करने के लिए एकल ओएस-प्रदत्त क्लास का उपयोग करने जैसे कार्यान्वयन को सक्षम बनाता है, क्योंकि क्लास एक प्रतिनिधि लेता है जो प्रोग्राम-विशिष्ट है और आवश्यकतानुसार डिफ़ॉल्ट व्यवहार को ओवरराइड कर सकता है। उदाहरण के लिए, जब उपयोगकर्ता क्लोज बॉक्स पर क्लिक करता है, तो विंडो प्रबंधक प्रतिनिधि को windowShouldClose: कॉल भेजता है, और यदि विंडो की सामग्री द्वारा दर्शाया गया सहेजा नहीं गया डेटा है, तो प्रतिनिधि विंडो को बंद करने में देरी कर सकता है।

प्रत्यायोजन को स्वयं के देर से बाइंडिंग के रूप में चित्रित किया जा सकता है (और अग्रेषण (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) से अलग किया जा सकता है):[4]

... messages sent to the self (or this) variable in the parent will "come back" to the object that originally received the message.

वह यह है कि self किसी विधि में प्राप्त वस्तु की परिभाषा परिभाषा के समय (जैसे संकलन समय या जब फ़ंक्शन किसी वस्तु से जुड़ा होता है) पर उस वस्तु से स्थिर रूप से बंधी नहीं होती है, बल्कि मूल्यांकन के समय, यह मूल वस्तु से बंधी होती है।

यह तर्क दिया गया है कि प्रोग्राम कोड को अधिक पठनीय और समझने योग्य बनाने के लिए कुछ मामलों में प्रतिनिधिमंडल को इनहेरिटेंस (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) के लिए प्राथमिकता दी जा सकती है।[5] स्पष्ट प्रतिनिधिमंडल काफी व्यापक होने के बावजूद, अपेक्षाकृत कुछ प्रमुख प्रोग्रामिंग भाषाएं वंशानुक्रम के वैकल्पिक मॉडल के रूप में प्रतिनिधिमंडल को लागू करती हैं। प्रत्यायोजन और विरासत के बीच सटीक संबंध जटिल है; कुछ लेखक उन्हें समकक्ष मानते हैं, या एक को दूसरे का विशेष मामला मानते हैं।[6]


प्रतिनिधिमंडल के लिए भाषा समर्थन

उन भाषाओं में जो विधि लुकअप नियमों के माध्यम से प्रतिनिधिमंडल का समर्थन करते हैं, विधि प्रेषण को उसी तरह परिभाषित किया जाता है जिस तरह से इसे विरासत में आभासी तरीकों के लिए परिभाषित किया जाता है: यह हमेशा सबसे विशिष्ट विधि होती है जिसे विधि लुकअप के दौरान चुना जाता है। इसलिए यह मूल रिसीवर इकाई है जो विधि लुकअप की शुरुआत है, भले ही यह किसी अन्य ऑब्जेक्ट पर नियंत्रण पारित कर चुका हो (एक प्रतिनिधिमंडल लिंक के माध्यम से, ऑब्जेक्ट संदर्भ नहीं)।

प्रत्यायोजन का लाभ यह है कि यह रन टाइम पर हो सकता है और केवल कुछ प्रकार की संस्थाओं के सबसेट को प्रभावित कर सकता है और रन टाइम पर हटाया भी जा सकता है। इसके विपरीत, वंशानुक्रम आमतौर पर उदाहरणों के बजाय प्रकार को लक्षित करता है, और संकलन समय तक सीमित है। दूसरी ओर, इनहेरिटेंस को स्थिर रूप से टाइप-चेक किया जा सकता है, जबकि प्रतिनिधिमंडल आम तौर पर जेनरिक के बिना नहीं हो सकता है (हालांकि प्रतिनिधिमंडल का एक प्रतिबंधित संस्करण स्थिर रूप से टाइप-सुरक्षित हो सकता है[7]). विशिष्ट वस्तुओं के लिए प्रत्यायोजन को रन-टाइम इनहेरिटेंस कहा जा सकता है।

यहां सी शार्प (प्रोग्रामिंग भाषा)|सी#/जावा (प्रोग्रामिंग भाषा) जैसी भाषा में एक छद्मकोड उदाहरण दिया गया है:

class A {
    void foo() {
        // "this" also known under the names "current", "me" and "self" in other languages
        this.bar();
    }

    void bar() {
        print("a.bar");
    }
}

class B {
    private delegate A a; // delegation link

    public B(A a) {
        this.a = a;
    }

    void foo() {
        a.foo(); // call foo() on the a-instance
    }

    void bar() {
        print("b.bar");
    }
}

a = new A();
b = new B(a); // establish delegation between two objects

कॉलिंग b.foo() परिणामस्वरूप b.bar मुद्रित हो जाएगा, चूँकि this मूल रिसीवर ऑब्जेक्ट को संदर्भित करता है, b, के संदर्भ में a. की परिणामी अस्पष्टता this को ऑब्जेक्ट सिज़ोफ्रेनिया कहा जाता है।

निहितार्थ का अनुवाद करना this एक स्पष्ट पैरामीटर में, कॉल (in B, साथ a एक प्रतिनिधि) a.foo() का अनुवाद करता है A.foo(b), के प्रकार का उपयोग करते हुए a विधि समाधान के लिए, लेकिन प्रतिनिधि वस्तु b के लिए this तर्क।

वंशानुक्रम का उपयोग करते हुए, अनुरूप कोड (इस बात पर जोर देने के लिए बड़े अक्षरों का उपयोग करना कि संकल्प कक्षाओं पर आधारित है, वस्तुओं पर नहीं) है:

class A {
    void foo() {
        this.bar();
    }

    void bar() {
        print("A.bar");
    }
}

class B extends A {
    public B() {}

    void foo() {
        super.foo(); // call foo() of the superclass (A)
    }

    void bar() {
        print("B.bar");
    }
}

b = new B();

कॉलिंग b.foo() का परिणाम बी.बार होगा। इस मामले में, this असंदिग्ध है: एक ही वस्तु है, b, और this.bar() उपवर्ग पर विधि का समाधान करता है।

सामान्य तौर पर प्रोग्रामिंग भाषाएं एक भाषा अवधारणा के रूप में प्रतिनिधिमंडल के इस असामान्य रूप का समर्थन नहीं करती हैं, लेकिन कुछ अपवाद भी हैं[citation needed].

दोहरी विरासत

यदि भाषा प्रतिनिधिमंडल और विरासत दोनों का समर्थन करती है तो कोई भी एक ही समय में दोनों तंत्रों का उपयोग करके दोहरी विरासत कर सकता है

class C extends A {
    delegationlink D d;
}

यह विधि लुकअप के लिए अतिरिक्त नियमों की मांग करता है, क्योंकि अब संभावित रूप से दो विधियां हैं जिन्हें सबसे विशिष्ट (दो लुकअप पथों के कारण) के रूप में दर्शाया जा सकता है।

संबंधित क्षेत्र

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

हाल ही में प्रतिनिधिमंडल वितरण पर भी काम किया गया है, उदाहरण के लिए। एक खोज इंजन के ग्राहक (सस्ते होटल के कमरे ढूंढना) सर्वश्रेष्ठ हिट और सामान्य पुन: प्रयोज्य कार्यक्षमता को साझा करने के लिए प्रतिनिधिमंडल का उपयोग करके एक साझा इकाई का उपयोग कर सकते हैं।

2003 में अर्न्स्ट और लोरेंज एकत्रीकरण (वस्तु-उन्मुख प्रोग्रामिंग) में सलाह समाधान के लिए प्रतिनिधिमंडल का भी सुझाव दिया गया है।

यह भी देखें

अंतर करना:

  • प्रतिनिधि (सीएलआई)
  • प्रतिनिधिमंडल (प्रोग्रामिंग)
  • वस्तु एकत्रीकरण
  • अग्रेषण (वस्तु-उन्मुख प्रोग्रामिंग)

टिप्पणियाँ

  1. Beck 1997 uses the terms "simple delegation" for when the receiving object does not have access to the sending object, and "self delegation" for when the receiving object does have access to the sending object; in modern language these are "forwarding" and "delegation", as used in this article.


संदर्भ

  1. Gamma et al. 1995, "Delegation", pp. 20–21.
  2. Beck 1997, "Delegation", pp. 64–69.
  3. Apple (2009-08-20). "Cocoa Fundamentals Guide: Delegates and Data Sources". Apple Developer Connection. Retrieved 2009-09-11.
  4. "Intersecting Classes and Prototypes". Perspectives of Systems Informatics: 5th International Andrei Ershov Memorial Conference, PSI 2003, Akademgorodok, Novosibirsk, Russia, July 9-12, 2003, Revised Papers. p. 38.
  5. [1]Trygve Reenskaug, Dept. of Informatics, University of Oslo, "The Case for Readable Code" (2007)
  6. Stein, Lynn Andrea. प्रत्यायोजन विरासत है. OOPSLA '87 Conference proceedings on Object-oriented programming systems, languages and applications. pp. 138–146. doi:10.1145/38807.38820.
  7. Günter Kniesel (1999-11-19). "Type-Safe Delegation for Run-Time Component Adaptation". ECOOP' 99 — Object-Oriented Programming. Lecture Notes in Computer Science. Vol. 1628. Springer. pp. 351–366. CiteSeerX 10.1.1.33.7584. doi:10.1007/3-540-48743-3_16. ISBN 978-3-540-66156-6. Archived from the original on 2015-03-04. Retrieved 2015-03-04. यह पेपर विशुद्ध रूप से अग्रेषण-आधारित ऑब्जेक्ट संरचना के पूरक के रूप में ऑब्जेक्ट-आधारित विरासत (जिसे प्रतिनिधिमंडल के रूप में भी जाना जाता है) का प्रस्ताव करता है। यह क्लास-आधारित ऑब्जेक्ट मॉडल में प्रतिनिधिमंडल का एक प्रकार का सुरक्षित एकीकरण प्रस्तुत करता है और दिखाता है कि यह अग्रेषण-आधारित घटक इंटरैक्शन के सामने आने वाली समस्याओं को कैसे दूर करता है, यह घटकों की स्वतंत्र विस्तारशीलता और अप्रत्याशित, गतिशील घटक अनुकूलन का समर्थन कैसे करता है।{{cite book}}: CS1 maint: bot: original URL status unknown (link)


बाहरी संबंध