इस पोस्ट में मैं एक सरल लेकिन कभी-कभी उपयोगी प्रोग्रामिंग तकनीक के बारे में बात करूंगा - विधि का पीछा करना। मैं इसके उपयोग से जुड़े संभावित नुकसान के बारे में भी बात करूंगा।
कसौटी
इसे और अधिक दिलचस्प बनाने के लिए, पहले थोड़ा परीक्षण करें।
1. मेथड चेनिंग क्या है? इस तकनीक का सार?
2. यह C ++ में कैसे लागू किया जाता है?
3. क्या आप इस तकनीक के उपयोग से संबंधित संभावित खतरनाक स्थिति के साथ आ सकते हैं?
सिद्धांत
कभी-कभी, बड़ी कक्षाओं का उपयोग करते या लिखते समय, एक पंक्ति में इस वर्ग के ऑब्जेक्ट के कई तरीकों को कॉल करना आवश्यक हो जाता है। आमतौर पर यह इस तरह दिखता है:
class worker { public: void set_data(const data_t& d); void process(); void send_result(); void print_log(); ... }; void foo() { worker w; w.set_data(data_t{}); w.process(); w.send_result(); w.print_log(); ... }
विधि जंजीर का उपयोग इस कोड को कम करता है। ऐसा करने के लिए, हमारी प्रत्येक विधि में, हम अपनी वस्तु का लिंक वापस करेंगे और कॉल को लाइन करेंगे।
class worker { public: worker& set_data(const data_t& d){...; return *this;} worker& process(){...; return *this;} worker& send_result(){...; return *this;} worker& print_log(){...; return *this;} ... }; void foo() { worker w; w.set_data(data_t{}).process().send_result().print_log(); ... }
जहाँ तक मुझे पता है, इस तकनीक को जावा में प्यार किया जाता है। C ++ में, यह बहुत लोकप्रिय नहीं है और मैं इसे किसी भी तरह से उपयोग करने का आग्रह नहीं करता, लेकिन मुझे लगता है कि इसके बारे में जानने के लिए यह दुख नहीं हुआ।
ख़तरा
कड़ाई से बोलते हुए, जो मैं नीचे बताऊंगा, वह विधि-निर्धारण के लिए इतनी अधिक नहीं है कि जिस क्रम में तर्कों और फ़ंक्शन कॉल की गणना की जाती है, लेकिन फिर भी, "कॉल श्रृंखला" का उपयोग करते समय, ये नियम पहली नज़र में अप्रत्याशित लग सकते हैं। So.
struct worker { worker& process(int& i) { i = 185; return *this; } worker& print_result(const int& i) { std::cout <<"result: "<< i << std::endl; return *this; } }; int main() { int data = 0; worker w; w.process(data).print_result(data+2); }
यह कोड चेतावनी या त्रुटि के बिना संकलित करता है। लेकिन निष्पादन परिणाम अलग-अलग संकलक पर भिन्न हो सकते हैं।
तथ्य यह है कि हालांकि मानक गारंटी उस प्रक्रिया () को print_result () से पहले कहा जाएगा, यह गारंटी नहीं है कि print_result फ़ंक्शन का तर्क प्रक्रिया () निष्पादित होने के बाद मूल्यांकन किया जाएगा। तदनुसार, कभी-कभी इस कोड के निष्पादन के परिणामस्वरूप, "2" आउटपुट हो सकता है।