प्रोटोटाइप आधारित बनाम वर्ग आधारित विरासत


208

जावास्क्रिप्ट में, प्रत्येक वस्तु एक ही समय में एक उदाहरण और एक वर्ग है। वंशानुक्रम करने के लिए, आप प्रोटोटाइप के रूप में किसी भी वस्तु उदाहरण का उपयोग कर सकते हैं।

अजगर में, सी ++, आदि .. अलग अवधारणा के रूप में कक्षाएं, और उदाहरण हैं। वंशानुक्रम करने के लिए, आपको एक नया वर्ग बनाने के लिए आधार वर्ग का उपयोग करना होगा, जो तब व्युत्पन्न उदाहरणों का उत्पादन करने के लिए उपयोग किया जा सकता है।

जावास्क्रिप्ट इस दिशा (प्रोटोटाइप-आधारित वस्तु अभिविन्यास) में क्यों गया? पारंपरिक, वर्ग-आधारित OO के संबंध में प्रोटोटाइप-आधारित OO के फायदे (और नुकसान) क्या हैं?


10
जावास्क्रिप्ट स्व से प्रभावित था जो प्रोटोटाइप विरासत के साथ पहली भाषा थी। उस समय शास्त्रीय विरासत सभी क्रोध थे, पहली बार सिमाला में पेश किया गया था। हालाँकि शास्त्रीय विरासत बहुत जटिल थी। तब डेविड अनगर और रान्डल स्मिथ ने GEB को पढ़ने के बाद एक प्रकरण किया - "सबसे विशिष्ट घटना घटनाओं के एक वर्ग के सामान्य उदाहरण के रूप में काम कर सकती है।" उन्होंने महसूस किया कि ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के लिए कक्षाएं आवश्यक नहीं हैं। इसलिए स्वयं का जन्म हुआ। शास्त्रीय विरासत की तुलना में प्रोटोटाइप की विरासत कितनी बेहतर है यह जानने के लिए इसे पढ़ें: stackoverflow.com/a/16872315/783743 =)
Aadit M Shah

@AaditMShah क्या / कौन है GEB?
एलेक्स

3
@ अलेक्स GEB डगलस हॉफस्टैटर द्वारा लिखित एक पुस्तक है। यह Gödel Escher Bach का संक्षिप्त नाम है। कर्ट गोडेल एक गणितज्ञ थे। एस्चर एक कलाकार थे। बाख एक पियानोवादक था।
आदित एम शाह

जवाबों:


201

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

सभी ऑब्जेक्ट ओरिएंटेड भाषाओं को कई अवधारणाओं से निपटने में सक्षम होना चाहिए:

  1. डेटा पर संबद्ध संचालन के साथ डेटा का इनकैप्सुलेशन, जिसे विभिन्न डेटा सदस्यों और सदस्य कार्यों के रूप में जाना जाता है, या डेटा और विधियों के रूप में, अन्य चीजों के बीच।
  2. विरासत, यह कहने की क्षमता कि ये वस्तुएं इन परिवर्तनों के लिए वस्तुओं के दूसरे सेट की तरह ही हैं
  3. बहुरूपता ("कई आकृतियाँ") जिसमें कोई वस्तु अपने लिए यह तय करती है कि किन विधियों को चलाना है, ताकि आप अपने अनुरोधों को सही ढंग से समझने के लिए भाषा पर निर्भर रह सकें।

अब, जहाँ तक तुलना करें:

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

बाद में OO भाषाएँ स्थैतिक प्रकार की जाँच का उपयोग करने में सक्षम होना चाहती थीं, इसलिए हमें संकलन के समय एक निश्चित वर्ग की धारणा मिली। ओपन-क्लास संस्करण में, आपके पास अधिक लचीलापन था; नए संस्करण में, आपके पास संकलक पर कुछ प्रकार की शुद्धता की जांच करने की क्षमता थी जो अन्यथा परीक्षण की आवश्यकता होती थी।

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

अब, ऐसा क्यों? मुख्य रूप से क्योंकि यह रन टाइम में एक सरल, तार्किक, सुरुचिपूर्ण तंत्र के लिए बनाता है। अब, एक नई वस्तु बनाने के लिए , या एक नया वर्ग बनाने के लिए, आपको बस एक गहरी प्रति, सभी डेटा और प्रोटोटाइप डेटा संरचना की नकल करनी होगी। आपको विरासत और बहुरूपता कम या ज्यादा मुफ्त में मिलती हैं: विधि खोज में हमेशा नाम से विधि लागू करने के लिए एक शब्दकोश पूछना होता है।

