गुणों और विधियों की जांच किए बिना आप जावास्क्रिप्ट में बतख टाइपिंग का उपयोग कैसे करते हैं?


11

मुझे पता है कि जावास्क्रिप्ट डक टाइपिंग का उपयोग करता है और पहले मुझे लगा कि यह # जैसी सशक्त टाइप की गई भाषाओं की तुलना में बहुरूपता को आसान बना देगा। लेकिन अब मेरे कार्य जो तर्क देते हैं वे चीजों से अटे पड़े हैं:

if(myObj.hasSomeProperty())

या

if(myObj.hasSomeMethod())

या

if(isNumber(myParam))

आदि।

यह वास्तव में मेरे लिए बदसूरत है। मैं एक C # बैकग्राउंड से आता हूं और मुझे परिभाषित इंटरफेस बहुत बेहतर लगते हैं।

मैं सोच रहा हूँ कि क्या मैं गलत तरीके से रणनीतियों को लागू करने का प्रयास कर रहा हूं जो कि सांख्यिकीय रूप से टाइप की गई भाषाओं में प्रभावी हैं और यह जावास्क्रिप्ट में ऐसा करने का कोई बेहतर तरीका है?

मुझे पता है कि मैं सिर्फ जांच नहीं कर सकता था, लेकिन जावास्क्रिप्ट रन टाइम त्रुटियों को ट्रैक करना एक बुरा सपना हो सकता है क्योंकि वे हमेशा ऐसा नहीं करते हैं जहां त्रुटि वास्तव में कोड में हो रही है।


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

जहाँ यह सुनिश्चित करने के लिए इन जाँचों को करने में मदद मिल सकती है, यह सुनिश्चित करने के लिए कि प्रकार आवश्यक इंटरफ़ेस आवश्यकताओं के अनुरूप हों (यह देखने के लिए कि क्या उनके पास आवश्यक तरीके हैं, उदाहरण के लिए) आपके अधिकांश केंद्रीय और व्यापक रूप से उपयोग किए जाने वाले कार्य हैं (अस्थिरता वाले 0 = के साथ) अपवाही / अभिवाही युग्मन मीट्रिक मार्टिन प्रदान करता है)। यह एक बहुत छोटा लक्ष्य होना चाहिए। आम तौर पर बहुत सारे एक-बंद स्थानीय कार्य होते हैं जो दायरे में अलग-थलग होते हैं - जिन्हें शायद रनटाइम चेक के ऐसे व्यापक सेट की आवश्यकता नहीं होती है। वे बहुत जटिलता जमा नहीं करते हैं।

टाइप स्क्रिप्ट पर स्विच करें। यह अभी भी टंकित है, लेकिन संकलन समय पर कई त्रुटियों का पता लगाने के लिए स्थैतिक टाइपिंग का समर्थन करता है।
कोडइन्चोज

2
आप बतख-टाइपिंग की सबसे बड़ी समस्या पर आ गए हैं: इसकी शक्ति इसकी कमजोरी से निकलती है। यदि आप ऑब्जेक्ट ओरिएंटेड जावास्क्रिप्ट करना चाहते हैं, तो आपको बस रन-टाइम त्रुटियों के साथ रहना होगा, और आशा है कि आपके यूनिट टेस्ट उन्हें बनाने के तुरंत बाद ही मिल जाएंगे:
रॉस पैटरसन

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

जवाबों:


11

गुणों और विधियों की जांच किए बिना आप जावास्क्रिप्ट में बतख टाइपिंग का उपयोग कैसे करते हैं?

सरल: हमेशा गुणों और विधियों की जांच न करें।

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

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

