16

this/self/me सूचक अनिवार्य स्पष्ट होने का क्या फायदा है?यह/स्वयं सूचक अनिवार्य स्पष्ट होने का क्या फायदा है?

OOP सिद्धांत के मुताबिक एक विधि मुख्य रूप से (केवल?) को सदस्य चर और विधि के तर्कों पर संचालित करने के लिए माना जाता है। इसके बाद, यह होना चाहिए बाहरी (ऑब्जेक्ट के पक्ष के दृश्य से) चर के बजाय सदस्य चर का संदर्भ देने के लिए ... स्पष्ट this इस प्रकार कठिन बाहरी लोगों की तुलना में सदस्य चर के संदर्भ में अधिक वर्बोज़ बनाता है। यह मुझे काउंटर सहज महसूस करता है।

उत्तर

19

सदस्य चर और विधि पैरामीटर के अतिरिक्त आपके पास स्थानीय चर भी हैं। वस्तु के बारे में सबसे महत्वपूर्ण चीजों में से एक इसकी आंतरिक स्थिति है। स्पष्ट सदस्य परिवर्तनीय dereferencing यह स्पष्ट करता है कि आप उस राज्य का संदर्भ दे रहे हैं और जहां आप उस राज्य को संशोधित कर रहे हैं।

उदाहरण के लिए, अगर आपके पास कोड की तरह:

someMethod(some, parameters) { 
    ... a segment of code 
    foo = 42; 
    ... another segment of code 
} 

जल्दी से यह माध्यम से ब्राउज़िंग, आप अगर यह सिर्फ एक अस्थायी चर है पता करने के लिए चर पूर्ववर्ती खंड में परिभाषित के एक मानसिक मॉडल है करने के लिए है जब या क्या यह वस्तुओं की स्थिति को बदल देता है। जबकि this.foo = 42 यह स्पष्ट करता है कि वस्तुओं की स्थिति उत्परिवर्तित है। और यदि स्पष्ट dereferencing विशेष रूप से उपयोग किया जाता है, तो आप सुनिश्चित कर सकते हैं कि चर विपरीत मामले में अस्थायी है।

छोटे, अच्छी तरह से फैक्टर किए गए तरीके इसे थोड़ा कम महत्वपूर्ण बनाते हैं, लेकिन फिर भी, लंबी अवधि की समझदारी कोड लिखते समय थोड़ी सी सुविधा को कम करती है।

+2

एर्गो, "कोड पठनीयता"। –

+0

जब कोई स्कोपिंग समस्या उत्पन्न होती है तो यह उपयोगी होता है (स्थानीय रूप से स्कॉप्ड फू कक्षा के सदस्य परिवर्तनीय foo को छिपाएगा), लेकिन ओपी द्वारा कहीं और टिप्पणियों पर विचार करने पर, यह सख्ती से अनिवार्य नहीं है, बस सुविधाजनक है। –

+0

मुझे यह जानने के लिए 'मानसिक मॉडल' की भी आवश्यकता है कि क्या मैं 'if' या' while' के भीतर हूं; हम इस तरह के सभी आदेशों को उस जानकारी के साथ क्यों उपसर्ग नहीं करते? – einpoklum

3

क्या होगा यदि किसी विधि के तर्कों के सदस्य चर के समान नाम हैं? फिर आप उदाहरण के लिए this.x = x का उपयोग कर सकते हैं। जहां this.x सदस्य चर है और x विधि तर्क है। यह सिर्फ एक (मामूली) उदाहरण है।

+1

मैंने "अनिवार्य" शब्द जोड़ा क्योंकि मैं यही पूछ रहा हूं। –

3

आपको किसी अन्य ऑब्जेक्ट के पॉइंटर/संदर्भ को पास करने या किसी असाइनमेंट ऑपरेटर में स्व-असाइनमेंट से बचाने के लिए इसकी आवश्यकता है।

+0

मैंने "अनिवार्य" शब्द जोड़ा क्योंकि मैं यही पूछ रहा हूं। –

2

मैं आम तौर पर उपयोग करने के लिए इस (सी ++ में) केवल जब मैं असाइनमेंट ऑपरेटर या प्रतिलिपि निर्माता लिख रहा हूँ के रूप में यह स्पष्ट रूप से करने में मदद करता चर की पहचान। अन्य स्थान जहां मैं इसका उपयोग करने के बारे में सोच सकता हूं वह यह है कि यदि आपका फ़ंक्शन पैरामीटर चर नाम आपके सदस्य चर नामों के समान हैं या मैं का उपयोग करके अपनी ऑब्जेक्ट को मारना चाहता हूं तो यह हटाएं।

+0

क्या यह सिर्फ मुझे है या 'इसे हटाएं' कह रहा है वास्तव में गलत लगता है? –

+0

आम तौर पर यह बुरा विचार है..लेकिन आप कुछ मामलों में संदर्भ गणना ऑब्जेक्ट जैसे करना चाह सकते हैं। – Naveen

+0

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

1

उदाहरण होगा जहां सदस्य नामों विधि

public void SetScreenTemplate(long screenTemplateID, string screenTemplateName, bool isDefault) 
     { 
      this.screenTemplateID = screenTemplateID; 
      this.screenTemplateName = screenTemplateName; 
      this.isDefault = isDefault; 
     } 
4

के लिए पारित किया उन जैसे ही हैं आप अजगर के अर्थ में के बारे में "स्पष्ट self" में बात कर रहे हैं, तो यहाँ विषय पर एक interesting discussion है। यहां Guido responding से Bruce Eckel's article है। ब्रूस के लेख पर टिप्पणियां भी प्रबुद्ध हैं (उनमें से कुछ, वैसे भी)।

+0

बहुत अच्छा लिंक। धन्यवाद। –

+0

आपका स्वागत है। –

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