ठेठ "गतिशील भाषा गलतियों" से कैसे बचें?


42

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

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

इसे और अधिक ध्यान से रखने के लिए:

  • आप ~ 2000 LOC के साथ एक जावास्क्रिप्ट (या उस मामले के लिए किसी अन्य गतिशील भाषा) परियोजना के लिए कैसे संपर्क करेंगे?
  • क्या मुझे उन गलतियों को रोकने के लिए उपकरण हैं? मैंने फेसबुक और JSHint द्वारा प्रवाह की कोशिश की है जो कुछ हद तक मदद करते हैं, लेकिन टाइपो को पकड़ नहीं पाते हैं।

2
भले ही लागतों को कम करने के तरीके हैं, फिर भी लागतें हैं
dcastro

29
मैं आपके प्रोग्राम को एक वैधानिक रूप से टाइप की गई भाषा में लिखने की कोशिश करूँगा, जो टाइपस्क्रिप्ट, स्काला.जैस या एल्म जैसे जावास्क्रिप्ट के लिए संकलित करता है।
dcastro

6
परीक्षण, परीक्षण, अधिक परीक्षण और कवरेज रिपोर्ट।
njzk2

7
~ 2000 LOC एक छोटा प्रोजेक्ट है। यह आसानी से फिट होना चाहिए कि एक गतिशील भाषा आसानी से और अच्छी तरह से क्या करती है। यदि आप उस तरह की आकार की परियोजना से जूझ रहे हैं, तो आपके पास अपने प्रोग्रामिंग कौशल के साथ और अधिक मौलिक समस्या है जो विशेष रूप से गतिशील भाषाओं के लिए प्रासंगिक है।
जैक एदले

5
@ जेकएडली असहमत। ओपी का उपयोग उच्च-स्तरीय समस्याओं पर ध्यान केंद्रित करने के लिए किया जाता है न कि एक पहचानकर्ता को ठीक से वर्तनी के लिए। यह प्रोग्रामिंग कौशल है। सही वर्तनी सुनिश्चित करना एक मध्यम ग्रेडर और / या उपकरण समर्थन द्वारा किया जा सकता है।
मुशाहो

जवाबों:


37

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

प्रकार जावास्क्रिप्ट विकासकर्ताओं को अत्यधिक उत्पादक विकास उपकरण और प्रथाओं का उपयोग करने में सक्षम करते हैं जैसे कि स्थिर अनुप्रयोग और जावास्क्रिप्ट अनुप्रयोगों को विकसित करते समय कोड रीफैक्टरिंग।

और यह जेएस का सिर्फ एक सुपरसेट है, जिसका अर्थ है कि आपके कुछ मौजूदा कोड टीएस के साथ ठीक काम करेंगे:

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


11
... और टाइपस्क्रिप्ट अनिवार्य रूप से Ecmascript 6.
रॉबर्ट हार्वे

11
उह, वह बोली दर्द होता है। यह सिर्फ दिखाता है कि Microsoft हमेशा एक स्थिर भाषा कंपनी रही है जो बस गतिशील भाषाओं को नहीं समझती है। "प्रकार सक्षम करें ... कोड रीफैक्टरिंग"? वास्तव में? क्या माइक्रोसॉफ्ट के पीआर विभाग को पता चलता है कि एक अभ्यास के रूप में कोड को फिर से छोटा करने का आविष्कार स्मालटाक (एक गतिशील भाषा) में किया गया था और इससे पहले भी फोर्थ (एक टाइपलेस भाषा) में अस्तित्व में था? स्थैतिक भाषाओं में भी IDE होने से पहले यह बहुत ही स्वचालित रीफैक्टरिंग उपकरण एक स्मालटाक आईडीई का हिस्सा था ? आधुनिक स्मॉलटाक आईडीई में जावा, सी #, और सी ++ के रूप में अधिक नहीं तो कम से कम शक्तिशाली के रूप में रीफैक्टरिंग उपकरण हैं? चलो।
जोर्ज डब्ल्यू मित्तग 16

