2009-03-02 20 views
18

तो ... जावास्क्रिप्ट में चारों ओर एक विचार के साथ गड़बड़ कर रहा है जो मेरे लिए नया है, ऑब्जेक्ट के तरीके होने से वे ऑब्जेक्ट लौटते हैं; यह तब चेनबिलिटी की ओर जाता है। मेरा सवाल, फिर: यह कैसे उपयोगी हो सकता है? मैं इस एक साथ मौलिक कामकाज का परीक्षण करने के फेंक दिया:जावास्क्रिप्ट ऑब्जेक्ट विधि चेनिंग: उपयोगी?

<script> 
MathChain = function() 
{ 
    this.pass = function() 
    { 
     this.multiply = eval(arguments.join('*')); 
     this.add = eval(arguments.join('+')); 
     return this; 
    } 
} 

m = new MathChain().pass(5, 10, 20).multiply; // 1000 
a = new MathChain().pass(5, 10, 20).add;  // 35 
</script> 

स्पष्ट रूप से एक क्रूरतापूर्वक कुशल उदाहरण है, जिसमें एक इस अवधारणा का प्रयोग करेंगे नहीं है यही कारण है, तो आप मुझे कुछ jQuery से अलग तो ठीक है कि (को इंगित कर सकता है, कृपया)?

उत्तर

23

ठीक है, यहां एक बहुत ही वास्तविक दुनिया लागू उदाहरण नहीं है, लेकिन मुझे लगता है कि आपको यह विचार मिल जाएगा। यदि आप किसी ऑब्जेक्ट पर कई अलग-अलग संचालन करने की अनुमति देते हैं, और सुविधा प्रदान करते हैं।

var truck = function() { 

    this.turnLeft = function { 

     // turn left 
     return this; 

    } 

    this.turnRight = function { 

     // turn right 
     return this; 

    } 

    this.goReallyFast = function { 

     // go fast! 
     return this; 

    } 

}; 

// My get-away plan 
var myTruck = new truck(); 
myTruck.turnLeft().turnRight().goReallyFast(); 
+0

हे, मुझे यह पसंद है; यह निश्चित रूप से एक संभावित उपयोग मामले को बहुत अच्छी तरह से प्रदर्शित करता है। उम ... विभिन्न पुस्तकालयों में इसे कैसे कार्यान्वित किया गया है इसके बाहर कोई असली दुनिया का उपयोग नहीं है? –

+0

हमम, मुझे लगता है कि मैं समझता हूं कि आप क्या प्राप्त कर रहे हैं। क्या आप दक्षता प्रश्न पर हैं? मैंने इसे हमेशा सुविधा के मामले के रूप में देखा है। मुझे पता है कि कुछ लोग सोचते हैं कि प्रत्येक विधि को अपनी लाइन पर रखने से चेनिंग कम पठनीय है। – jonstjohn

+0

@jonstjohn, मैं चेनिंग के लिए पेशेवरों और विपक्ष को जानना चाहता हूं? –

7

Fluent इंटरफ़ेस - http://en.wikipedia.org/wiki/Fluent_interface

हां, मैं यह बहुत उपयोगी हो सकता है लगता है, लेकिन किसी भी डिजाइन पैटर्न की तरह केवल आवश्यकता इस्तेमाल किया जाना चाहिए

संपादित करें: यहाँ ग # में चहचहाना क्लाइंट API एक धाराप्रवाह उपयोग कर रहा है इंटरफ़ेस - http://code.google.com/p/tweetsharp/

8

एक बहुत अलग (गैर-ओओ) उदाहरण के लिए, चेनिंग Unix pipelines के समान कुछ हद तक समान है। बजाय

cat file1 file2 | sort -n | awk '{print $2}' | sed 's/@/ at /g' 
6

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

इसमें कई व्यावहारिक अनुप्रयोग हैं, खासकर कार्यात्मक प्रोग्रामिंग के दायरे में।

+0

एचएम ... क्या यह वापस आ जाएगा। क्लोन(), फिर? –

+0

उम ... तरह का, लेकिन मुझे यकीन नहीं है कि आप अभी तक उस अवधारणा को समझते हैं। यह ठीक है: अपरिवर्तनीय वस्तुएं आसान नहीं हैं। शुरू करने के लिए अच्छे उदाहरण के लिए नेट की स्ट्रिंग क्लास में देखें। –

+0

यह एक बहुत ही रोचक बिंदु है जो शुरुआत में प्रोग्रामिंग में शुरुआती लोगों के लिए छिपा हुआ है। किसी ऑब्जेक्ट को एक नई ऑब्जेक्ट बनाकर कभी-कभी अनदेखा होता है। मुख्य समस्या यह है कि यदि आप नई वस्तुएं नहीं बनाते हैं, तो कभी-कभी यह एक ही ऑब्जेक्ट को इंगित करने वाले हैंडल की ओर जाता है, और जब नए चर "केवल" एक चर को संशोधित करते हैं तो दोनों बदल जाते हैं। – trusktr

1

जावास्क्रिप्ट में यह डोम नेविगेट करते समय हर समय आता है। खासकर जब उन तत्वों के समूह के माध्यम से अपना रास्ता छीनने की कोशिश करते हैं जिनके पास आईडी नहीं है।

उदाहरण के लिए finding the first element of a table के संबंध में SO पर एक प्रश्न था। इसमें बहुत सारे लूप या जंजीर कमांड शामिल हो सकते हैं।

3

हालांकि यह आपके उदाहरण के रूप में काम नहीं करता है (टीबीएच मैंने इसे पहले कभी नहीं देखा है), jquery considers "chaining" to be very useful, और जेएसई वेब ढांचे की बात करते समय jquery इन दिनों yardstick है। .. तो हाँ :-)

-2

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

+7

मुझे लगता है कि विधि नामों का नाम अच्छी तरह से नामित नहीं किया गया है, तो मुझे लगता है कि यह पठनीयता को खराब करता है। 'car.turnLeft()। turnRight()। goStraight()। stop(); मुझे पढ़ने के लिए मुश्किल नहीं लग रहा है। – trusktr

+0

चेनिंग पठनीयता में सुधार करने का एक तरीका है। आम तौर पर, डेवलपर्स सोचते हैं कि कुछ नया देखने पर कुछ 'अपठनीय' है क्योंकि वे बस इसके बारे में अपरिचित हैं। – E10

0

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

3

मुझे परिभाषित करने के बाद विधियों को श्रृंखला बनाने के लिए एक सामान्य समाधान की खोज करते समय यह प्रश्न मिला। यहां मैं क्या आया था।मैं एक जावास्क्रिप्ट neophyte हूँ; सावधान ग्राहक।

makeChainable = function() { 
    var receiver = arguments[0] 
    for (var i = 1; i < arguments.length; i++) { 
     functionName = arguments[i]; 
     (function() { 
      wrapped = receiver[functionName]; 
      receiver[functionName] = function() { 
       wrapped.apply(receiver, arguments); 
       return receiver; 
      } 
     })(); 
    } 
} 

daisy = { 
    name: 'Daisy', 
    moo: function() { console.log(this.name + " moos!") } 
} 

makeChainable(daisy, 'moo'); 
daisy.moo().moo().moo(); 
संबंधित मुद्दे