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




oop functional-programming (4)

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

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

  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);

जैसा कि इस अन्य उत्तर में बताया गया है polymorphism में विभिन्न व्याख्याएं हैं।

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

यह क्या है?

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

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

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

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

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

गतिशील भाषाओं में बहुत विशिष्ट पॉलीमोर्फिज्म का एक अन्य रूप बतख टाइपिंग कहा जाता है।

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

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

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

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

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

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


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

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

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

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

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

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"]

एड-हाॉक पॉलिमॉर्फिज्म (उर्फ ओवरलोडिंग)

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

एड-हाॉक पॉलिमॉर्फिज्म एक प्रकार के बड़े डोमेन के लिए संगत फ़ंक्शन बनाता है। निम्नलिखित उदाहरण "मानचित्र-ओवर" उद्देश्य और इस बाधा को कैसे कार्यान्वित कर सकता है, दिखाता है। फ़ंक्शन के सेट के बजाय "मैपबल" बाधा में केवल एक 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 गुणों की तुलना करते हैं, हम वस्तुतः संतरे से सेब की तुलना कर रहे हैं।


पॉलीमोर्फिज्म ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (ओओपी) के सिद्धांतों में से एक है। यह व्यवहार साझा करने के लिए वस्तुओं को डिजाइन करने और विशिष्ट लोगों के साथ साझा व्यवहार को ओवरराइड करने में सक्षम होने का अभ्यास है। ऐसा करने के लिए पॉलीमोर्फिज्म विरासत का लाभ उठाता है।

ओओपी में सब कुछ एक वस्तु के रूप में मॉडलिंग माना जाता है। इस अमूर्तता को किसी कार के लिए नट्स और बोल्ट तक नीचे ले जाया जा सकता है, या एक वर्ष, मेक और मॉडल के साथ बस एक कार प्रकार के रूप में व्यापक रूप से लिया जा सकता है।

एक पॉलिमॉर्फिक कार परिदृश्य के लिए बेस कार प्रकार होगा, और उसके बाद उप-वर्ग होंगे जो कार से प्राप्त होंगे और कार के मूल व्यवहार के शीर्ष पर अपने व्यवहार प्रदान करेंगे। उदाहरण के लिए, एक उपclass TowTruck हो सकता है जो अभी भी एक वर्ष बनाने और मॉडल होगा, लेकिन कुछ अतिरिक्त व्यवहार और गुण भी हो सकते हैं जो लिफ्ट के विनिर्देशों के रूप में जटिल के रूप में IsTowing के लिए ध्वज के रूप में बुनियादी हो सकता है।

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

इसलिए इसे सुविधाजनक बनाने के लिए, हम पहले सुपर क्लास (व्यक्ति) लिखेंगे

function Person(age,weight){
 this.age = age;
 this.weight = weight;
}

और हम व्यक्ति को अपनी जानकारी साझा करने की क्षमता देंगे

Person.prototype.getInfo = function(){
 return "I am " + this.age + " years old " +
    "and weighs " + this.weight +" kilo.";
};

इसके बाद हम व्यक्ति, कर्मचारी का उप-वर्ग बनाना चाहते हैं

function Employee(age,weight,salary){
 this.age = age;
 this.weight = weight;
 this.salary = salary;
}
Employee.prototype = new Person();

और हम एक कर्मचारी को अधिक उपयुक्त बनाने के लिए getInfo के व्यवहार को ओवरराइड करेंगे

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

इन्हें आपके मूल कोड उपयोग के समान उपयोग किया जा सकता है

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

console.log(person.getInfo());
console.log(employee.getInfo());

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


जावास्क्रिप्ट एक व्याख्या की गई भाषा है, संकलित भाषा नहीं है।

संकलन समय पॉलिमोरिज्म (या स्टेटिक पॉलिमॉर्फिज्म) संकलित समय बहुरूपता जावा में विधि अधिभारित करने के अलावा कुछ भी नहीं है, सी ++

इसलिए जावास्क्रिप्ट में विधि ओवरलोडिंग संभव नहीं है।

लेकिन डायनेमिक (रन टाइम) पॉलिमॉर्फिज्म रन-टाइम पर पॉलीमोर्फिज्म मौजूद है इसलिए जावास्क्रिप्ट में विधि ओवरराइडिंग संभव है

एक और उदाहरण PHP है।





parametric-polymorphism