मैं इस प्रश्न का उत्तर जोड़ना चाहूंगा, क्योंकि मैं हाल ही में कुछ अच्छे, बुरे, लेकिन ज्यादातर बदसूरत जावा के माध्यम से ट्रूडिंग कर रहा हूं और मेरे पास जावा और जावा बनाम बनाम जेएस और जेएस देवों कि वास्तव में उपयोगी सच्चाई जैसा कुछ में आधारित हो सकता है।
वहाँ आईडीई हैं, लेकिन यह समझने में मददगार हो सकता है कि वहाँ कई क्यों नहीं बने हैं
मैं अब वेबस्टॉर्म की कोशिश कर रहा हूं कि मैं अपने आप को नोड विकास के लिए तैयार करूं और यह बुरी तरह से पर्याप्त नहीं है कि मैंने वास्तव में इसे खरीदा है, लेकिन मैं अभी भी डब्ल्यूएस की तुलना में अधिक बार एसईईटी में जेएस फाइलें खोलने के लिए जाता हूं। इसका कारण यह है कि आप JS में बहुत कम के साथ बहुत कुछ कर सकते हैं, बल्कि इसलिए भी क्योंकि UI काम तत्काल प्रतिक्रिया देता है, ब्राउज़र देव टूल (विशेष रूप से क्रोम और फायरबग) वास्तव में काफी उत्कृष्ट हैं, और गैर-ब्राउज़र संदर्भों के लिए लेखांकन ) संकलित कदम के बिना परिवर्तित कोड तेजी से और आसानी से चल रहा है।
एक और बात जो मुझे पूरी तरह से आश्वस्त करती है, वह यह है कि आईडीई मूल रूप से मैला कोड को सक्षम करके अपनी मांग बनाता है जिसे आप वास्तव में जावास्क्रिप्ट में बर्दाश्त नहीं कर सकते। हम जेएस में प्रबंधन करना सीखना चाहते हैं? यह एक IDE के बिना जावा में कुछ गैर-तुच्छ लिखने की कोशिश करके शुरू करने में मदद कर सकता है और उन चीजों पर ध्यान देना चाहिए जो आपको करना शुरू करना है और इस बारे में सोचना है कि वास्तव में आईडीई के बिना उस कोड को बनाए रखने / संशोधित करने में सक्षम हो। आगे। IMO, वही चीजें अभी भी बनाए रखने योग्य कोड लिखने के लिए महत्वपूर्ण हैं कि आपके पास एक आईडीई है या नहीं। अगर मुझे 4 साल का प्रोग्रामिंग पाठ्यक्रम लिखना होता है, तो यह आपको उपकरण और निर्भरता नहीं होने के हित में पहले दो वर्षों के लिए एक आईडीई को छूने नहीं देगा।
संरचना
अनुभवी जेएस देव जटिल अनुप्रयोगों से निपटते हैं और अपने कोड की संरचना कर सकते हैं। वास्तव में यह एक ऐसी चीज है जिसके लिए हमें एक प्रारंभिक इतिहास के साथ बेहतर होना चाहिए, जिसमें हमारे लिए कोड पढ़ने के लिए IDE का अभाव है, लेकिन यह भी क्योंकि शक्तिशाली रूप से अभिव्यंजक भाषाएं शक्तिशाली ढंग से पूरी तरह से अनपेक्षित आपदा कोडबेस को बहुत तेजी से व्यक्त कर सकती हैं यदि आप सोच-समझकर नहीं करते हैं।
मुझे वास्तव में हाल ही में हमारे जावा कोडबेस को समझने में काफी कठिन सीखने की अवस्था थी, जब तक कि मुझे अंततः यह पता नहीं चला कि इसमें से कोई भी उचित ओओपी नहीं था। कक्षाएं सेम या डीटीओ या स्टैटिक गेटर्स / सेटरों के आसपास बैठे विश्व स्तर पर उपलब्ध डेटा को बदलने वाले शिथिल संबंधित तरीकों के बंडलों से ज्यादा कुछ नहीं थीं। यह मूल रूप से वही पुराना जानवर है जिसे OOP को बदलना था। इसलिए मैंने मूल रूप से कोड के बारे में देखना और सोचना बंद कर दिया। मैंने बस शॉर्टकट कुंजियाँ सीखीं और मैसेजेस के माध्यम से पता लगाया और सब कुछ बहुत आसानी से हो गया। इसलिए यदि आप पहले से ही इस आदत में नहीं हैं, तो OOD के बारे में बहुत अधिक सोचें।
उच्चतम स्तर पर एक अच्छी तरह से संरचित जेएस ऐप जटिल कार्यों (जैसे jQuery) और एक दूसरे के साथ बातचीत करने वाली वस्तुओं से मिलकर बनेगी। मैं तर्क दूंगा कि किसी भी भाषा में एक अच्छी तरह से संरचित, आसानी से बनाए रखा गया ऐप का निशान यह है कि यह पूरी तरह से सुपाच्य है कि आप इसे आईडीई या नोटपैड ++ के साथ देख रहे हैं या नहीं। यह उन मुख्य कारणों में से एक है जिनकी मैं अत्यधिक निर्भरता इंजेक्शन और परीक्षण-पहले टीडीडी को चरम पर ले जाता हूं।
और अंत में, कक्षाओं में जाने दें। प्रोटोटाइप विरासत जानें। जब वास्तव में आपको विरासत की आवश्यकता होती है, तो इसे लागू करना वास्तव में काफी आसान होता है। मुझे लगता है कि कंपोज़िटिंग दृष्टिकोण जेएस में बेहतर काम करते हैं, हालांकि, और मैं व्यक्तिगत रूप से बीमार होने लगता हूं और किसी भी समय किसी भी भाषा में चल रहे विरासत के एक या दो से अधिक स्तर देखता हूं।
कोर सिद्धांत पहले
मैं उस मुख्य सामग्री के बारे में बात कर रहा हूं जो अन्य सभी अच्छी प्रथाओं से प्राप्त होनी चाहिए: DRY, YAGNI, कम से कम विस्मय, सिद्धांत डोमेन के स्वच्छ पृथक्करण का सिद्धांत, इंटरफ़ेस लिखना और मानव सुपाठ्य कोड लिखना मेरा व्यक्तिगत मूल है। कुछ और जटिल जो उन प्रथाओं को छोड़ने की वकालत करते हैं, उन्हें किसी भी भाषा में कूल एड माना जाना चाहिए, लेकिन विशेष रूप से जावास्क्रिप्ट जैसी भाषा जहां यह शक्तिशाली है कि अगले आदमी के लिए बहुत भ्रामक कोड की विरासत को छोड़ना आसान है। मिसाल के तौर पर लूज़ कपलिंग तब तक बहुत अच्छी चीज है, जब तक आप इसे नहीं लेते हैं, आप यह भी नहीं बता सकते हैं कि ऑब्जेक्ट्स के बीच इंटरेक्शन कहां हो रहा है।
डर टाइपिंग टाइपिंग मत करो
जावास्क्रिप्ट में बहुत सारे मुख्य प्रकार नहीं हैं। अधिकांश भाग के लिए, गतिशील कास्टिंग नियम व्यावहारिक और सीधे-आगे हैं, लेकिन यह उन्हें सीखने के लिए भुगतान करता है ताकि आप अनावश्यक जाति और व्यर्थ सत्यापन रूटीन के बिना डेटा प्रवाह का प्रबंधन करना बेहतर ढंग से सीख सकें। मुझ पर विश्वास करो। संकलित करने के लिए सख्त प्रकार प्रदर्शन और समस्याओं को सुलझाने के लिए बहुत अच्छे हैं, लेकिन वे आपको कुछ भी नहीं बचाते हैं।
जेएस फंक्शंस और क्लोजर से बाहर बकवास जानें
जेएस के प्रथम श्रेणी के कार्य यकीनन मुख्य कारण हैं कि जेएस ने "ओनली लैंग्वेज वर्थ टचिंग द क्लाइंट-साइड वेब विद अवार्ड" जीता। और हाँ, वास्तव में प्रतिस्पर्धा थी। वे जेएस की एक केंद्रीय विशेषता भी हैं। हम उनके साथ वस्तुओं का निर्माण करते हैं। सब कुछ कार्यों के लिए scoped है। और उनके पास उपयोगी विशेषताएं हैं। हम तर्क कीवर्ड के माध्यम से परीक्षाओं की जांच कर सकते हैं। हम अन्य वस्तुओं के तरीकों के संदर्भ में अस्थायी रूप से उन्हें संलग्न कर सकते हैं और उन्हें आग लगा सकते हैं। और वे घटनाओं को संचालित करने के दृष्टिकोण को अश्लील रूप से लागू करना आसान बनाते हैं। संक्षेप में, उन्होंने जेएस की जटिलता को कम करने के लिए जेएस को एक पूर्ण जानवर बना दिया और स्रोत पर ही जेएस के कार्यान्वयन (लेकिन ज्यादातर डोम एपीआई) को अलग-अलग लागू कर दिया।
अपनाने से पहले पैटर्न / अभ्यास का पुन: मूल्यांकन करें
प्रथम श्रेणी के कार्य और गतिशील प्रकार जेएस में बहुत अधिक जटिल डिजाइन पैटर्न को पूरी तरह से व्यर्थ और बोझिल करते हैं। हालांकि, सरल पैटर्न में से कुछ, JS की अत्यधिक लचीली प्रकृति को लागू करने के लिए अविश्वसनीय रूप से उपयोगी और आसान हैं। एडेप्टर और डेकोरेटर विशेष रूप से उपयोगी होते हैं और मुझे जटिल यूआई विजेट फैक्टरियों के लिए सिंगलेट्स मददगार मिले हैं जो उन यूआई तत्वों के लिए ईवेंट-मैनेजर के रूप में कार्य करते हैं जो वे बनाते हैं।
भाषा के लीड का पालन करें और कम के साथ अधिक करें
मेरा मानना है कि जावा हेड होनकोस में से एक तर्क कहीं न कहीं यह तर्क देता है कि वाचालता वास्तव में एक सकारात्मक विशेषता है जो सभी पक्षों को समझने के लिए कोड को आसान बनाती है। बेतुकी। अगर यह सच होता, तो कानूनी पढ़ना आसान होता। केवल लेखक ही बना सकता है कि उन्होंने क्या लिखा है, इसे समझना आसान है और आप कभी-कभार खुद को दूसरे व्यक्ति के जूते में डालकर ऐसा कर सकते हैं। इसलिए इन दो नियमों को अपनाएं। 1. यथासंभव प्रत्यक्ष और स्पष्ट रहें। 2. लानत बिंदु पर पहले से ही जाओ। जीत यह है कि स्वच्छ, संक्षिप्त कोड परिमाण के आदेश हैं जो उस चीज़ को समझने और बनाए रखने में आसान हैं जहां आपको ट्रिगर से वास्तविक वांछित कार्रवाई करने के लिए पच्चीस परतों को पार करना पड़ता है। अधिकांश पैटर्न जो सख्त भाषाओं में उस प्रकार की वकालत करते हैं, वे वास्तव में उन सीमाओं के लिए वर्कअराउंड हैं जो जावास्क्रिप्ट के पास नहीं हैं।
सब कुछ निंदनीय है और यही ठीक है
जेएस शायद लोकप्रिय उपयोग में सबसे कम संरक्षणवादी भाषाओं में से एक है। गले लगा लो कि यह बढ़िया काम करता है। उदाहरण के लिए, आप एक निर्माण कार्य में नियमित रूप से vars घोषित करके दुर्गम लगातार "निजी" var के साथ ऑब्जेक्ट लिख सकते हैं और मैं अक्सर ऐसा करता हूं। लेकिन यह मेरे कोड या इसके उपयोगकर्ताओं को "खुद से" की रक्षा करने के लिए नहीं है (वे इसे रन-टाइम के दौरान अपने स्वयं के संस्करण के साथ बदल सकते हैं)। लेकिन इसके बजाय यह इरादे को संकेत देने के लिए है क्योंकि धारणा यह है कि दूसरा आदमी सक्षम है कि वह किसी भी निर्भरता को कम नहीं करना चाहता है और यह देखेगा कि आप इसे एक अच्छे कारण के लिए सीधे प्राप्त करने के लिए नहीं हैं।
कोई आकार सीमाएं नहीं हैं, केवल समस्या डोमेन हैं
मेरे द्वारा देखी गई सभी जावा कोडबेस के साथ सबसे बड़ी समस्या है, यह क्लास फाइलों की अधिकता है। सबसे पहले एसओएलआईडी केवल एक भ्रामक पुनर्वितरण है जो आपको पहले से ही ओओपी के बारे में जानना चाहिए। एक वर्ग को संबंधित समस्याओं के एक विशिष्ट सेट को संभालना चाहिए। एक विधि से एक समस्या नहीं। यह केवल बूढ़े चिनिंग फंक-स्पेगेटी सी कोड को केवल बूट करने के लिए सभी व्यर्थ वर्ग सिंटैक्स के साथ ले रहा है। कोई आकार या विधि सीमा नहीं है। अगर यह पहले से ही लंबे समारोह या वर्ग या निर्माता के लिए कुछ जोड़ने के लिए समझ में आता है, यह समझ में आता है। JQuery ले लो। यह एकल फ़ंक्शन में पूरी लाइब्रेरी-लंबाई का टूलसेट है और इसमें कुछ भी गलत नहीं है। क्या हमें अभी भी jQuery की आवश्यकता उचित बहस पर है, लेकिन डिजाइन के मामले में,
अगर जावा ऑल यू नो, डब्बल इन समथिंग विथ ए नॉन-सी-बेस्ड सिंटेक्स है
जब मैंने पायथन के साथ खिलवाड़ करना शुरू किया क्योंकि मुझे पसंद था कि मैं जोंगो के बारे में क्या सुन रहा था, मैंने भाषा डिजाइन से वाक्य रचना को अलग करना शुरू करना सीख लिया। नतीजतन, जावा और सी को उनके भाषा डिज़ाइन भागों के एक योग के रूप में समझना आसान हो गया, बल्कि एक ही वाक्यविन्यास के साथ वे अलग-अलग करते हैं। एक अच्छा साइड-इफेक्ट यह है कि जितना अधिक आप डिजाइन के संदर्भ में अन्य भाषाओं को समझते हैं, उतना ही बेहतर होगा कि आप इसके विपरीत सबसे अच्छी तरह से जानते हैं।
निष्कर्ष
अब, उस सब पर विचार करते हुए, अपनी सभी समस्या-बिंदुओं को प्रभावित करें:
- किसी फ़ंक्शन के प्रवेश बिंदु को खोजने का कोई तत्काल तरीका नहीं है (एक सादे पाठ खोज के अलावा, जिसके परिणामस्वरूप बाद में कॉल पदानुक्रम के तरीकों की खोज हो सकती है, दो या तीन के बाद आप भूल गए हैं कि आप कहाँ शुरू हुए थे)
क्रोम और फायरबग वास्तव में कॉल-ट्रेसिंग है। लेकिन संरचना पर मेरी बातों को भी देखें और चीजों को संक्षिप्त और प्रत्यक्ष रखें। जितना अधिक आप अपने ऐप के बारे में सोच सकते हैं, बड़े-बड़े अतिक्रमित निर्माण एक-दूसरे के साथ बातचीत करते हैं, उतना ही आसान यह पता लगाना है कि गलती किसकी है जब चीजें गलत होती हैं। मैं कहूंगा कि यह जावा का भी सच है। हमारे पास वर्ग-प्रकार के फ़ंक्शन निर्माता हैं जो पारंपरिक ओओपी चिंताओं के लिए पूरी तरह से उपयोगी हैं।
function ObjectConstructor(){
//No need for an init method.
//Just pass in params and do stuff inside for instantiation behavior
var privateAndPersistent = true;
//I like to take advantage of function hoisting for a nice concise interface listing
this.publicAndPointlessEncapsulationMurderingGetterSetter
= publicAndPointlessEncapsulationMurderingGetterSetter;
//Seriously though Java/C# folks, stop with the pointless getter/setters already
function publicAndPointlessEncapsulationMurderingGetterSetter(arg){
if(arg === undefined){
return privateAndPersistent;
}
privateAndPersistent = arg;
}
}
ObjectConstructor.staticLikeNonInstanceProperty = true;
var instance = new ObjectConstructor();//Convention is to capitalize constructors
मेरे कोड में, मैं लगभग कभी भी वस्तुनिष्ठ {}
अनुप्रयोग घटकों का उपयोग संरचनात्मक ऐप घटकों के रूप में नहीं करता हूं क्योंकि वे आंतरिक (निजी) संस्करण नहीं हो सकते हैं और डेटा संरचनाओं के रूप में उपयोग करने के लिए उन्हें आरक्षित करने के बजाय पसंद करते हैं। यह एक ऐसी उम्मीद स्थापित करने में मदद करता है जो इरादे की स्पष्टता को बनाए रखती है। (यदि आप कर्लियां देखते हैं, तो यह डेटा है, ऐप आर्किटेक्चर का एक घटक नहीं है)।
- पैरामीटर्स फ़ंक्शंस में पास किए जाते हैं, यह जानने का कोई तरीका नहीं है कि उस पैरामीटर पर कौन से गुण और फ़ंक्शंस उपलब्ध हैं (वास्तव में प्रोग्राम चलाने के अलावा, उस बिंदु पर नेविगेट करना, जिस पर फ़ंक्शन को बुलाया जाता है, और सभी गुणों को आउटपुट करने के लिए कंसोल.लॉग्स का उपयोग किया जाता है। उपलब्ध)
फिर से, आधुनिक ब्राउज़र टूल देखें। लेकिन फिर भी, कार्यक्रम को फिर से चलाने के लिए ऐसा क्यों है? रीलोड एक क्लाइंट-साइड वेब देव है जो आमतौर पर हर कुछ मिनटों में हिट करता है क्योंकि यह आपको कुछ भी करने के लिए बिल्कुल खर्च करता है। यह फिर से है, एक और बिंदु जो ऐप संरचना के साथ सहायक हो सकता है, लेकिन यह जेएस का एक डाउन-साइड ट्रेडऑफ़ है जिसे आपको अनुबंधों को लागू करने के लिए अपना स्वयं का सत्यापन चलाना होगा, महत्वपूर्ण है (कुछ ऐसा जो मैं केवल एंडपॉइंट पर करता हूं, जो मेरे कोडबेस से जुड़ी अन्य चीजों के संपर्क में है) 'टी कंट्रोल)। आईएमओ, ट्रेडऑफ लाभ के लायक है।
- कॉलबैक के रूप में अनाम फ़ंक्शंस का सामान्य उपयोग, जो अक्सर कोड पथों को भ्रमित करने वाले स्पेगेटी की ओर जाता है, जिसे आप जल्दी से चारों ओर नेविगेट नहीं कर सकते।
हाँ, यह गैर-तुच्छ कुछ भी बुरा है। ऐसा मत करो। अपने कार्यों का नाम बच्चों। चीजों को ट्रेस करना आसान है। आप परिभाषित कर सकते हैं, मूल्यांकन कर सकते हैं (असाइन करने के लिए आवश्यक है), और एक साधारण तुच्छ फ़ंक्शन को इन-लाइन के साथ असाइन करें:
doSomethingWithCallback( (function callBack(){}) );
जब आप कॉल से ट्रेस कर रहे हों तो अब क्रोम का नाम आपके लिए होगा। गैर-तुच्छ कवक के लिए मैं इसे कॉल के बाहर परिभाषित करूंगा। यह भी ध्यान दें कि एक चर को सौंपे गए अननोनोमस फ़ंक्शन अभी भी गुमनाम हैं।
- और यकीन है, JSLint रनटाइम से पहले कुछ त्रुटियों को पकड़ता है, लेकिन यहां तक कि ब्राउज़र में सीधे आपके कोड के तहत लाल लहराती रेखाओं के रूप में काम नहीं करता है।
मैं कभी सामान नहीं छूता। क्रॉकफोर्ड ने समुदाय को कुछ अच्छी चीजें दी हैं, लेकिन जेएसएलआईएनटी ने शैलीगत प्राथमिकताओं में रेखा को पार कर लिया है और जावास्क्रिप्ट के कुछ तत्वों का सुझाव है कि विशेष रूप से अच्छे कारण के लिए खराब हिस्से हैं, आईएमओ। निश्चित रूप से ध्यान दें कि regEx और नकार वर्ग के बारे में एक बात * और + के बाद। वाइल्डकार्ड अधिक खराब प्रदर्शन करते हैं और आप आसानी से {} के साथ पुनरावृत्ति को सीमित कर सकते हैं। साथ ही, फंक्शन कंस्ट्रक्टर्स के बारे में उनके द्वारा कही गई बातों को नजरअंदाज करें। यदि नया कीवर्ड आपको परेशान करता है तो आप उन्हें आसानी से फ़ैक्टरी फंक में लपेट सकते हैं। बुरी सलाह के मोर्चे पर CSSLint (क्रॉकफोर्ड का नहीं) और भी बुरा है। हमेशा ऐसे लोगों को लें जो नमक के एक दाने के साथ बहुत सारे बोलने वाले काम करते हैं। कभी-कभी मैं शपथ लेता हूं कि वे केवल अधिकार स्थापित करना चाहते हैं या नई सामग्री उत्पन्न करना चाहते हैं।
और फिर, आपको इस बात से अनजान होना चाहिए कि आपने इस रन-टाइम चिंता के साथ क्या सीखा है। (यह एक सामान्य है जिसे मैंने बहुत सारे जावा / सी # देवों के साथ देखा है) यदि रन-टाइम में त्रुटियों को देखते हुए अभी भी आपको 2 साल बाद परेशान करता है, तो मैं चाहता हूं कि आप एक ब्राउज़र में नीचे बैठें और जब तक यह डूब न जाए तब तक अनलोड करें। कोई संकलन-समय / रन-टाइम डिवाइड नहीं है (वैसे भी दृश्यमान नहीं है - JS को अब JIT पर चलाया जाता है)। केवल रन-टाइम में बग्स की खोज करना ठीक नहीं है, यह बहुत सस्ते और आसानी से स्पैम लोड करने के लिए बेहद फायदेमंद है और आपको मिलने वाले हर पड़ाव बिंदु पर बग्स की खोज करता है।
और उन क्रोम देव टूल्स पर 'क्रैकिन' प्राप्त करें। वे सीधे वेबकिट में अंतर्निहित हैं। क्रोम में राइट-क्लिक करें। तत्व का निरीक्षण। टैब का अन्वेषण करें। रन-टाइम के दौरान कंसोल में कोड को बदलने की क्षमता के साथ वहां बहुत डिबग पावर है जो सबसे शक्तिशाली लेकिन कम स्पष्ट विकल्पों में से एक है। परीक्षण के लिए भी अच्छा है।
संबंधित नोट पर, त्रुटियां आपके मित्र हैं। कभी भी एक खाली कैच स्टेटमेंट न लिखें। जे एस हम न छुपाएं या दफनाने त्रुटियों (या कम से कम हम नहीं करना चाहिए खांसी YUI / खांसी )। हम उनके पास जाते हैं। कुछ भी कम होने से डिबग दर्द होगा। और यदि आप उत्पादन में संभावित त्रुटियों को छिपाने के लिए कैच स्टेटमेंट लिखते हैं तो कम से कम चुपचाप त्रुटि और दस्तावेज़ को लॉग इन करें कि लॉग कैसे एक्सेस करें।