javascript - जावास्क्रिप्ट में बहुरूपता क्या है?




oop functional-programming (4)

मैंने पॉलीमॉर्फिज़्म पर इंटरनेट पर पाए जाने वाले कुछ संभावित लेख पढ़े हैं। लेकिन मुझे लगता है कि मैं इसके अर्थ और इसके महत्व को समझ नहीं पाया। अधिकांश लेख यह नहीं कहते कि यह महत्वपूर्ण क्यों है और मैं OOP (जावास्क्रिप्ट में बेशक) में बहुरूपी व्यवहार कैसे प्राप्त कर सकता हूं।

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

  1. यह क्या है?
  2. हमें इसकी आवश्यकता क्यों है?
  3. यह काम किस प्रकार करता है?
  4. मैं जावास्क्रिप्ट में इस बहुरूपी व्यवहार को कैसे प्राप्त कर सकता हूं?

मुझे इसका उदाहरण मिला है। लेकिन यह आसानी से समझा जा सकता है कि इस कोड का परिणाम क्या होगा। यह स्वयं बहुरूपता के बारे में कोई स्पष्ट विचार नहीं देता है।

function Person(age, weight) {
    this.age = age;
    this.weight = weight;
    this.getInfo = function() {
        return "I am " + this.age + " years old " +
        "and weighs " + this.weight +" kilo.";
    }
}
function Employee(age, weight, salary) {
    this.salary = salary;
    this.age = age;
    this.weight = weight;
    this.getInfo = function() {
        return "I am " + this.age + " years old " +
        "and weighs " + this.weight +" kilo " +
        "and earns " + this.salary + " dollar.";
    }
}

Employee.prototype = new Person();
Employee.prototype.constructor = Employee;
  // The argument, 'obj', can be of any kind
  // which method, getInfo(), to be executed depend on the object
  // that 'obj' refer to.

function showInfo(obj) {
    document.write(obj.getInfo() + "<br>");
}

var person = new Person(50,90);
var employee = new Employee(43,80,50000);
showInfo(person);
showInfo(employee);

यह क्या है?

पाली = कई, रूपवाद = रूप या व्यवहार शिफ्टिंग।

हमें इसकी आवश्यकता क्यों है?

प्रोग्रामिंग में, इसका उपयोग तब किया जाता है जब हम एक फ़ंक्शन चाहते हैं (फ़ंक्शन X का इंटरफ़ेस कहें) विभिन्न प्रकार या मापदंडों की संख्या को स्वीकार करने के लिए पर्याप्त लचीला होना चाहिए। इसके अलावा, बदलते प्रकार या संख्याओं के आधार पर, हम चाहते हैं कि फ़ंक्शन X अलग तरह से व्यवहार करे (आकारिकी)।

यह काम किस प्रकार करता है?

हम एक्स फ़ंक्शन के कई कार्यान्वयन लिखते हैं जहां प्रत्येक कार्यान्वयन विभिन्न मापदंडों प्रकार या मापदंडों की संख्या को स्वीकार करता है। पैरामीटर के प्रकार या संख्या के आधार पर, कंपाइलर (रनटाइम पर) यह तय करता है कि एक्स को किस कोड से क्रियान्वित किया जाना चाहिए, जब एक्स को कुछ कोड से बुलाया जाता है।

मैं जावास्क्रिप्ट में इस बहुरूपी व्यवहार को कैसे प्राप्त कर सकता हूं?

JS एक टाइप की हुई भाषा नहीं है, इसलिए इसका वास्तव में बहुरूपता जैसी OOP अवधारणाओं का उपयोग करने का मतलब नहीं है। हालांकि, जेएस के नए संस्करण में अब कक्षाएं शामिल हैं और संभावना है कि जेएस में भी पॉलीमॉस्फिज्म का मतलब शुरू हो सकता है। अन्य जवाब कुछ दिलचस्प वर्कअराउंड प्रदान करते हैं।


बहुरूपता का उद्देश्य क्या है?

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

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

यह जावास्क्रिप्ट पर कैसे लागू होता है?

जावास्क्रिप्ट में एक कमजोर, गतिशील प्रकार की प्रणाली है। इस प्रकार की प्रणाली एक सख्त प्रकार की प्रणाली के बराबर है जिसमें केवल एक प्रकार होता है। हम इस तरह के एक विशाल संघ प्रकार (छद्म वाक्य रचना) के बारे में सोच सकते हैं:

type T =
 | Undefined
 | Null
 | Number
 | String
 | Boolean
 | Symbol
 | Object
 | Array
 | Map
 | ...

प्रत्येक मान रन-टाइम पर इनमें से किसी एक प्रकार के विकल्प से जुड़ा होगा। और जब से जावास्क्रिप्ट कमजोर रूप से टाइप किया गया है, हर मूल्य अपने प्रकार को किसी भी समय बदल सकता है।

यदि हम एक प्रकार का सैद्धांतिक दृष्टिकोण लेते हैं और विचार करते हैं कि केवल एक ही प्रकार है, तो हम निश्चितता के साथ कह सकते हैं कि जावास्क्रिप्ट प्रकार के सिस्टम में बहुरूपता की धारणा नहीं है। इसके बजाय हमने डक टाइपिंग और निहितार्थ जबरदस्ती किया है।

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

इसे ठीक से करने के लिए मैं आपको बहुरूपता के सबसे आम अभिव्यक्तियों का अवलोकन देने जा रहा हूं।

पैरामीट्रिक बहुरूपता (उर्फ जेनरिक)

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

// parametric polymorphic functions

const id = x => x;

id(1); // 1
id("foo"); // "foo"

const k = x => y => x;
const k_ = x => y => y;