आप यहां टाइपिंग के कई ऑर्थोगोनल अक्ष को भ्रमित कर रहे हैं। टाइपिंग के चार ऑर्थोगोनल अक्ष हैं:

  • कब : डायनामिक टाइपिंग (प्रकार ज्ञात नहीं हैं और रनटाइम तक चेक नहीं किए गए हैं) बनाम स्टेटिक टाइपिंग (प्रकार रनटाइम से पहले ज्ञात और चेक किए गए हैं)
  • क्या : बतख टाइपिंग (प्रकार व्यवहार पर आधारित हैं ), संरचनात्मक टाइपिंग (प्रकार संरचना पर आधारित हैं ), और नाममात्र टाइपिंग (प्रकार नाम पर आधारित हैं )
  • क्या आप उन्हें देख सकते हैं? स्पष्ट टाइपिंग (प्रकारों को स्पष्ट रूप से एनोटेट करना पड़ता है) बनाम अंतर्निहित टाइपिंग (प्रकार अनुमानित हैं)
  • मजबूत टाइपिंग बनाम कमजोर टाइपिंग - आपने देखा होगा कि मैंने इसे एक आकर्षक शीर्षक नहीं दिया और न ही कोष्ठक में स्पष्टीकरण दिया, ऐसा इसलिए क्योंकि ऊपर दिए गए सात शब्दों के विपरीत, जिनमें से प्रत्येक में एक ही सार्वभौमिक रूप से स्वीकृत सटीक परिभाषा है, ये दो शब्द लगभग एक दर्जन अर्ध-व्यापक रूप से इस्तेमाल की जाने वाली अस्पष्ट परिभाषाएं हैं जो एक दूसरे के विपरीत हैं; आदर्श रूप से आपको इन शर्तों से पूरी तरह बचना चाहिए, और यदि आपको इनका उपयोग करना चाहिए , तो पहले इन्हें परिभाषित करें

चूँकि आपने C # का उल्लेख किया है: यह ज्यादातर सांख्यिकीय रूप से टाइप किया गया है, लेकिन dynamicयह टाइपिंग के माध्यम से डायनामिक टाइपिंग का समर्थन करता है , यह ज्यादातर नाममात्र टाइप का होता है, लेकिन अनाम प्रकार संरचनात्मक टाइपिंग का उपयोग करते हैं, और सिंथैटिक पैटर्न (जैसे कि LINQ क्वेरी कॉम्प्रिहेंशन सिंटैक्स) को या तो बतख होने का तर्क दिया जा सकता है टाइप किया गया या संरचनात्मक रूप से टाइप किया गया, यह ज्यादातर स्पष्ट रूप से टाइप किया गया है, लेकिन सामान्य प्रकार के तर्कों और स्थानीय चर के लिए निहित टाइपिंग का समर्थन करता है (हालांकि स्थानीय चर मामला अधिकांश अन्य भाषाओं की तुलना में अजीब है, क्योंकि आप केवल टाइप छोड़ नहीं सकते हैं, इसके बजाय आपको करना होगा। इसे एक स्पष्ट छद्म प्रकार देंvarदूसरे शब्दों में, यदि आप एक निहित प्रकार चाहते हैं, तो आपको स्पष्ट रूप से ऐसा कहना होगा)। C # जोरदार या कमजोर टाइप किया गया है या नहीं, यह एक बात है कि आप जिन दो शब्दों का उपयोग करते हैं, उनकी परिभाषा कौन सी है, हालाँकि, ध्यान दें कि C # में रनटाइम टाइप की बहुत सारी त्रुटियां हो सकती हैं, खासकर असुरक्षित सरणी सहसंयोजक के कारण।

मुझे पता है कि मैं सिर्फ जांच नहीं कर सकता था, लेकिन जावास्क्रिप्ट रन टाइम त्रुटियों को ट्रैक करना एक बुरा सपना हो सकता है क्योंकि वे हमेशा ऐसा नहीं करते हैं जहां त्रुटि वास्तव में कोड में हो रही है।

डिबगिंग सीखना आसान कौशल नहीं है। हालांकि, डिबगिंग को आसान बनाने की तकनीकें हैं, उदाहरण के लिए सैफ स्क्वीज़ , केंट बेक द्वारा वर्णित एक तकनीक है जो डीबगिंग के लिए परीक्षण और रीफैक्टरिंग का उपयोग करती है:

मारो उन्हें उच्च, मारो उन्हें कम :

प्रतिगमन परीक्षण और सैफ निचोड़

केंट बेक, थ्री रिवर इंस्टीट्यूट

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


मानव उन्मुख संदेश के रूप में "पृष्ठ अब उपलब्ध नहीं है" के साथ हिट हिट हाई हाई इम कम लिंक मेरे लिए एक http 500 प्राप्त करता है।
joshp