जावास्क्रिप्ट / ECMA स्क्रिप्ट में समाप्त होने का कारण मूल रूप से यह है कि जब हम 10 साल पहले इस के साथ शुरू कर रहे थे, तो हम बहुत कम शक्तिशाली कंप्यूटर और बहुत कम परिष्कृत ब्राउज़रों के साथ काम कर रहे थे। प्रोटोटाइप-आधारित पद्धति को चुनना मतलब वस्तु अभिविन्यास के वांछनीय गुणों को संरक्षित करते समय दुभाषिया बहुत सरल हो सकता है।


1
ठीक है, क्या वह पैराग्राफ पढ़ता है जैसे कि मैं अन्यथा का मतलब है? डाहल और न्याकविस्ट "क्लास" के साथ समान विधि हस्ताक्षर के साथ चीजों के संग्रह के रूप में आए।
चार्ली मार्टिन

1
क्या यह बदलाव इसे बेहतर बताता है?
चार्ली मार्टिन

2
नहीं, क्षमा करें, CLOS 80 के दशक के उत्तरार्ध के स्वप्नदोषों से है। CLOS.html Smalltalk 1980 से en.wikipedia.org/wiki/Smalltalk और Simula 1967-68 en.wikipedia.org
चार्ली

3
@ स्टेफ़ानो, वे इतने अलग नहीं हैं कि सभी: पायथन, रूबी, स्मॉलटाक विधि देखने के लिए शब्दकोशों का उपयोग करते हैं, और जावास्क्रिप्ट और सेल्फ में कक्षाएं होती हैं। कुछ हद तक, आप तर्क दे सकते हैं कि अंतर सिर्फ इतना है कि प्रोटोटाइप-उन्मुख भाषाएं अपने कार्यान्वयन को उजागर कर रही हैं। इसलिए शायद इसे बिग डील में नहीं बनाना अच्छा है: यह शायद EMACS और vi के बीच के तर्क की तरह है।
चार्ली मार्टिन

21
उपयोगी उत्तर । टिप्पणी में +1 कम उपयोगी कबाड़। मेरा मतलब है कि यह फर्क करता है कि क्या CLOS या स्मालटाक पहले था? यहां ज्यादातर लोग वैसे भी इतिहासकार नहीं हैं।
एडम एरॉल्ड

40

एक तुलना, जो प्रोटोटाइप आधारित दृष्टिकोण के प्रति थोड़ा पक्षपाती है, कागज में पाया जा सकता है स्व: द पावर ऑफ सिंपलिसिटी । कागज प्रोटोटाइप के पक्ष में निम्नलिखित तर्क देता है:

नकल करके निर्माण । प्रोटोटाइप से नई वस्तुएं बनाना एक सरल ऑपरेशन द्वारा पूरा किया जाता है, एक साधारण जैविक रूपक, क्लोनिंग के साथ नकल करना। कक्षाओं से नई वस्तुएं बनाना तात्कालिकता द्वारा पूरा किया जाता है, जिसमें एक कक्षा में प्रारूप जानकारी की व्याख्या शामिल है। तात्कालिकता एक योजना से घर बनाने के समान है। तात्कालिकता की तुलना में एक सरल रूपक के रूप में हमें अपील करना नकल करना।

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

एक-एक तरह की वस्तुओं के लिए समर्थन । स्वयं एक ढांचा प्रदान करता है जिसमें आसानी से अपने व्यवहार के साथ एक-जैसी वस्तुओं को शामिल किया जा सकता है। चूंकि प्रत्येक ऑब्जेक्ट ने स्लॉट्स का नाम दिया है, और स्लॉट राज्य या व्यवहार को पकड़ सकते हैं, किसी भी ऑब्जेक्ट में अद्वितीय स्लॉट या व्यवहार हो सकते हैं। क्लास-आधारित सिस्टम उन स्थितियों के लिए डिज़ाइन किए गए हैं जहां एक ही व्यवहार के साथ कई ऑब्जेक्ट हैं। किसी वस्तु के लिए अपने स्वयं के अनूठे व्यवहार के लिए कोई भाषाई समर्थन नहीं है, और यह एक वर्ग बनाने के लिए अजीब है जो केवल एक उदाहरण के लिए गारंटी देता है [ विचार एकल पैटर्न ]। स्व इन नुकसानों से न तो पीड़ित है। किसी भी वस्तु को अपने स्वयं के व्यवहार के साथ अनुकूलित किया जा सकता है। एक अनोखी वस्तु अद्वितीय व्यवहार को पकड़ सकती है, और एक अलग "उदाहरण" की आवश्यकता नहीं है।

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

