कुछ पेशेवरों और विपक्ष
पॉलीमॉर्फिक के लिए पेशेवरों:
- एक छोटा बहुरूपी इंटरफ़ेस पढ़ने में आसान है। मुझे केवल एक तरीका याद रखना है।
- यह जिस तरह से भाषा का उपयोग करने के लिए है - डक टाइपिंग के साथ जाता है।
- यदि यह स्पष्ट है कि मैं किन वस्तुओं को एक खरगोश से बाहर निकालना चाहता हूं, तो वैसे भी अस्पष्टता नहीं होनी चाहिए।
- जावा जैसी स्थिर भाषाओं में भी बहुत प्रकार की जाँच करना बुरा माना जाता है, जहाँ वस्तु के प्रकार के लिए बहुत प्रकार की जाँचें बदसूरत कोड बनाती हैं, तो क्या जादूगर को वास्तव में उन वस्तुओं के प्रकार के बीच अंतर करने की आवश्यकता है जिन्हें वह खरगोश से खींच रहा है। ?
तदर्थ के लिए पेशेवरों:
- यह कम स्पष्ट है, क्या मैं एक स्ट्रिंग को
Cat
उदाहरण से बाहर खींच सकता हूं ? क्या यह सिर्फ काम करेगा? यदि नहीं, तो व्यवहार क्या है? यदि मैं यहां टाइप को सीमित नहीं करता हूं, तो मुझे दस्तावेज़ीकरण में, या उन परीक्षणों में करना होगा जो एक बदतर अनुबंध कर सकते हैं।
- आपके पास एक जगह पर एक खरगोश को खींचने का सारा काम है, जादूगर (कुछ इस पर विचार कर सकते हैं)
- आधुनिक जेएस ऑप्टिमाइज़र मोनोमोर्फिक (केवल एक प्रकार पर काम करता है) और बहुरूपी कार्यों के बीच अंतर करते हैं। वे monomorphic वाले अनुकूलन करने के लिए कैसे पता ज्यादा बेहतर तो
pullRabbitOutOfString
संस्करण की संभावना है होना करने के लिए बहुत तेजी से वी 8 की तरह इंजन में। अधिक जानकारी के लिए यह वीडियो देखें। संपादित करें: मैंने खुद को एक पूर्ण लिखा था, यह पता चला है कि व्यवहार में, यह हमेशा ऐसा नहीं होता है ।
कुछ वैकल्पिक उपाय:
मेरी राय में, इस तरह का डिज़ाइन बहुत 'जावा-स्क्रिप्टी' से शुरू नहीं होता है। जावास्क्रिप्ट एक अलग भाषा है जिसमें C #, जावा या पायथन जैसी भाषाओं के अलग-अलग मुहावरे हैं। ये मुहावरे डेवलपर्स के वर्षों में उत्पन्न होते हैं जो भाषा के कमजोर और मजबूत हिस्सों को समझने की कोशिश कर रहे हैं, मैं क्या करूँगा इन मुहावरों के साथ रहने की कोशिश करता हूं।
मेरे विचार से दो अच्छे समाधान हैं:
- वस्तुओं को ऊपर उठाना, वस्तुओं को "खींचने योग्य" बनाना, उन्हें रन-टाइम पर एक इंटरफ़ेस के अनुरूप बनाना, फिर जादूगर को खींचने वाली वस्तुओं पर काम करना।
- रणनीति पैटर्न का उपयोग करना, जादूगर को गतिशील रूप से सिखाना कि विभिन्न प्रकार की वस्तुओं को कैसे संभालना है।
समाधान 1: वस्तुओं को ऊपर उठाना
इस समस्या का एक सामान्य समाधान, उन वस्तुओं को 'उन्नत' करना है, जिनमें खरगोशों को बाहर निकालने की क्षमता होती है।
यही है, एक फ़ंक्शन है जो किसी प्रकार की वस्तु लेता है, और इसके लिए एक टोपी से बाहर खींचता है। कुछ इस तरह:
function makePullable(obj){
obj.pullOfHat = function(){
return new Rabbit(obj.toString());
}
}
मैं makePullable
अन्य वस्तुओं के लिए ऐसे कार्य कर सकता हूं, मैं एक बना सकता हूं makePullableString
, आदि मैं प्रत्येक प्रकार पर रूपांतरण को परिभाषित कर रहा हूं। हालाँकि, मैंने अपनी वस्तुओं को ऊँचा उठाने के बाद, मुझे उन्हें सामान्य तरीके से इस्तेमाल करने का कोई प्रकार नहीं है। जावास्क्रिप्ट में एक इंटरफ़ेस एक बतख टाइपिंग द्वारा निर्धारित किया जाता है, अगर इसकी एक pullOfHat
विधि है तो मैं इसे जादूगर की विधि के साथ खींच सकता हूं ।
तब जादूगर कर सकता था:
Magician.pullRabbit = function(pullable) {
var rabbit = obj.pullOfHat();
return {rabbit:rabbit,text:"Tada, I pulled a rabbit out of "+pullable};
}
ऑब्जेक्ट्स को ऊपर उठाना, कुछ प्रकार के मिक्सिन पैटर्न का उपयोग करना ऐसा लगता है जैसे कि अधिक जेएस चीज़। (ध्यान दें कि यह भाषा में मूल्य प्रकारों के साथ समस्याग्रस्त है जो स्ट्रिंग, संख्या, अशक्त, अपरिभाषित और बूलियन हैं, लेकिन वे सभी बॉक्स-सक्षम हैं)
यहाँ एक उदाहरण है कि ऐसा कोड कैसा दिख सकता है
समाधान 2: रणनीति पैटर्न
जब StackOverflow में JS चैट रूम में इस प्रश्न पर चर्चा करते हुए मेरे मित्र फिनोमनोमनोमिनल ने स्ट्रैटेजी पैटर्न के उपयोग का सुझाव दिया ।
यह आपको रन टाइम में विभिन्न वस्तुओं से खरगोशों को खींचने की क्षमता जोड़ने की अनुमति देगा, और बहुत जावास्क्रिप्ट कोड बनाएगा। एक जादूगर सीख सकता है कि विभिन्न प्रकार की वस्तुओं को टोपियों से कैसे निकाला जाए, और यह उन्हें उस ज्ञान के आधार पर खींचता है।
यहाँ यह कैसे कॉफीस्क्रिप्ट में लग सकता है:
class Magician
constructor: ()-> # A new Magician can't pull anything
@pullFunctions = {}
pullRabbit: (obj) -> # Pull a rabbit, handler based on type
func = pullFunctions[obj.constructor.name]
if func? then func(obj) else "Don't know how to pull that out of my hat!"
learnToPull: (obj, handler) -> # Learns to pull a rabbit out of a type
pullFunctions[obj.constructor.name] = handler
आप यहाँ समान JS कोड देख सकते हैं ।
इस तरह, आप दोनों दुनिया से लाभान्वित होते हैं, खींचने की क्रिया को या तो वस्तुओं, या जादूगर से कड़ाई से जोड़ा नहीं जाता है और मुझे लगता है कि यह एक बहुत अच्छा समाधान है।
उपयोग कुछ इस तरह होगा:
var m = new Magician();//create a new Magician
//Teach the Magician
m.learnToPull("",function(){
return "Pulled a rabbit out of a string";
});
m.learnToPull({},function(){
return "Pulled a rabbit out of a Object";
});
m.pullRabbit(" Str");