k(1) ("foo"); // 1
k_(1) ("foo"); // "foo"

const append = x => xs => xs.concat([x]);

append(3) ([1, 2]); // [1, 2, 3]
append("c") (["a", "b"]); // ["a", "b", "c"]

तदर्थ बहुरूपता (उर्फ ओवरलोडिंग)

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

Ad-hoc polymorphism एक फ़ंक्शन को बड़े डोमेन के प्रकारों के अनुकूल बनाता है। निम्न उदाहरण "मानचित्र-ओवर" उद्देश्य को दिखाता है और इस बाधा को कैसे लागू कर सकता है। फ़ंक्शन के एक सेट के बजाय "मैप करने योग्य" बाधा में केवल एक ही map फ़ंक्शन शामिल होता है:

// Option type
class Option {
  cata(pattern, option) {
    return pattern[option.constructor.name](option.x);
  }
  
  map(f, opt) {
    return this.cata({Some: x => new Some(f(x)), None: () => this}, opt);
  }
};

class Some extends Option {
  constructor(x) {
    super(x);
    this.x = x;
  }
};

class None extends Option {
  constructor() {
    super();
  }
};


// ad-hoc polymorphic function
const map = f => t => t.map(f, t);

// helper/data

const sqr = x => x * x;

const xs = [1, 2, 3];
const x = new Some(5);
const y = new None();

// application

console.log(
  map(sqr) (xs) // [1, 4, 9]
);

console.log(
  map(sqr) (x) // Some {x: 25}
);

console.log(
  map(sqr) (y) // None {}
);

उप-प्रकार बहुरूपता

चूंकि अन्य उत्तर पहले से ही उप-प्रकार के बहुरूपता को कवर करते हैं इसलिए मैं इसे छोड़ देता हूं।

संरचनात्मक बहुरूपता (उर्फ कड़ाई से घटाव)

संरचनात्मक बहुरूपता का कहना है कि विभिन्न प्रकार समान हैं, यदि वे एक ही संरचना को इस तरह से समाहित करते हैं, तो एक प्रकार में दूसरे के सभी गुण होते हैं, लेकिन अतिरिक्त गुण शामिल हो सकते हैं। कहा जा रहा है कि संरचनात्मक बहुरूपता संकलन समय पर टाइपिंग कर रही है और निश्चित रूप से कुछ अतिरिक्त प्रकार की सुरक्षा प्रदान करती है। लेकिन यह दावा करते हुए कि दो मूल्य एक ही प्रकार के हैं क्योंकि वे कुछ गुणों को साझा करते हैं, यह मूल्यों के अर्थ स्तर को पूरी तरह से अनदेखा करता है:

const weight = {value: 90, foo: true};
const speed =  {value: 90, foo: false, bar: [1, 2, 3]};

दुर्भाग्य से, speed को weight का एक उपप्रकार माना जाता है और जैसे ही हम value गुणों की तुलना करते हैं, हम लगभग संतरे के साथ सेब की तुलना कर रहे हैं।


जैसा कि इस अन्य उत्तर में बताया गया है, बहुरूपता की अलग-अलग व्याख्याएँ हैं।

जिस विषय पर मैंने कभी पढ़ा है, उस पर सबसे अच्छा स्पष्टीकरण, लुका कार्डेली का एक लेख है, जो एक प्रकार का सिद्धांत है। इस लेख का नाम ऑन अंडरस्टैंडिंग टाइप्स, डेटा एब्सट्रैक्शन और पॉलिमोर्फिज्म है

यह क्या है?

कार्डेली इस लेख में कई प्रकार के बहुरूपता को परिभाषित करता है:

  • यूनिवर्सल
    • पैरामीट्रिक
    • समावेश
  • अनौपचारिक
    • oveloading
    • बलात्कार

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

उदाहरण के लिए, जावास्क्रिप्ट में संकलित समय पर कोई भी विधि या कार्य अतिभारित या स्वचालित प्रकार का नहीं है। एक गतिशील भाषा में, हम इनमें से अधिकांश चीजों को स्वीकार करते हैं। भाषा की गतिशील प्रकृति के कारण न ही हमें जावास्क्रिप्ट में पैरामीट्रिक बहुरूपता जैसा कुछ चाहिए।

फिर भी, जावास्क्रिप्ट में एक प्रकार की विरासत है, जो उप-प्रकार के बहुरूपता के समान विचारों का अनुकरण करता है (जिसे कार्डेली द्वारा ऊपर शामिल किए जाने वाले बहुरूपता के रूप में वर्गीकृत किया गया है) एक समान तरीके से जो हम आमतौर पर जावा या सी # जैसे अन्य ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में करते हैं (जैसा कि समझाया गया है) एक और जवाब जो मैंने ऊपर साझा किया है)।

बहुआयामी भाषाओं में बहुत सामान्य रूप से बहुरूपता का दूसरा रूप बतख टाइपिंग कहलाता है।

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

हमें इसकी आवश्यकता क्यों है?

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

यह कैसे काम करता है?

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

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


बहुरूपता का अर्थ है अलग-अलग वस्तुओं पर समान विधि को कॉल करने की क्षमता और प्रत्येक वस्तु का अलग-अलग तरीके से प्रतिक्रिया करना पॉलीमॉर्फम कहा जाता है।

    function Animal(sound){
    this.sound=sound;
    this.speak=function(){
    			return this.sound;
    	}
    }
//one method 
    function showInfo(obj){
    		console.log(obj.speak());
    }
//different objects
    var dog = new Animal("woof");
    var cat = new Animal("meow");
    var cow = new Animal("humbow");
//responds different ways
    showInfo(dog);
    showInfo(cat);
    showInfo(cow);






parametric-polymorphism