Method Chaining – Unnamed Objects in Android

Method Chaining – जब भी कोई Method कोई Data Return करता है, तो उस Data के Reference को किसी ऐसे Object में Hold किया जाता है जिसका कोई नाम होता है। इस तरह के Objects को Named Object कहा जाता है।

उदाहरण के लिए पिछले Code Fragement से समझें तो etFNetSN एक प्रकार के Named Objects हैं क्‍योंकि इनमें R.id.etFNR.id.etSN Layout ID वाले EditText Controls के Text Content का Memory Address Stored है।

यानी किसी भी Named Object में हम जो भी Data Assign करते हैं, वो वास्‍तव में किसी Memory Location का Address मात्र ही होता है न कि Actual Data, और Computer System किसी भी Data को उसके Memory Location से Access and Manipulate करता है न कि Named Objects से।

उदाहरण के लिए मान लीजिए कि जब हम अपने Current Android App का Layout Create करते हैं, तो R.id.etFN Layout ID वाला EditText Object, Memory Location 1000 पर Store हो जाता है। इसलिए जब निम्‍न Statement Execute होता है-

            EditText etFN = (EditText) findViewById(R.id.etFN);

तो findViewByID() Method के Execute होने के बाद Return Value के रूप में Memory Location Address Return होता है जो कि 1000 है। इसलिए यदि हम उपरोक्‍त Statement को Normalized Form में लिखें, तो निम्‍नानुसार भी लिख सकते हैं-

            EditText etFN = 1000

यानी etFN नाम का EditText Object वास्‍तव में Memory Location 1000 को ही Reference कर रहा है, न कि etFN स्‍वयं Data के रूप में किसी EditText Object को Hold कर रहा है इसलिए etFN वास्‍तव में एक Named Object मात्र है अथवा अन्‍य शब्‍दों में कहें तो etFN वास्‍तव में किसी Memory Location का नाम है ताकि उस Memory Location को उसके Number से नहीं बल्कि उसके Name से Identify किया जा सके।

किसी Memory Location को किसी Named Object में Assign ही इसीलिए किया जाता है ताकि जरूरत पड़ने पर बाद में उस Memory Location के Data को फिर से Access and Manipulate किया जा सके।

इसलिए जब एक बार हम R.id.etFN Layout ID वाले EditText Object का Reference etFN नाम के Named Object में Assign कर देते हैं, उसके बाद यदि हमें इस etFN Object द्वारा Referenced Memory Location 1000 पर Stored Text Content को String में Convert करना हो, तो हम इस जरूरत को पूरा करने के लिए निम्‍न Statement लिख सकते हैं-

            String strFN = etFN.toString();

क्‍योंकि Text Content के Memory Location का Address etFN नाम के Named Object में पहले से Saved है। इसलिए उस Memory Location 1000 पर Stored Text Content के साथ किसी भी प्रकार की प्रक्रिया करनी हो, तो हम etFN Named Object द्वारा उसके Memory Location को Access and Manipulate कर सकते हैं।

यानी यदि हम सरलतम शब्‍दों में कहें, तो etFN को Memory Location Address Number 1000 भी कह सकते हैं और किसी भी Programming Language का Compiler Internally तो हमेंशा Memory Location Addresses को ही पहचानता है। इसलिए जब Compiler इस etFN.toString() Statement को Execute करता है तो सबसे पहले वह etFN Named Object से उस Memory Location का Address 1000 प्राप्‍त करता है, जहां पर Text Content Exist है। इसलिए Internally तो ये Statement Execution से पहले कुछ निम्‍नानुसार Normalized होता है-

            String strFN = 1000.toString();

और फिर उस Memory Location 1000 वाले Text Content को एक String Value में Convert करके किसी अन्‍य Memory Location Address मान लीजिए 2000 पर Store कर देता है और उस नए Memory Location का Address 2000, Return Value के रूप में Return कर देता है। इसलिए Execution के बाद अब यदि हम उपरोक्‍त Statement को फिर से Normalized Form में लिखें, तो निम्‍नानुसार लिख सकते हैं-

            String strFN = 2000

अब फिर से Memory Location Number 2000, strFN नाम के एक String Type के Named Object में Store हो जाता है। परिणामस्‍वरूप हम जब चाहें तब strFN के माध्‍यम से Memory Location Number 2000 पर Saved String Content को Access and Manipulate कर सकते हैं क्‍योंकि strFN में Value के रूप में Memory Location Address 2000 ही Stored है न कि Data के रूप में कोई String Value Stored है।

