ऑनलाइन सॉफ्टवेयर पर यादृच्छिक विषयों को पढ़ते हुए मुझे बतख टाइपिंग का ज्ञान हुआ और यह पूरी तरह से समझ में नहीं आया।
"डक टाइपिंग" क्या है?
ऑनलाइन सॉफ्टवेयर पर यादृच्छिक विषयों को पढ़ते हुए मुझे बतख टाइपिंग का ज्ञान हुआ और यह पूरी तरह से समझ में नहीं आया।
"डक टाइपिंग" क्या है?
जवाबों:
यह एक ऐसी भाषा है जिसका उपयोग गतिशील भाषाओं में किया जाता है, जिसमें मजबूत टाइपिंग नहीं होती है ।
विचार यह है कि किसी वस्तु पर किसी मौजूदा विधि को लागू करने के लिए आपको एक प्रकार की आवश्यकता नहीं है - यदि कोई विधि उस पर परिभाषित है, तो आप इसे लागू कर सकते हैं।
नाम वाक्यांश से आता है "यदि यह बतख की तरह दिखता है और बतख की तरह होता है, तो यह बतख है"।
विकिपीडिया में बहुत अधिक जानकारी है।
बत्तख टाइपिंग का मतलब है कि एक ऑपरेशन औपचारिक रूप से उन आवश्यकताओं को निर्दिष्ट नहीं करता है जो उसके ऑपरेंड को पूरा करने के लिए होती हैं, लेकिन बस इसे आज़माती हैं जो दिया जाता है उसके साथ है।
दूसरों ने जो कहा है, उसके विपरीत, यह जरूरी नहीं कि यह गतिशील भाषाओं या विरासत के मुद्दों से संबंधित हो।
उदाहरण कार्य: किसी विधि को कॉल करेंQuack
पर को ।
बत्तख-टाइपिंग का उपयोग किए बिना , f
इस कार्य को करने वाले फ़ंक्शन को पहले से निर्दिष्ट करना होगा कि उसके तर्क को कुछ विधि का समर्थन करना है Quack
। एक आम तरीका इंटरफेस का उपयोग है
interface IQuack {
void Quack();
}
void f(IQuack x) {
x.Quack();
}
कॉल करना f(42)
विफल रहता है, लेकिन f(donald)
जब तक donald
यह एक उदाहरण है, तब तक काम करता हैIQuack
-subtype ।
एक अन्य दृष्टिकोण संरचनात्मक टाइपिंग है - लेकिन फिर से, विधि Quack()
औपचारिक रूप से किसी भी चीज को निर्दिष्ट करती है जो यह साबित नहीं कर सकती है कि यह quack
पहले से ही संकलक विफलता का कारण होगा।
def f(x : { def Quack() : Unit }) = x.Quack()
हम लिख भी सकते थे
f :: Quackable a => a -> IO ()
f = quack
हास्केल में, जहां Quackable
टाइपकास्ट हमारी पद्धति के अस्तित्व को सुनिश्चित करता है।
ठीक है, जैसा कि मैंने कहा, एक बतख टाइपिंग सिस्टम आवश्यकताओं को निर्दिष्ट नहीं करता है, लेकिन अगर कुछ भी काम करता है तो बस कोशिश करता है ।
इस प्रकार, पायथन के हमेशा गतिशील टाइप के रूप में एक डायनामिक टाइप सिस्टम:
def f(x):
x.Quack()
यदि f
एक x
सहायक हो जाता Quack()
है, तो सब कुछ ठीक है, यदि नहीं, तो यह रनटाइम पर दुर्घटनाग्रस्त हो जाएगा।
लेकिन बत्तख टाइपिंग डायनेमिक टाइपिंग को बिल्कुल भी प्रभावित नहीं करती है - वास्तव में, एक बहुत ही लोकप्रिय लेकिन पूरी तरह से स्टैटिक डक टाइपिंग दृष्टिकोण है जो आपकी आवश्यकताओं को भी पूरा नहीं करता है:
template <typename T>
void f(T x) { x.Quack(); }
समारोह किसी भी तरह से है कि यह कुछ चाहता है में नहीं बताता है x
कि कर सकते हैं Quack
, तो बजाय यह सिर्फ कोशिश करता है संकलन समय पर और अगर सब कुछ काम करता है, यह ठीक।
def f(x)
के बजाय def f(IQuack x)
।
प्रश्न के शब्दार्थ की चर्चा काफी बारीक है (और बहुत अकादमिक), लेकिन यहाँ सामान्य विचार है:
बत्तख टाइपिंग
("अगर यह एक बतख की तरह चलता है और एक बतख की तरह चलता है तो यह एक बतख है।") - हाँ! लेकिन इसका क्या मतलब है??! यह सबसे अच्छा उदाहरण द्वारा चित्रित किया गया है:
बतख टंकण कार्यक्षमता के उदाहरण:
कल्पना कीजिए कि मेरे पास एक जादू की छड़ी है। इसकी विशेष शक्तियाँ हैं। अगर मैं छड़ी को लहराता हूं और कहता हूं "ड्राइव!" एक कार के लिए, अच्छी तरह से, तो यह ड्राइव!
क्या यह अन्य चीजों पर काम करता है? निश्चित नहीं: इसलिए मैं इसे एक ट्रक पर आज़माता हूं। वाह - यह भी ड्राइव करता है! मैं इसे विमानों, ट्रेनों और 1 वुड्स पर आज़माता हूं (वे एक प्रकार का गोल्फ क्लब है, जिसका उपयोग लोग गोल्फ की गेंद को ड्राइव करने के लिए करते हैं)। वे सब ड्राइव करते हैं!
लेकिन क्या यह काम करेगा, एक चायवाला? त्रुटि: KAAAA-BOOOOOOM! इतना अच्छा काम नहीं किया। ====> Teacups ड्राइव नहीं कर सकते हैं !! ओह !?
यह मूल रूप से बतख टाइपिंग की अवधारणा है। यह एक कोशिश से पहले आप खरीद प्रणाली है। अगर यह काम करता है, तो सब ठीक है। लेकिन अगर यह विफल रहता है, तो आपके हाथ में अभी भी एक ग्रेनेड की तरह, यह आपके चेहरे पर उड़ाने वाला है।
दूसरे शब्दों में, हम रुचि रखते हैं कि वस्तु क्या कर सकती है , बजाय इसके कि वस्तु क्या है ।
उदाहरण: वैधानिक रूप से टाइप की गई भाषाएँ
यदि हम इस बात से चिंतित थे कि वस्तु वास्तव में क्या थी , तो हमारी जादुई चाल केवल पूर्व-निर्धारित, अधिकृत प्रकारों पर काम करेगी - इस मामले में कारें, लेकिन अन्य वस्तुओं पर विफल हो जाएंगी जो ड्राइव कर सकती हैं : ट्रक, मोपेड, टुक-टुक आदि। यह ट्रकों पर काम नहीं करेगा क्योंकि हमारी जादू की छड़ी यह केवल कारों पर काम करने की उम्मीद कर रही है ।
दूसरे शब्दों में, इस परिदृश्य में, जादू की छड़ी बहुत बारीकी से दिखती है कि वस्तु क्या है (यह एक कार है?) बजाय इसके कि वस्तु क्या कर सकती है? (जैसे कि कार, ट्रक आदि ड्राइव कर सकते हैं)।
एक ही रास्ता है कि आप ड्राइव करने के लिए एक ट्रक प्राप्त कर सकते हैं, यदि आप किसी तरह दोनों ट्रकों और कारों की उम्मीद करने के लिए जादू की छड़ी पा सकते हैं (शायद "एक सामान्य इंटरफ़ेस लागू करके")। यदि आपको नहीं पता कि इसका क्या मतलब है, तो फिलहाल इसे अनदेखा करें।
सारांश: कुंजी ले-आउट
बतख टाइपिंग में जो महत्वपूर्ण है वह वही है जो वस्तु वास्तव में कर सकती है, बजाय इसके कि वस्तु क्या है ।
विचार करें कि आप एक साधारण फ़ंक्शन डिज़ाइन कर रहे हैं, जो किसी प्रकार की वस्तु प्राप्त करता है Bird
और इसकी walk()
विधि कहता है । दो दृष्टिकोण हैं, जो आप सोच सकते हैं:
Bird
, या उनका कोड संकलित नहीं करेगा। यदि कोई भी मेरे कार्य का उपयोग करना चाहता है, तो उसे इस बात की जानकारी होनी चाहिए कि मैं केवल Bird
एस स्वीकार कर रहा हूंobjects
और मैं सिर्फ ऑब्जेक्ट की walk()
विधि कहता हूं । तो, अगर object
कर सकते हैं walk()
कि यह सही है, अगर यह मेरे कार्य करेंगे विफल रहता है नहीं कर सकते। इसलिए यहां यह महत्वपूर्ण नहीं है कि वस्तु एक Bird
या कुछ और है, यह महत्वपूर्ण है कि यह walk()
(यह टंकण टाइप कर सकता है )यह माना जाना चाहिए कि बतख टाइपिंग कुछ मामलों में उपयोगी हो सकती है, उदाहरण के लिए पायथन बतख टाइपिंग का उपयोग करता है ।
विकिपीडिया में एक विस्तृत विवरण दिया गया है:
http://en.wikipedia.org/wiki/Duck_typing
बतख टाइपिंग डायनेमिक टाइपिंग की एक शैली है जिसमें किसी ऑब्जेक्ट का मौजूदा सेट और गुण किसी विशेष वर्ग से विरासत या विशिष्ट इंटरफ़ेस के कार्यान्वयन के बजाय वैध शब्दार्थ निर्धारित करता है।
महत्वपूर्ण नोट की संभावना है कि बतख टाइपिंग के साथ एक डेवलपर वस्तु के उन हिस्सों के साथ अधिक संबंध रखता है जो वास्तविक वास्तविक प्रवाह के बजाय उपभोग किए गए हैं।
मुझे पुराने मुहावरों को दोहराने वाले बहुत से उत्तर दिखाई देते हैं:
यदि यह एक बतख की तरह दिखता है और बतख की तरह होता है, तो यह एक बतख है
और फिर डक टाइपिंग के साथ आप क्या कर सकते हैं, इसका एक उदाहरण दें, या एक उदाहरण जो अवधारणा को आगे बढ़ाने में बाधा डालता है।
मुझे उतना मदद नहीं मिला।
बतख टाइपिंग के बारे में एक सादे अंग्रेजी उत्तर में यह सबसे अच्छा प्रयास है जो मुझे मिला है:
बत्तख टाइपिंग का मतलब है कि एक वस्तु को परिभाषित किया जाता है कि यह क्या कर सकता है, न कि यह क्या है।
इसका मतलब यह है कि हम किसी वस्तु के वर्ग / प्रकार से कम चिंतित हैं और इस बारे में अधिक चिंतित हैं कि इस पर कौन से तरीके कहे जा सकते हैं और कौन से ऑपरेशन किए जा सकते हैं। हम इसके प्रकार के बारे में परवाह नहीं करते हैं, हम इसकी परवाह करते हैं कि यह क्या कर सकता है ।
बतख टाइपिंग:
अगर यह बात करता है और एक बतख की तरह चलता है, तो यह एक बतख है
इसे आमतौर पर कहा जाता है अपहरण ( abductive तर्क या भी कहा जाता है retroduction , एक स्पष्ट परिभाषा मुझे लगता है कि):
से सी (निष्कर्ष, हम देखते हैं ) और आर (नियम, जो हम जानते ), हम स्वीकार करते हैं / तय / मान पी (परिसर, संपत्ति दूसरे शब्दों में) किसी दिए गए तथ्य
... चिकित्सा निदान का बहुत आधार
बतख के साथ: C = चलता है, बातचीत करता है , R = एक बतख की तरह , P = यह एक बतख है
प्रोग्रामिंग पर वापस:
ऑब्जेक्ट ओ में विधि / संपत्ति mp1 और इंटरफ़ेस / प्रकार है T के लिए mp1 को परिभाषित / परिभाषित करता है
ऑब्जेक्ट ओ में विधि / संपत्ति mp2 और इंटरफ़ेस / प्रकार है T के लिए mp2 को परिभाषित / परिभाषित करता है
...
तो, केवल mp1 को स्वीकार करने से ज्यादा ... किसी भी वस्तु पर जब तक यह mp1 की कुछ परिभाषा को पूरा करता है ..., संकलक ओ के साथ संकलक / रनटाइम भी ठीक होना चाहिए प्रकार का है टी
और ठीक है, क्या यह ऊपर के उदाहरण के साथ मामला है? क्या डक टाइपिंग अनिवार्य रूप से कोई टाइपिंग नहीं है? या हम इसे अंतर्निहित टाइपिंग कहेंगे?
भाषा को देखने से ही मदद मिल सकती है; यह अक्सर मेरी मदद करता है (मैं एक देशी अंग्रेजी वक्ता नहीं हूं)।
में duck typing
:
1) शब्द का typing
मतलब कीबोर्ड पर टाइप करना नहीं है (जैसा कि मेरे दिमाग में लगातार छवि थी), इसका अर्थ है "यह किस प्रकार की चीज है? "
2) यह शब्द duck
व्यक्त करता है कि यह कैसे निर्धारित किया जाता है; यह एक 'ढीले' निर्धारण की तरह है, जैसे: " अगर यह एक बतख की तरह चलता है ... तो यह एक बतख है "। यह 'ढीला' है क्योंकि बात बतख की हो सकती है या नहीं, लेकिन क्या यह वास्तव में एक बतख है कोई फर्क नहीं पड़ता; जो मायने रखता है वह यह है कि मैं इसके साथ कर सकता हूं कि मैं बतख के साथ क्या कर सकता हूं और बतख द्वारा प्रदर्शित व्यवहारों की अपेक्षा कर सकता हूं। मैं इसे ब्रेड क्रुम्ब्स खिला सकता हूं और बात मेरी ओर जा सकती है या मुझ पर आरोप लगा सकती है या वापस ले जा सकती है ... लेकिन यह मुझे ऐसे नहीं खाएगा जैसे कि घड़ियाल।
मुझे पता है कि मैं सामान्यीकृत उत्तर नहीं दे रहा हूं। रूबी में, हम चर या विधियों के प्रकार की घोषणा नहीं करते हैं - सब कुछ बस किसी प्रकार की वस्तु है। इसलिए नियम है "वर्ग प्रकार नहीं हैं"
रूबी में, वर्ग कभी नहीं (ठीक है, लगभग कभी नहीं) प्रकार है। इसके बजाय, किसी वस्तु का प्रकार उस वस्तु के द्वारा अधिक परिभाषित किया जाता है। रूबी में, हम इस बतख टाइपिंग को कहते हैं। यदि कोई वस्तु एक बतख की तरह चलती है और एक बतख की तरह बात करती है, तो दुभाषिया इसे इलाज के लिए खुश है जैसे कि यह एक बतख था।
उदाहरण के लिए, आप स्ट्रिंग में गीत की जानकारी जोड़ने के लिए एक रूटीन लिख रहे होंगे। यदि आप C # या जावा बैकग्राउंड से आते हैं, तो आपको यह लिखने के लिए लुभाया जा सकता है:
def append_song(result, song)
# test we're given the right parameters
unless result.kind_of?(String)
fail TypeError.new("String expected") end
unless song.kind_of?(Song)
fail TypeError.new("Song expected")
end
result << song.title << " (" << song.artist << ")" end
result = ""
append_song(result, song) # => "I Got Rhythm (Gene Kelly)"
रूबी के बत्तख टाइपिंग को गले लगाओ, और आप कुछ सरल लिखेंगे:
def append_song(result, song)
result << song.title << " (" << song.artist << ")"
end
result = ""
append_song(result, song) # => "I Got Rhythm (Gene Kelly)"
आपको तर्कों के प्रकार की जाँच करने की आवश्यकता नहीं है। यदि वे << (परिणाम के मामले में) या शीर्षक और कलाकार (गीत के मामले में) का समर्थन करते हैं, तो सब कुछ बस काम करेगा। यदि वे नहीं करते हैं, तो आपका तरीका किसी भी तरह एक अपवाद को फेंक देगा (जैसा कि यदि आपने प्रकारों की जांच की है तो यह किया होगा)। लेकिन जांच के बिना, आपकी विधि अचानक बहुत अधिक लचीली है। आप इसे एक सरणी, एक स्ट्रिंग, एक फ़ाइल, या किसी भी अन्य ऑब्जेक्ट को पारित कर सकते हैं जो कि << का उपयोग करता है, और यह सिर्फ काम करेगा।
डक टाइपिंग नहीं है टाइपिंग!
मूल रूप से "डक टाइपिंग" का उपयोग करने के लिए आप एक विशिष्ट प्रकार को लक्षित नहीं करेंगे, बल्कि एक व्यापक श्रेणी के उपप्रकार (वंशानुक्रम के बारे में बात नहीं करते हैं, जब मेरा मतलब है उपप्रकार का अर्थ है "एक ही प्रोफाइल के भीतर फिट होने वाली" चीजें ") एक सामान्य इंटरफ़ेस का उपयोग करके ।
आप एक ऐसी प्रणाली की कल्पना कर सकते हैं जो जानकारी संग्रहीत करती है। सूचना लिखने / पढ़ने के लिए आपको किसी प्रकार के भंडारण और सूचना की आवश्यकता होती है।
भंडारण के प्रकार हो सकते हैं: फ़ाइल, डेटाबेस, सत्र आदि।
इंटरफ़ेस आपको स्टोरेज प्रकार की परवाह किए बिना उपलब्ध विकल्पों (विधियों) को जानने देगा, जिसका अर्थ है कि इस बिंदु पर कुछ भी लागू नहीं है! दूसरे शब्दों में इंटरफ़ेस जानकारी संग्रहीत करने के बारे में कुछ भी नहीं जानता है।
हर स्टोरेज सिस्टम को इंटरफ़ेस के अस्तित्व को जानना होगा और इसे उसी तरीके से लागू करना होगा।
interface StorageInterface
{
public function write(string $key, array $value): bool;
public function read(string $key): array;
}
class File implements StorageInterface
{
public function read(string $key): array {
//reading from a file
}
public function write(string $key, array $value): bool {
//writing in a file implementation
}
}
class Session implements StorageInterface
{
public function read(string $key): array {
//reading from a session
}
public function write(string $key, array $value): bool {
//writing in a session implementation
}
}
class Storage implements StorageInterface
{
private $_storage = null;
function __construct(StorageInterface $storage) {
$this->_storage = $storage;
}
public function read(string $key): array {
return $this->_storage->read($key);
}
public function write(string $key, array $value): bool {
return ($this->_storage->write($key, $value)) ? true : false;
}
}
इसलिए अब, हर बार आपको जानकारी लिखने / पढ़ने की आवश्यकता है:
$file = new Storage(new File());
$file->write('filename', ['information'] );
echo $file->read('filename');
$session = new Storage(new Session());
$session->write('filename', ['information'] );
echo $session->read('filename');
इस उदाहरण में आप स्टोरेज कंस्ट्रक्टर में डक टाइपिंग का उपयोग करते हैं:
function __construct(StorageInterface $storage) ...
आशा है कि यह मदद की;)
मुझे लगता है कि यह डायनामिक टाइपिंग, स्टेटिक टाइपिंग और डक टाइपिंग को मिक्स करने के लिए उलझन में है। डक टाइपिंग एक स्वतंत्र अवधारणा है और यहां तक कि गो जैसी स्थिर टाइप की गई भाषा, एक प्रकार की जाँच प्रणाली हो सकती है, जो टाइपिंग को लागू करती है। यदि एक प्रकार की प्रणाली एक (घोषित) वस्तु के तरीकों की जांच करेगी, लेकिन प्रकार नहीं, तो इसे डक टाइपिंग भाषा कहा जा सकता है।
मैं अपने तरीके से प्रसिद्ध वाक्य को समझने की कोशिश करता हूं: "पायथन की खुराक किसी वस्तु की परवाह नहीं करना एक वास्तविक बतख है या नहीं। यह सभी परवाह है कि क्या वस्तु, पहली 'क्वैक', दूसरी 'एक बतख की तरह'।"
एक अच्छी वेबसाइट है। http://www.voidspace.org.uk/python/articles/duck_typing.shtml#id14
लेखक ने बताया कि बतख टाइपिंग से आप अपनी खुद की कक्षाएं बना सकते हैं जिनकी अपनी आंतरिक डेटा संरचना होती है - लेकिन सामान्य पायथन सिंटैक्स का उपयोग करके एक्सेस की जाती है।