हमारे पास कुछ बड़े जावास्क्रिप्ट कोडबेस हैं और लगभग एक महीने पहले हम कॉफीस्क्रिप्ट को एक कोशिश देने के लिए इच्छुक थे। हमारे डेवलपर्स में से एक ने जेएस से सीएस में हमारे एक मॉड्यूल को http://js2cfish.org/ का उपयोग करके शुरू किया । यह उपकरण अधिक उपयोगी था और जावास्क्रिप्ट की 1000-कुछ लाइनों को पोर्ट करने में लगभग दो या तीन घंटे लगते थे। उस बिंदु पर हमारे द्वारा देखे गए कुछ अवलोकन:
परिणामस्वरूप कॉफीस्क्रिप्ट कोड काफी पठनीय था।
हमने इसे वापस जावास्क्रिप्ट में संकलित किया और इसे नेविगेट करना और डीबग करना बहुत आसान था। जब हम उस मॉड्यूल को पोर्ट कर रहे थे, तो हमारी टीम के एक अन्य डेवलपर ने इसमें एक बग पाया। इन दो डेवलपर्स ने उस पुराने बग को हमारे पुराने जावास्क्रिप्ट कोड में और सीएस कंपाइलर से निकले नए जावास्क्रिप्ट कोड में तय किया। उन्होंने स्वतंत्र रूप से काम किया और यह उन्हें उसी समय (15-20 मिनट) के बारे में ले गया।
इस तथ्य के कारण कि यह एक बंदरगाह था जिसके परिणामस्वरूप कोड कॉफी-विशिष्ट सुविधाओं का उपयोग नहीं कर रहे थे जो उचित या वांछनीय थे। अगर हम खरोंच से कॉफीस्क्रिप्ट में लिखेंगे तो कोड अधिक मुहावरेदार होगा। उसके कारण बाद में हमने फैसला किया कि हम मौजूदा कोड को पोर्ट नहीं करेंगे।
छोटे कार्य की सामान्य पठनीयता और छोटी वस्तु में कुछ वृद्धि हुई। हालाँकि, अधिक समय तक विधियाँ ऐसी नहीं थीं। सबसे बड़ी ब्लोट बचत से आया ->
और स्पष्ट है return
, लेकिन इसके अलावा हमारे कोड को बहुत छोटा या सरल नहीं मिला। वाक्य रचना के कुछ टुकड़े काफी भ्रामक लग रहे थे, विशेष रूप से वस्तु शाब्दिक। CS सदस्य परिभाषाओं के आसपास घुंघराले ब्रेसिज़ को छोड़ देता है और "सब कुछ-एक-ए-एक्सप्रेशन" के साथ संयुक्त होता है और निहित होता return
है जिसने कोड के कुछ बिट्स को पढ़ने के लिए बहुत कठिन बना दिया है।
यहाँ जावास्क्रिप्ट है:
var rabbitGenerator = {
makeRabbit: function(rabbitName, growCarrots) {
if (growCarrots) {
carrots.growMore(10);
} else {
carrots.ensureSupply();
}
return {
name: rabbitName,
height: 0,
actions: {
jump: function (height) {
this.height += height;
},
eatCarrot: function () {
// etc
}
}
};
},
// more members
}
और यहाँ इसी कॉफीस्क्रिप्ट कोड की तरह दिखेगा:
rabbitGenerator =
makeRabbit: (rabbitName, growCarrots) ->
if growCarrots
carrots.growMore 10
else
carrots.ensureSupply()
name: rabbitName // (*)
height: 0
actions:
jump: (height) ->
@height += height
eatCarrot: ->
जैसा कि अब यह पता लगाना बहुत मुश्किल है कि रिटर्न स्टेटमेंट (*)
लाइन में शुरू होता है । हमारी परियोजना में हम वस्तु शाब्दियों पर बहुत भरोसा करते हैं: हम उन्हें फ़ंक्शन मापदंडों के रूप में पास करते हैं और उन्हें अन्य कार्यों से वापस करते हैं। कई मामलों में ये ऑब्जेक्ट काफी जटिल होते हैं: विभिन्न प्रकार के सदस्यों और घोंसले के शिकार के कई स्तरों के साथ। हमारे मामले में समग्र भावना यह थी कि कॉफीस्क्रिप्ट कोड वास्तव में सादे जावास्क्रिप्ट कोड की तुलना में पढ़ने के लिए कठिन था।
हालाँकि, कॉफ़ीगैबिंग डीबगिंग करना आसान हो गया, क्योंकि हमने उम्मीद की थी कि एडिटिंग एक्सपीरियंस काफी कम हो गया है। हमें इस भाषा के लिए एक अच्छा संपादक / IDE नहीं मिला। हमने अपनी परियोजना के लिए क्लाइंट-साइड कोड के लिए संपादक / आईडीई पर मानकीकृत नहीं किया है और वास्तव में हम सभी विभिन्न उपकरणों का उपयोग करते हैं। वास्तव में एक टीम में हर कोई इस बात से सहमत होता है कि जब वे कॉफ़ीस्क्रिप्ट पर स्विच करते हैं तो उन्हें अपने टूल से एक खराब समर्थन मिलता है। आईडीई और संपादक प्लगइन्स बहुत प्रारंभिक आकार में हैं और कुछ मामलों में वे हमें एक उचित वाक्यविन्यास हाइलाइटिंग या इंडेंटेशन समर्थन भी नहीं दे सकते हैं। कोड स्निपेट या रिफैक्टरिंग के बारे में नहीं। हम WebStorm, Eclipse, NetBeans, VisualStudio, Notepad ++ और SublimeText2 का उपयोग करते हैं।
उपकरणों की बात करते हुए मुझे यह उल्लेख करना चाहिए कि कॉफ़ीस्क्रिप्ट संकलक स्वयं एक नोड जेएस पैकेज के रूप में आता है। हम प्राथमिक हैं एक जावा / .NET शॉप ताकि हर कोई विंडोज बॉक्स पर विकसित हो रहा है। हाल ही में जब तक विंडोज का समर्थन नोड में लगभग न के बराबर था। हम विंडोज़ पर चलने वाले कॉफ़ीस्क्रिप्ट कंपाइलर नहीं बना सकते हैं, इसलिए जब तक हमने <script type="text/coffeescript">
टैग और ब्राउज़र-आधारित फ्लाई-कंपाइलर के साथ छड़ी करने का फैसला किया है ।
कंपाइलर काफी तेज है और स्टार्टअप का समय ज्यादा नहीं बढ़ाता है। नकारात्मक पक्ष यह है कि परिणामस्वरूप जावास्क्रिप्ट eval
एड हो जाता है और ब्राउज़रों के डेवलपर टूल (विशेषकर IE में) में ब्रेकपॉइंट लगाने के लिए यह थोड़ा मुश्किल है। यदि हमारे पास डीबगिंग के साथ कठिन समय है तो हम उसी माइग्रेशन टूल के साथ कॉफ़ीस्क्रिप्ट कोड प्री-कंपाइल करते हैं, जिसे मैंने ऊपर सूचीबद्ध किया था, लेकिन यह अभी भी बहुत सुविधाजनक नहीं है।
कॉफ़ी के अन्य वादे जैसे कि स्वचालित var
एरोशन या this
फैट एरो ऑपरेटर के साथ अर्ध-पारदर्शी प्रबंधन ( =>
) निकला, जितना हम उम्मीद करते हैं उतना लाभ नहीं देते। हम अपनी निर्माण प्रक्रिया के हिस्से के रूप में पहले से ही JSLint का उपयोग करते हैं और हम ES3 x ES5-Strict
भाषा के सबसेट में कोड लिखते हैं। वैसे भी, तथ्य यह है कि कॉफी एक ही तरह का "क्लीन" कोड बनाती है, यह एक अच्छी बात है । मैं हर सर्वर-साइड फ्रेमवर्क को मान्य HTML5 और CSS3 मार्कअप का उत्पादन करना चाहता हूं!
कहा कि मैं यह नहीं कहूंगा कि कॉफीस्क्रिप्ट var
मेरे लिए कीवर्ड डालकर बहुत समय बचाता है । मिसिंग var
एस को आसानी से JSLint द्वारा पकड़ा जाता है और आसानी से ठीक किया जा सकता है। इसके अलावा, एक बार जब आप इसे ठीक कर लेते हैं तो कुछ समय के लिए आप वैसे भी अपने आप ही अच्छा जावास्क्रिप्ट लिखना शुरू कर देते हैं । इस प्रकार मैं यह नहीं कहूंगा कॉफी वास्तव में है कि इस संबंध में सहायक।
हमने लगभग एक सप्ताह तक कॉफीस्क्रिप्ट का मूल्यांकन किया। सभी टीम के सदस्य इसमें कोड लिख रहे थे और हमने एक दूसरे के साथ अपने अनुभव साझा किए। हमने इसके साथ कुछ नए कोड लिखे और कुछ मौजूदा कोड को पोर्ट किया जब हमने फिट देखा। भाषा को लेकर हमारी भावनाएं मिश्रित थीं।
सामान्य तौर पर मैं कहूंगा कि इसने हमारे विकास को नहीं बढ़ाया है, लेकिन इसने हमें धीमा नहीं किया है। कम टाइपिंग और कम त्रुटि सतह के कारण कुछ गति लाभ अन्य क्षेत्रों में मंदी के कारण ऑफसेट थे, ज्यादातर उपकरण समर्थन। एक हफ्ते के बाद हमने फैसला किया कि हम कॉफीस्क्रिप्ट के उपयोग को अनिवार्य नहीं करेंगे लेकिन हम इसे या तो निषिद्ध नहीं करेंगे । एक स्वतंत्र विकल्प को देखते हुए, व्यवहार में कोई भी इसका उपयोग नहीं करता है, कम से कम अभी के लिए। समय-समय पर मैं इसमें कुछ नई सुविधा के प्रोटोटाइप के बारे में सोचता हूं और फिर तेजी से शुरुआत करने के लिए बाकी प्रोजेक्ट के साथ एकीकृत करने से पहले जावास्क्रिप्ट को कोड में परिवर्तित करता हूं लेकिन मैंने अभी तक उस दृष्टिकोण की कोशिश नहीं की है।