चैनिंग का उपयोग कब करें
फंक्शन चेनिंग ज्यादातर उन भाषाओं के साथ लोकप्रिय है, जहां ऑटो-कम्प्लीट के साथ आईडीई आम जगह है। उदाहरण के लिए, लगभग सभी C # डेवलपर Visual Studio का उपयोग करते हैं। इसलिए, यदि आप C # के साथ विकसित कर रहे हैं, तो अपने तरीकों को जोड़ते हुए, उस वर्ग के उपयोगकर्ताओं के लिए समय बचाने वाला हो सकता है क्योंकि Visual Studio श्रृंखला बनाने में आपकी सहायता करेगा।
दूसरी ओर, PHP जैसी भाषाएं जो प्रकृति में अत्यधिक गतिशील हैं और अक्सर आईडीई में ऑटो-पूर्ण समर्थन नहीं होता है, वे कम कक्षाएं देखती हैं जो पीछा करने का समर्थन करती हैं। चेनपिंग विधियों को उजागर करने के लिए सही phpDocs कार्यरत होने पर ही चेनिंग उचित होगी।
जंजीर क्या है?
Foo
निम्नलिखित दो विधियों के नाम वाले एक वर्ग को देखते हुए दोनों श्रृंखलाबद्ध हैं।
function what() { return this; }
function when() { return new Foo(this); }
तथ्य यह है कि एक वर्तमान उदाहरण के लिए एक संदर्भ है, और एक नया उदाहरण बनाता है यह परिवर्तन नहीं करता है कि ये श्रृंखलाबद्ध तरीके हैं।
कोई स्वर्ण नियम नहीं है कि एक श्रृंखला योग्य विधि केवल वर्तमान वस्तु को संदर्भित करना चाहिए। वास्तव में, श्रव्य तरीके दो अलग-अलग वर्गों में हो सकते हैं। उदाहरण के लिए;
class B { function When() { return true; } };
class A { function What() { return new B(); } };
var a = new A();
var x = a.What().When();
this
उपरोक्त किसी भी उदाहरण में कोई संदर्भ नहीं है । कोड a.What().When()
एक जंजीर का एक उदाहरण है। मजे की बात यह है कि वर्ग प्रकार B
को एक चर के लिए कभी नहीं सौंपा गया है।
एक विधि जंजीर है जब यह वापसी मूल्य एक अभिव्यक्ति के अगले घटक के रूप में इस्तेमाल किया जाता है।
यहाँ कुछ और उदाहरण हैं
// return value never assigned.
myFile.Open("something.txt").Write("stuff").Close();
// two chains used in expression
int x = a.X().Y() * b.X().Y();
// a chain that creates new strings
string name = str.Substring(1,10).Trim().ToUpperCase();
कब इस्तेमाल करें this
औरnew(this)
अधिकांश भाषाओं में तार अपरिवर्तनीय हैं। इसलिए चाइनिंग मेथड कॉल में हमेशा नए तार पैदा होते हैं। जहाँ StringBuilder जैसी वस्तु को संशोधित किया जा सकता है।
संगति सर्वोत्तम अभ्यास है।
यदि आपके पास ऐसी विधियाँ हैं जो किसी वस्तु की स्थिति को संशोधित करती हैं और वापस आती हैं this
, तो उन विधियों में मिश्रण न करें जो नए उदाहरण लौटाते हैं। इसके बजाय, एक विशिष्ट विधि बनाएं जिसे Clone()
यह स्पष्ट रूप से करना होगा।
var x = a.Foo().Boo().Clone().Foo();
यह बहुत स्पष्ट है कि अंदर क्या चल रहा है a
।
बाहर कदम और पीछे की चाल
मैं इसे स्टेप आउट और बैक ट्रिक कहता हूं , क्योंकि यह चेनिंग से जुड़ी कई आम समस्याओं को हल करता है। इसका मूल रूप से मतलब है कि आप मूल वर्ग से एक नए अस्थायी वर्ग में कदम रखते हैं और फिर मूल कक्षा में वापस आ जाते हैं।
अस्थायी वर्ग केवल मूल वर्ग को विशेष सुविधाएँ प्रदान करने के लिए मौजूद है, लेकिन केवल विशेष परिस्थितियों में।
अक्सर ऐसे समय होते हैं जब एक श्रृंखला को राज्य बदलने की आवश्यकता होती है , लेकिन वर्ग A
उन सभी संभावित राज्यों का प्रतिनिधित्व नहीं कर सकता है । इसलिए एक श्रृंखला के दौरान एक नया वर्ग पेश किया जाता है जिसमें एक संदर्भ वापस होता है A
। यह प्रोग्रामर को एक राज्य में वापस जाने और वापस करने की अनुमति देता है A
।
यहाँ मेरा उदाहरण है, विशेष राज्य के रूप में जाना जाता है B
।
class A {
function Foo() { return this; }
function Boo() { return this; }
function Change() return new B(this); }
}
class B {
var _a;
function (A) { _a = A; }
function What() { return this; }
function When() { return this; }
function End() { return _a; }
}
var a = new A();
a.Foo().Change().What().When().End().Boo();
अब यह एक बहुत ही सरल उदाहरण है। यदि आप अधिक नियंत्रण रखना चाहते थे, तो B
एक नए सुपर-प्रकार पर लौट सकते थे A
जिसमें अलग - अलग विधियां हैं।