Threeriversinstitute.org डोमेन लगता है छोड़ दिया गया है।
बार्ट वैन इनगेन शेनॉ

आह, लानत है। और यह भी WayBack मशीन पर संग्रहीत नहीं है ।
जोर्ग डब्ल्यू मित्तग

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

@Lionion: प्रलेखन, अच्छा नामकरण, सामान्य ज्ञान, व्यवहार विनिर्देशों के रूप में परीक्षण, स्रोत कोड को पढ़कर, आप इसे नाम देते हैं। ध्यान दें कि यह वास्तव में C # 's या Java के कमजोर प्रकार के सिस्टम से बहुत अलग नहीं है: जैसे कि रिटर्न वैल्यू का अर्थ IComparer<T>.Compare(T, T)केवल दस्तावेज से स्पष्ट है, न कि प्रकार से। और कहाँ के प्रकार में java.util.Collections.binarySearch(java.util.List<T>)यह कहता है कि ...
Jörg W Mittag

1

मुझे पता है कि मैं सिर्फ जांच नहीं कर सकता था, लेकिन जावास्क्रिप्ट रन टाइम त्रुटियों को ट्रैक करना एक बुरा सपना हो सकता है क्योंकि वे हमेशा ऐसा नहीं करते हैं जहां त्रुटि वास्तव में कोड में हो रही है।

वास्तव में, ठेठ अभ्यास की जाँच नहीं है। और, हां, इसका मतलब यह है कि आपको जावास्क्रिप्ट त्रुटियाँ मिलेंगी जो वास्तविक समस्या से कहीं और बताई गई हैं। लेकिन व्यवहार में, मुझे यह एक बड़ी समस्या नहीं लगती।

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

जब मुझे रनटाइम त्रुटि मिलती है, तो मुझे कम से कम स्टैक ट्रेस मिला है, और इन-ब्राउज़र त्रुटि के मामले में मुझे स्टैक ट्रेस के किसी भी स्तर पर जाने और चर का निरीक्षण करने की क्षमता मिली है। यह आमतौर पर वापस ट्रेस करना आसान है, जहां से खराब मूल्य आया था, और इस तरह इसे मूल समस्या में वापस ट्रेस किया गया।

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

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


0

मुझे लगता है कि आप सही काम कर रहे हैं, आपको बस उस शैली को खोजने की जरूरत है जो आपकी आंख को अधिक भाएगी। यहाँ कुछ विचार हैं:

  • इसके बजाय if(myObj.hasSomeProperty())आप उपयोग कर सकते हैं if( myobj.prop !== undefined )। यह, बीटीडब्ल्यू केवल गैर-सख्त मोड में काम करेगा, जिस सख्त मोड में आपको उपयोग करना होगा if( typeof myobj.prop !== 'undefined' )

  • आप सत्यापनकर्ताओं को अलग करने के लिए कुछ प्रकार की जाँच बंद कर सकते हैं। यह इंटरफेस को परिपक्व होने के बाद सत्यापन को छोड़ देने में सक्षम होने का लाभ है, उदाहरण के लिए if( is_valid( myobject )), जहां से is_validशुरू होता है if( !DEBUG ) return true;

  • कभी-कभी यह एक विहित रूप में इनपुट क्लोन करने के लिए समझ में आता है, जिस स्थिति में आप क्लोनिंग फ़ंक्शन या ऑब्जेक्ट में विभिन्न सत्यापन लक्ष्य एकत्र कर सकते हैं। उदाहरण के लिए, में निर्माता आसानी से एक केंद्रीय स्थान में सभी विभिन्न सत्यापन चला सकते हैं।my_data = Data( myobj, otherstuff )Data

  • आप कुछ लाइब्रेरी का उपयोग कर सकते हैं जो (एक प्रदर्शन टोल पर) आपके प्रकार के सत्यापन को और अधिक सुरुचिपूर्ण बनाने में कारगर बनाती हैं। यहां तक ​​कि अगर आप लंबे समय तक इस मार्ग को नहीं अपनाएंगे तो भी आपको अपने अंदाज में सहजता से आने में आसानी हो सकती है। कुछ उदाहरणों में xtype.js , type-check , validator.js , आदि शामिल हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.