बहुरूपता का उद्देश्य क्या है?
बहुरूपता एक स्थिर प्रकार की प्रणाली को खो देता है (महत्वपूर्ण) स्थिर प्रकार की सुरक्षा को खो देता है (प्रकार) प्रकार तुल्यता के लिए शर्तों को ढीला करके। प्रमाण यह रहता है कि कोई प्रोग्राम केवल तभी चलेगा जब उसमें किसी प्रकार की त्रुटि न हो।
एक पॉलीमॉर्फिक फ़ंक्शन या डेटा प्रकार एक मोनोमोर्फिक एक की तुलना में अधिक सामान्य है, क्योंकि इसका उपयोग परिदृश्यों की एक विस्तृत श्रृंखला में किया जा सकता है। इस अर्थ में बहुरूपता कड़ाई से टाइप की गई भाषाओं में सामान्यीकरण के विचार का प्रतिनिधित्व करता है।
यह जावास्क्रिप्ट पर कैसे लागू होता है?
जावास्क्रिप्ट में एक कमजोर, गतिशील प्रकार की प्रणाली है। इस तरह की प्रणाली एक सख्त प्रकार की प्रणाली के बराबर है जिसमें केवल एक प्रकार होता है। हम इस तरह के एक विशाल संघ प्रकार (छद्म वाक्य रचना) के बारे में सोच सकते हैं:
type T =
| Undefined
| Null
| Number
| String
| Boolean
| Symbol
| Object
| Array
| Map
| ...
प्रत्येक मान रन-टाइम पर इनमें से किसी एक प्रकार के विकल्प से जुड़ा होगा। और जब से जावास्क्रिप्ट कमजोर रूप से टाइप किया गया है, हर मूल्य अपने प्रकार को किसी भी समय बदल सकता है।
यदि हम एक प्रकार का सैद्धांतिक दृष्टिकोण लेते हैं और विचार करते हैं कि केवल एक ही प्रकार है, तो हम निश्चितता के साथ कह सकते हैं कि जावास्क्रिप्ट प्रकार के सिस्टम में बहुरूपता की धारणा नहीं है। इसके बजाय हमने डक टाइपिंग और निहित प्रकार का ज़बरदस्ती किया है।
लेकिन इससे हमें अपने कार्यक्रमों के प्रकारों के बारे में सोचने से बचना चाहिए। जावास्क्रिप्ट में प्रकारों की कमी के कारण हमें कोडिंग प्रक्रिया के दौरान उन्हें अनुमान लगाने की आवश्यकता है। हमारे दिमाग को लापता कंपाइलर के लिए खड़ा होना पड़ता है, जैसे ही हम एक प्रोग्राम को देखते हैं, हमें न केवल एल्गोरिदम को पहचानना चाहिए, बल्कि अंतर्निहित (शायद बहुरूपिक) प्रकारों को भी देखना होगा। ये प्रकार हमें अधिक विश्वसनीय और अधिक मजबूत कार्यक्रम बनाने में मदद करेंगे।
इसे ठीक से करने के लिए मैं आपको बहुरूपता के सबसे आम अभिव्यक्तियों का अवलोकन देने जा रहा हूं।
पैरामीट्रिक बहुरूपता (उर्फ जेनरिक)
पैरामीट्रिक बहुरूपता का कहना है कि विभिन्न प्रकार विनिमेय हैं क्योंकि प्रकार बिल्कुल भी मायने नहीं रखते हैं। एक फ़ंक्शन जो पैरामीट्रिक पॉलीमॉर्फिक प्रकार के एक या अधिक मापदंडों को परिभाषित करता है, उन्हें संबंधित तर्कों के बारे में कुछ भी नहीं पता होना चाहिए, लेकिन उन सभी के साथ समान व्यवहार करें, क्योंकि वे किसी भी प्रकार को अपना सकते हैं। यह काफी सीमित है, क्योंकि इस तरह के एक समारोह केवल अपने तर्कों के उन गुणों के साथ काम कर सकते हैं जो उनके डेटा का हिस्सा नहीं हैं:
const id = x => x;
id(1);
id("foo");
const k = x => y => x;
const k_ = x => y => y;
k(1) ("foo");
k_(1) ("foo");
const append = x => xs => xs.concat([x]);
append(3) ([1, 2]);
append("c") (["a", "b"]);
तदर्थ बहुरूपता (उर्फ ओवरलोडिंग)
तदर्थ बहुरूपता का कहना है कि विभिन्न प्रकार केवल एक विशिष्ट उद्देश्य के लिए समान हैं। इस अर्थ में समतुल्य होने के लिए एक प्रकार को उस उद्देश्य के लिए विशिष्ट प्रकार के कार्यों को लागू करना चाहिए। एक फ़ंक्शन जो तदर्थ बहुरूपी प्रकार के एक या अधिक मापदंडों को परिभाषित करता है, फिर यह जानना आवश्यक है कि इसके प्रत्येक तर्क से कौन से कार्य जुड़े हैं।
Ad-hoc polymorphism एक फ़ंक्शन को बड़े डोमेन के प्रकारों के अनुकूल बनाता है। निम्न उदाहरण "मैप-ओवर" उद्देश्य को दिखाता है और इस बाधा को कैसे लागू कर सकता है। फ़ंक्शन के एक सेट के बजाय "mappable" बाधा में केवल एक map
फ़ंक्शन शामिल होता है:
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();
}
};
const map = f => t => t.map(f, t);
const sqr = x => x * x;
const xs = [1, 2, 3];
const x = new Some(5);
const y = new None();
console.log(
map(sqr) (xs)
);
console.log(
map(sqr) (x)
);
console.log(
map(sqr) (y)
);
उप-प्रकार बहुरूपता
चूंकि अन्य उत्तर पहले से ही उप-प्रकार के बहुरूपता को कवर करते हैं इसलिए मैं इसे छोड़ देता हूं।
संरचनात्मक बहुरूपता (उर्फ कड़ाई से घटाव)
संरचनात्मक बहुरूपता का कहना है कि विभिन्न प्रकार समान हैं, यदि वे एक ही संरचना को इस तरह से समाहित करते हैं, तो एक प्रकार में दूसरे के सभी गुण होते हैं, लेकिन अतिरिक्त गुण शामिल हो सकते हैं। कहा जा रहा है कि संरचनात्मक बहुरूपता संकलन समय पर टाइपिंग कर रही है और निश्चित रूप से कुछ अतिरिक्त प्रकार की सुरक्षा प्रदान करती है। लेकिन यह दावा करते हुए कि दो मूल्य एक ही प्रकार के हैं क्योंकि वे कुछ गुण साझा करते हैं, यह मूल्यों के अर्थ स्तर को पूरी तरह से अनदेखा करता है:
const weight = {value: 90, foo: true};
const speed = {value: 90, foo: false, bar: [1, 2, 3]};
दुर्भाग्यवश, speed
का एक उपप्रकार माना जाता है weight
और जैसे ही हम value
गुणों की तुलना करते हैं हम वास्तव में संतरे के साथ सेब की तुलना कर रहे हैं।