इस प्रकार से वास्‍तव में Internally तो सारा काम Memory Addresses के माध्‍यम से ही होता है न कि Named Object के माध्‍यम से और जब हम किसी Named Object को Specify करते हैं, तो Internally तो वह Named Object किसी Memory Address को ही Represent कर रहा होता है।

इसलिए यदि हम चाहें तो बिना कोई Named Object Create किए हुए भी किसी Memory Location पर Stored Data को Access and Manipulate कर सकते हैं। लेकिन C/C++ के अलावा कोई भी Modern Compiler, Computer System के Physical Memory Addresses को Access and Manipulate करने की सुविधा नहीं देता। इसलिए हम Java Programs में भी किसी Specific Memory Location को Access & Manipulate नही कर सकते।

Named Object की जरूरत केवल इसलिए होती है ताकि हम किसी Specific Memory Location पर Stored Data को जरूरत के अनुसार बाद में Access & Manipulate कर सकें और यदि हम किसी Calculation से Generate होने वाले Data के Memory Address को किसी Named Object में Hold न करें, तो जैसे ही वह Statement Execute होकर Program Control अगले Statement पर जाएगा, Calculation से Generated वह Data पूरी तरह से Inaccessible हो जाएगा। परिणामस्‍वरूप Java का Garbage Collector उस Inaccessible Data के Memory Location को Collect करके उसके Resources को पूरी तरह से Free कर देगा।

उदाहरण के लिए जब (EditText) findViewById(R.id.etFN); Statement Execute होता है और R.id.etFN Layout ID वाले EditText Control का Reference Memory Location 1000 पर Store हो जाता है तथा findValueById() Method के Return Value के रूप में Return होता है, तब यदि हम इस Memory Location के Address को etFN नाम के EditText Type के Named Object में Assign न करें, तो जैसे ही Program Control इस Statement को Execute करके अगले Statement पर Move करेगा, इस Statement द्वारा Returned Memory Location Address 1000 पूरी तरह से Inaccessible हो जाएगा। परिणामस्‍वरूप इस पूरी तरह से Free Memory Location को Java का Garbage Collector Collect कर लेगा और उसके Resources को पूरी तरह से Free कर देगा।

अब इस प्रक्रिया का परिणाम ये होगा कि हम किसी भी स्थिति में उस R.id.etFN Layout ID वाले EditText Control को Access & Manipulate नहीं कर सकेंगे। क्‍योंकि हमने किसी Named Object में उसके Memory Address को Hold ही नहीं किया था इसलिए हमारे पास उसका Reference ही नहीं है।

अब आप सोंचेंगे कि ऐसी स्थिति कभी पैदा न हो इसलिए आपको हमेंशा सभी Methods द्वारा Returned Values की Memory Locations को किसी न किसी Named Object में Hold करना ही चाहिए।

लेकिन हमेंशा ऐसा करना जरूरी नहीं है।

क्‍योंकि कई बार स्थिति ऐसी होती है कि हमें किसी Method से Return होने वाले Data को पूरे Program में केवल एक ही बार Access, Manipulate या Process करना होता है। इस प्रकार के One Time Data को Hold करने के लिए Named Object Create करना कोई समझदारी वाला काम नहीं है क्‍योंकि प्रत्‍येक Object Create करने में कई CPU Cycles Use होते हैं और प्रत्‍येक Extra CPU Cycle हमारे Android App की Performance को प्रभावित करता है।

इसलिए किसी Method की Processing से Return होने वाले अथवा किसी Expression के Executeion से Generate होने वाले One Time Data को किसी Named Object में Hold करने के  स्‍थान पर Method Chaining प्रक्रिया द्वारा उसे सीधे ही किसी Method में Parameter की तरह Pass किया जा सकता है अथवा उसके लिए किसी Method को Directory Invoke किया जा सकता है।

क्‍योंकि जब किसी Operation के Execution से कोई Processed Data Generate होता है, तो वो किसी न किसी Memory Location पर ही Stored होता है और Return Value के रूप में उस Memory Location का Address ही Return होता है, जिसे किसी Named Object में Value के रूप में Assign किया जाता है और बाद में जब उस Named Object पर किसी Method को Invoke करके किसी Operation को Perform किया जाता है, तो Compiler उस Named Object में Stored Memory Location के Address वाले Data पर ही Operation Perform करता है।

