2013-07-17 13 views
8

Underscore.js स्रोतों (https://github.com/jashkenas/underscore/blob/master/underscore.js) के अनुसार:क्यों Underscore.js श्रृंखला() विधि आलसी नहीं है?

// Start chaining a wrapped Underscore object. 
chain: function() { 
    this._chain = true; 
    return this; 
}, 

// Extracts the result from a wrapped and chained object. 
value: function() { 
    return this._wrapped; 
} 

श्रृंखला() और मूल्य() फ़ंक्शन अंडरस्कोर वस्तु के लिए सिर्फ साधारण रैपर हैं।

तो अगर मैं निर्माण निम्नलिखित उपयोग कर रहा हूँ:

_.chain(someCollection) 
.map(function1) 
.map(function2) 
.map(function3) 
.value() 

अंडरस्कोर दो मध्यवर्ती संग्रह बना होगा और तीन enumerations प्रदर्शन करेंगे।

क्यों LINQ जैसे आलसी मूल्यांकन के रूप में चेन() और मूल्य() विधियों को लागू नहीं किया जाता है, इसकी विधियों को लागू करता है? उदाहरण के लिए, इस श्रृंखला को इस प्रकार माना जा सकता है:

_.chain(someCollection) 
.map(function(x){ 
    return function3(function2(function1(x))); 
}) 
.value(); 

क्या इस तरह के कार्यान्वयन के लिए कोई जेएस संबंधित समस्या है?

उत्तर

12

मूल रूप से .chain() आपके द्वारा वर्णित तरीके से आलसी बनाने के लिए, प्रत्येक विधि के लगभग दो संस्करण होने की आवश्यकता होगी। आपको तत्काल प्रतिक्रिया विधियों की आवश्यकता होगी जो दस्तावेज कहता है (एक सरणी देता है) और आपको आलसी मूल्यांकन करने की आलसी विधियों की आवश्यकता होगी (एक कार्य को प्रत्येक तत्व के लिए बाद में चलाने की उम्मीद है)।

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

यह निश्चित रूप से करने योग्य है, जैसा कि जेएसएलएनक और .NET के LINQ द्वारा प्रदर्शित किया गया है, लेकिन विकास और रखरखाव के लिए डेवलपर समय के साथ-साथ बढ़ती जटिलता और बग की संभावना के मामले में बहुत बड़ी लागत है। अंडरस्कोर कोड की 1,200 लाइनों में 80 विभिन्न उपयोगिता विधियों के गैर-आलसी मूल्यांकन प्रदान करता है। JSLinq कोड की 7,000 लाइनों में 21 विभिन्न उपयोगिता विधियों का आलसी मूल्यांकन प्रदान करता है। बहुत अधिक कोड, कार्यों की कम मात्रा।

एक व्यापार बंद है। प्रत्येक डेवलपर को अपना निर्णय लेना पड़ता है (जब तक वे खुद के लिए काम कर रहे हों)।

7

मेरा मानना ​​है कि आप Lazy.js की तरह कुछ के लिए देख रहे:

Lazy.js जावास्क्रिप्ट के लिए एक उपयोगिता पुस्तकालय, अंडरस्कोर के समान और लो-डैश लेकिन एक महत्वपूर्ण अंतर के साथ है: आलसी मूल्यांकन (भी रूप में जाना जाता स्थगित निष्पादन)। यह कई मामलों में बेहतर प्रदर्शन के लिए अनुवाद कर सकता है, खासकर जब बड़े सरणी और/या "चेनिंग" से कई तरीकों से निपटना। साधारण मामलों के लिए (map, filter, आदि) छोटे सरणी पर, आलसी का प्रदर्शन अंडरस्कोर या लो-डैश के समान होना चाहिए।

संपादित: यह हालांकि Lo-Dash may be adding the ability to do lazy evaluation के साथ ही लग रही है।

संबंधित मुद्दे