डिलिगेशन (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)

From Vigyanwiki

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

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

सिंहावलोकन

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

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

प्रतिनिधिमंडल की विशेषता हो सकती है (और अग्रेषण (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) से अलग) स्वयं के देर से बाध्यकारी के रूप में:[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]). प्रतिनिधिमंडल को विशिष्ट वस्तुओं के लिए रन-टाइम इनहेरिटेंस कहा जा सकता है।

यहाँ C Sharp (प्रोग्रामिंग भाषा) | C#/Java (प्रोग्रामिंग भाषा) जैसी भाषा में एक स्यूडोकोड उदाहरण दिया गया है:

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)


बाहरी संबंध