इसलिए जब‍ हमारे पास किसी Memory Location का Address पहले से ही उपलब्‍ध हो, तो उसे किसी Named Object में Assign करके बाद में फिर से Use करने के बजाय उस पर Method Chaining के रूप में किसी अन्‍य Method को Call करके सीधे ही किसी अन्‍य Operation को Perform किया जा सकता है अथवा उसे सीधे ही किसी अन्‍य Method में Parameter की तरह Pass करके किसी अन्‍य Operation में Value की तरह Use किया जा सकता है और ऐसा सामान्‍यत: तब किया जाना सबसे उपयुक्‍त होता है, जबकि उस Return या Generate होने वाले Data को Program के किसी भी Operation में केवल एक ही बार Use करना होता है। इसलिए जब हम निम्‍नानुसार Statement लिखते हैं:

            double fn = Double.parseDouble(etFN.getText().toString());

तो Compiler इसे कुछ निम्‍नानुसार तरीके से Normalize करके Execute करता है-

            double fn = Double.parseDouble(1000.toString());

            // 1000 is Memory Location of Text Content

यहां 1000 उस Memory Location का Address है जहां R.id.etFN Layout ID वाले EditText Control का Text Content Store होता है और जब toString() Method Execute होता है, तब Compiler इसे कुछ निम्‍नानुसार Normalize करके Execute करता है-

            double fn = Double.parseDouble(2000);

            // 2000 is Memory Location of String Content after conversion of Text Content

और यहां 2000 उस Memory Location का Address है जहां Text Content, String Content में Convert हो जाने के बाद Store होता है और जब Double.parseDouble() Method Execute होता है, तब Compiler, Memory Location 2000 पर Stored String Content को Parameter के रूप में प्राप्‍त करता है और उसे double Data Type के मान में Convert करके fn नाम के double Data Type के Named Variable में Store कर देता है, ताकि आगे के Statements में इस Variable में Stored Numerical Value को Data के रूप में विभिन्‍न प्रकार के Arithmetical Operations में Use किया जा सके।

ठीक इसी तरह से निम्‍नानुसार अगले Statement में R.id.etSN Layout ID वाले EditText Object के Text Content को Double.parseDouble() Method द्वारा double Data Type के मान में Convert करके sn नाम के double Data Type के Variable में Store कर दिया गया है, ताकि आगे के Statements में इस Variable में Stored Numerical Value को Data के रूप में विभिन्‍न प्रकार के Arithmetical Operations में Use किया जा सके-

            double sn = Double.parseDouble(etSN.getText().toString());

जैसाकि हमने ऊपर Discuss किया कि किसी Memory Location को Named Object Create करके उसमें Store करने और फिर उस Named Object के लिए toString() जैसे Method को Invoke करने के बजाय हम etFN.getText() etFN.getText() Method द्वारा Return होने वाले Unnamed Memory Address पर भी सीधे ही toString() जैसे Method को Invoke कर सकते हैं।

इस प्रकार से एक Method से Return होने वाले Data पर किसी दूसरे Method के Operation को Apply कर देने की प्रक्रिया को ही Method Chaining के नाम से जाना जाता है और Dot Operator का प्रयोग करते हुए हम इस Method Chaining को जरूरत के अनुसार आगे भी किसी भी जारी रख सकते हैं।

यानी हम पहले Method से Returned Data पर Dot Operator के माध्‍यम से दूसरे Method को Invoke कर सकते हैं, दूसरे Method से Returned Data पर समान तरीके से Dot Operator का प्रयोग करते हुए तीसरे Method को Invoke कर सकते हैं, दूसरे Method से Returned Data पर चौथे Method को Invoke कर सकते हैं, और जरूरत के अनुसार इस Chaining को आगे किसी भी Level तक जारी रख सकते हैं।

Modern Programming में Method Chaining के इस तरीके को बहुत Use किया जाता है, क्‍योंकि इसे Use करने के बहुत सारे फायदे हैं, जिनमें से कुछ अग्रानुसार हैं।

Buy this eBook to read more about

  • Method Chaining and Unnamed Objects
Internal Working of Event Handling in Android
Event Handling in Android using Interface Type

Android in Hindi - BccFalna.comये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook Android in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी है, तो निश्चित रूप से ये EBook भी आपके लिए काफी उपयोगी साबित होगी।

Android in Hindi | Page: 628 | Format: PDF

BUY NOW DOWNLOAD READ ONLINE