5
टाइपस्क्रिप्ट अपने आप में एक महान भाषा है, आपको इस तरह के बकवास के साथ प्रयास करने और इसे धक्का देने की आवश्यकता क्यों है?
जोर्ज डब्ल्यू मित्तग 16

29
@ जोर्ग मैं काफी स्मालटाक के बारे में पता नहीं है, लेकिन जावास्क्रिप्ट या अजगर मैं के लिए हर एक आईडीई देखा है मील के लिए जावा या सी # एक अच्छा आईडीई क्या कर सकते हैं के पीछे। इसके अलावा कुछ चीजें हैं जो एक गतिशील भाषा में करने के लिए बस सादा असंभव हैं (कुछ वास्तव में सबसे लोकप्रिय रिफ्लेक्टरिंग): कहते हैं कि आपके पास एक सार्वजनिक कार्य foo(x) { return x.bar;}या ऐसा कुछ भी है। चूंकि कोई प्रकार की जानकारी नहीं है और फ़ंक्शन सार्वजनिक है (इसलिए आप सभी कॉलर्स को नहीं जान सकते हैं) आपके लिए यह पता लगाना असंभव है कि क्या बार को किसी वर्ग का नाम बदलने के लिए बार का नाम बदल दिया जाना चाहिए।
Voo

10
यह उत्तर कहता है कि "गतिशील भाषा की गलतियों" का समाधान गतिशील भाषा का उपयोग नहीं करना है।
bgusach

19

कुछ दृष्टिकोण हैं जो मदद कर सकते हैं:

इकाई का परीक्षण

जहां संभव हो वहां यूनिट टेस्ट लिखें। पूरी तरह से मैनुअल परीक्षण पर निर्भर या जंगली में कीड़े ढूंढना हिट-एंड-मिस है।

चौखटे का प्रयोग करें

अपने स्वयं के रोल करने और बग की शुरूआत को जोखिम में डालने के बजाय, जहां संभव हो, स्थापित रूपरेखाओं का उपयोग करें।

सीएसएस / उच्च-स्तरीय भाषाओं को प्राथमिकता दें

जहाँ आप CSS या जिस भी उच्च स्तरीय भाषा में लिख रहे हैं, उसमें कार्यक्षमता को कम कर सकते हैं।

Refactor

कोड की मात्रा को कम करने के लिए रिफ्लेक्टर। कम कोड = चीजों के गलत होने के लिए कम स्थान।

पुन: उपयोग

मौजूदा कोड का पुन: उपयोग करें जहाँ आप कर सकते हैं। यहां तक ​​कि अगर कोड एक सटीक मिलान नहीं है, तो भी कुछ नया लिखने के बजाय कॉपी, पेस्ट और संशोधित करना बेहतर हो सकता है।

IDEs

आधुनिक आईडीई में आमतौर पर कम से कम कुछ जावास्क्रिप्ट का समर्थन होता है। कुछ टेक्स्ट एडिटर्स भी जावास्क्रिप्ट के बारे में जानते हैं।


5
सच होते हुए, आपकी सलाह मूल रूप से प्रत्येक प्रोग्रामिंग भाषा पर लागू होती है और इसका मुख्य उद्देश्य गतिशील भाषाओं से उत्पन्न होने वाली तार्किक गलतियों को ठीक करना है ।
edmz

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

4
"सीएसएस / उच्च-स्तरीय भाषाओं को प्राथमिकता दें" - मैं वास्तव में नहीं समझता कि जावास्क्रिप्ट के संबंध में इस बिट का क्या मतलब है: क्या आप जेएस कोड के बजाय तत्वों (जैसे एनीमेशन, शायद?) को स्टाइलशीट में स्थानांतरित करने के लिए कह रहे हैं? CSS उच्च-स्तरीय भाषाओं से कैसे संबंधित है?
anotherdave

@anotherdave जावास्क्रिप्ट के डोमेन को मजबूती से इस्तेमाल करने के लिए बहुत कुछ अब CSS3 में हासिल किया जा सकता है। कुछ कार्यक्षमता को संभवतः उच्च स्तर की भाषा में भी स्थानांतरित किया जा सकता है जो अधिक कठोर नियंत्रणों के अधीन होगा।
रोबी डे