प्रोटोटाइप को लागू करने के लिए सेल्फ शायद पहली भाषा है (इसने JIT जैसी अन्य रोचक तकनीकों को भी आगे बढ़ाया, जिसने बाद में JVM में अपना रास्ता बनाया), इसलिए अन्य सेल्फ पेपर पढ़ना भी शिक्षाप्रद होना चाहिए।


5
रे: मेटा-रेज्रेस का उन्मूलन: कॉमन लिस्प ऑब्जेक्ट सिस्टम में, जो कि क्लास-बेस्ड है, pointक्लास Pointका एक उदाहरण है standard-class, जो मेटाक्लास का एक उदाहरण है, जो स्वयं का एक उदाहरण है, विज्ञापन फिनिटम।
मैक्स नानसी

एक सेल्फ पेपर के लिंक मृत हैं। कार्य लिंक: स्व: सादगी की शक्ति | एक आत्म ग्रंथ सूची
user1201917

24

आपको डगलस क्रॉकफोर्ड द्वारा जावास्क्रिप्ट पर एक महान पुस्तक की जांच करनी चाहिए । यह जावास्क्रिप्ट रचनाकारों द्वारा लिए गए कुछ डिज़ाइन निर्णयों की बहुत अच्छी व्याख्या प्रदान करता है।

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

इसलिए मुझे लगता है कि जावास्क्रिप्ट में लागू किए गए प्रोटोटाइप आधारित OO के लिए कुछ नियम हैं:

  1. शिथिल टाइप के वातावरण में उपयुक्त, स्पष्ट प्रकारों को परिभाषित करने की आवश्यकता नहीं है।
  2. इसे सिंगलटन पैटर्न को लागू करने के लिए अविश्वसनीय रूप से आसान बनाता है (इस संबंध में जावास्क्रिप्ट और जावा की तुलना करें, और आपको पता चल जाएगा कि मैं किस बारे में बात कर रहा हूं)।
  3. किसी वस्तु के तरीके को अलग वस्तु के संदर्भ में लागू करने के तरीके प्रदान करता है, किसी वस्तु आदि से गतिशील रूप से तरीकों को जोड़ना और प्रतिस्थापित करना (ऐसी चीजें जो दृढ़ता से टाइप की गई भाषाओं में संभव नहीं हैं)।

यहाँ कुछ प्रोटोटाइप ओओ की विपक्ष हैं:

  1. निजी चर को लागू करने का कोई आसान तरीका नहीं। बंद होने का उपयोग करके क्रॉकफ़ोर्ड की विज़ार्ड का उपयोग करके निजी संस्करण को लागू करना संभव है , लेकिन निश्चित रूप से जावा या सी # में निजी चर का उपयोग करते हुए उतना तुच्छ नहीं है।
  2. मैं नहीं जानता कि जावास्क्रिप्ट में कई विरासत (इसके लायक क्या है) को अभी तक कैसे लागू किया जाए।

2
बस निजी संस्करणों के लिए एक नामकरण सम्मेलन का उपयोग करें, जैसे कि पायथन करता है।
aehlke

1
js में निजी vars करने का तरीका क्लोजर के साथ है, और यह आपके द्वारा चुने गए उत्तराधिकार प्रकार से स्वतंत्र है।
बेन्जा

6
क्रॉकफोर्ड ने जावास्क्रिप्ट को नुकसान पहुंचाने के लिए बहुत कुछ किया है, जिसमें एक काफी सरल स्क्रिप्टिंग भाषा को इसके आंतरिक के साथ एक मास्टरबेटी आकर्षण के रूप में चित्रित किया गया है। JS के पास सही निजी कीवर्ड स्कोप नहीं है या कई मल्टीपल इनहेरिटेंस हैं: उन्हें नकली बनाने की कोशिश न करें।
हेल ​​50000
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.