4
@anotherdave अधिकांश लोग जो जावास्क्रिप्ट के साथ करने की कोशिश करते हैं, वह बाहरी और अनुचित है। मानक भाषा उपकरण, चौखटे प्रदान करने वाली लाइब्रेरी जो मानक HTML तत्वों को थोड़ा और अधिक प्रदान करती हैं, कोड जो एंकर, MVC एमुलेशन, स्टाइलिंग, DOM रिइम्प्लीमेंटेशन, AJAX एब्स्ट्रैक्शन, ट्रिवियल ऑब्जेक्ट्स प्रदान करना (SVG को फिर से लागू करना), पॉलीफ़िलिंग फीचर्स की तरह नहीं है। उपयोगकर्ता को फायदा होगा ... आपको उस जेएस को कम से कम करना चाहिए जो आप लिखते हैं। यदि आप इसे जेएस के बिना कर सकते हैं, तो जेएस के बिना करें।
bjb568

2

एक उपकरण जिसका अभी तक उल्लेख नहीं किया गया है, वह सरल, फ़ाइल-स्थानीय या प्रोजेक्ट-वाइड टेक्स्ट खोज है

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

यह मेरे लिए (स्थैतिक विश्लेषणकर्ताओं के अलावा) एक प्रभावी उपकरण रहा है, और आपके प्रोजेक्ट का आकार 2k LOC दिया गया है, जो कि मेरी राय में विशेष रूप से बड़ा नहीं है, उम्मीद है कि यह आश्चर्यजनक रूप से काम करेगा।


2
grepएक लंबा रास्ता जाता है। जब तक आप बहुत अजीब गतिशील चीजें नहीं करते हैं, यह चाल करता है। हालाँकि, यह बहुत ही मैन्युअल लगता है यदि आप स्थिर टाइप की भाषाओं के लिए IDE के लिए उपयोग किए जाते हैं।
bgusach

1

मैं वर्तमान में एक बड़ी AngularJS परियोजना पर कोड की कई हज़ार पंक्तियों का पुन: प्रकाशन कर रहा हूं। सबसे बड़ी बाधाओं में से एक दिए गए फ़ंक्शन के सटीक अनुबंध का पता लगाना है। मैंने कभी-कभी एपीआई प्रलेखन पढ़ना समाप्त कर दिया क्योंकि कच्ची एपीआई प्रतिक्रिया के तत्वों को चर के लिए सौंपा गया था जो कि संशोधित होने से पहले कोड की 6 परतों के माध्यम से चला गया और कोड के 6 और परतों के माध्यम से वापस आ गया।

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

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

एक पाठ संपादक (उदात्त पाठ) से एक उचित आईडीई (वेबस्टॉर्म) पर स्विच करना भी सामान्य रूप से कोड के साथ काम करना बहुत आसान बनाता है। यदि आप गलत प्रकार की आपूर्ति करते हैं या गलत तरीके से रिटर्न मान का उपयोग करते हैं, तो WebStorm JSDoc का उपयोग अपेक्षित पैरामीटर प्रकारों के बारे में संकेत देने और त्रुटि को बढ़ाने के लिए करेगा।

जावास्क्रिप्ट में, नए फीचर्स जैसे कि सिंबल और गेट्टर / सेटर, वैरिएबल असाइनमेंट में जोर डालकर क्वालिटी के एक निश्चित स्तर को लागू करने में मदद कर सकते हैं (उदाहरण के लिए सुनिश्चित करें कि पूर्णांक सीमा के भीतर है, या डेटा ऑब्जेक्ट में कुछ विशेषताएँ हैं)।

दुर्भाग्य से, मुझे नहीं लगता कि गतिशील भाषा की गलतियों को रोकने के लिए एक सही समाधान है, केवल उपायों की एक श्रृंखला जो उनकी आवृत्ति को कम करने में मदद कर सकती है।


0

मेरे सवाल का जवाब "आप ~ 2000 LOC के साथ एक जावास्क्रिप्ट (या उस मामले के लिए किसी अन्य गतिशील भाषा) परियोजना के लिए कैसे संपर्क करें?"

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

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

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

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

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