2009-01-02 8 views
24

कक्षा चर के संदर्भ में, लोग इसे this के साथ क्यों प्रस्तुत करते हैं? मैं इस मामले के बारे में बात नहीं कर रहा हूं जब this विधि पैरामीटर से असंबद्ध करने के लिए प्रयोग किया जाता है, लेकिन जब यह अनावश्यक लगता है।जावा में, लोग 'इस` के साथ फ़ील्ड क्यों प्रीपेड करते हैं?

उदाहरण:

public class Person {   
    private String name; 

    public String toString() { 
     return this.name; 
    } 
} 

toString में, क्यों सिर्फ name के रूप में उल्लेख name नहीं?

return name; 

this.name क्या खरीदता है?

Here's एक स्टैक ओवरफ्लो प्रश्न जिसका कोड this पूर्व-लंबित है।

उत्तर

6

इसी कारण से कुछ लोग निजी डेटा सदस्यों को "m_" या नाम इंटरफेस "IFoo" के साथ प्रीपेड करना पसंद करते हैं। उनका मानना ​​है कि यह पठनीयता और स्पष्टता को बढ़ाता है। चाहे आप इस तरह के सम्मेलनों से सहमत हों या नहीं, स्वाद का विषय है।

2

विधि पैरामीटर के साथ असंबद्धता के अलावा, यह आपको कुछ भी नहीं खरीदता है। शायद स्पष्टता/पठनीयता लेकिन यह वास्तव में आपकी शैली पर निर्भर करता है।

11

यह भाषा स्तर पर कुछ भी नहीं करता है। लेकिन यह चर के दायरे के बारे में कोड पढ़ने वाले किसी को तुरंत संकेत देता है, जो कोड की समझ में सुधार करता है।

+0

मैं वही बात कहूंगा। यह समझदारी को बढ़ाता है, चीजों को उनके सही संदर्भ में रखता है जिससे अस्पष्टता रोकती है। आखिरकार बाइटकोड वही होगा जैसा मैं मानता हूं। – Kezzer

+0

मुझे नहीं लगता कि यह समझ में सुधार करता है। आईएमओ, ज़ाहिर है। यह कुछ के साथ मामला हो सकता है, मुझे नहीं पता। –

+0

मुझे लगता है कि यह व्यक्तिपरक है, और व्यक्ति के सापेक्ष। – Kezzer

56
  1. रक्षात्मक प्रोग्रामिंग (मामले में किसी को संपादन कोड बाद में एक पैरामीटर या आपका कोई विरोधी नाम
  2. कोड "आत्म दस्तावेज़ीकृत," और अधिक स्पष्ट बनाने के साथ स्थानीय कहते हैं
37

कभी कभी यह स्पष्ट करने के लिए आवश्यक है :

public void setFoo(Bar foo) { 
    this.foo = foo; 
} 

अन्य समय में, यह सिर्फ एक शैलीगत बात है कुल मिलाकर, मैं this.blah से बचने के लिए जहां भी संभव हो के रूप में यह अधिक v है की कोशिश करो। erbose। यदि आप सोच रहे हैं, परिणामी बाइटकोड बिल्कुल वही है।

3

यह आपको एक नज़र में सदस्य चर की पहचान करने में मदद करता है ..
उपरोक्त ToString() ऊपर इसे चित्रित करने के लिए बहुत छोटा है।
मान लें कि आपके पास एक स्क्रीनफुल आकार विधि है। आप स्थानीय और आवृत्ति चर के मिश्रण को गणना, असाइन, स्वैप करते हैं। this.memberVar या this.PropertyName आपको फ़ील्ड असाइनमेंट या प्रॉपर्टी सेटर्स के माध्यम से इंस्टेंस स्टेट को संशोधित करने का ट्रैक रखने में सहायता करता है।

1

वे शायद एक पाइथन प्रोग्रामर हैं और इसे स्पष्ट किए बिना यातना/खो/उलझन में आते हैं।

0

कुछ भी ध्यान में रखने के लिए भाषा ही है। आपने विशेष रूप से जावा का उल्लेख नहीं किया है (हालांकि मुझे लगता है कि आपके पास वास्तव में कुछ और नहीं है, इसलिए यह टिप्पणी अधिक FYI है), लेकिन जैसा कि पिछले पोस्टर ने पहले से ही उल्लेख किया है, यह कोड स्वयं- जब कोई और आपके कोड बेस को संशोधित करना शुरू करता है तो सड़क के नीचे मिश्रण को रोकने के लिए दस्तावेज़।

यदि आप PHP लेते हैं, हालांकि $this का उपयोग आमतौर पर आवश्यक है कक्षा चर के संदर्भ में। भाषाओं के बीच अलग-अलग नियमों के साथ, उनके बीच सामान्य पैटर्न के साथ चिपकना अक्सर आसान होता है, एक ऐसा पैटर्न जो पूरे समय एक बहुत ही ठोस कोडिंग शैली होता है। मुझे यह याद रखना आसान है कि मुझे कौन सी भाषा की आवश्यकता है और कौन सी भाषा बस "पसंद करती है" याद रखने की कोशिश करने के बजाय सबकुछ this को प्रीपेड करना आसान है।

10

मैं अक्सर लोगों को ऐसा करता हूं क्योंकि यह इंटेलिजेंस को ट्रिगर करता है। मैं व्यक्तिगत रूप से "यह" छोड़ना पसंद करता हूं। क्योंकि यह बिना किसी मूल्य के अधिक कोड बनाता है।

+3

लेकिन आप अभी भी इसके बिना इंटेलिजेंस ट्रिगर कर सकते हैं। ग्रहण और इंटेलिजे में एक खाली लिंक पर नियंत्रण-स्थान इंटेलिजेंस ट्रिगर करता है। यह 'इस' से नियंत्रण-अंतरिक्ष के समान है। –

0

"यह" अभिभावक वर्ग/ईएस में समान नाम के साथ आवृत्ति चर के साथ भ्रम को रोकता है।

यह "सुपर" के साथ आगे बढ़ने का पूरक है।

0

मैं कोड के बड़े हिस्से लिखते समय 'यह' जो भी 'उपयोग करने का प्रयास करता हूं, क्योंकि यह संदर्भित करना आसान था कि संदर्भित किया जा रहा था। अन्य लोगों द्वारा लिखे गए कोड के बड़े हिस्से को पढ़ने पर, कुछ बिंदुओं पर मैं अक्सर भ्रमित हो जाता हूं कि वे उदाहरण चर या स्थानीय चर का संदर्भ दे रहे थे या नहीं।

2

मुझे लगता है कि अगर आप संपत्ति के नाम से पहले इसमें शामिल हैं तो कुछ भी गलत नहीं है। यह स्थानीय चर से संपत्ति को असंबद्ध करने में मदद करता है, क्या आपको उसी नाम से घोषित किया जाना चाहिए (जो गुणों को प्रारंभ करते समय एक निर्माता में हो सकता है)।

यह प्रदर्शन को प्रभावित नहीं करता है, यह पठनीयता के लिए कोई समस्या नहीं पैदा करता है (अगर यह सब पढ़ने में आसान बनाता है)।

इसलिए मुझे नहीं लगता कि हमें इसके बारे में चिंता करने की आवश्यकता है। प्रोग्रामर को अपनी पसंद बनाने दें।

6

नेट की दुनिया में माइक्रोसॉफ्ट StyleCop उपकरण भी एक नियम बुलाया "उपसर्ग स्थानीय इस के साथ कॉल" है:

इस नियम का उल्लंघन तब होता है जब कोड स्थानीय का एक उदाहरण सदस्य के लिए एक कॉल शामिल कक्षा या आधार वर्ग जो 'इस' के साथ उपसर्ग नहीं है। इस नियम का अपवाद तब होता है जब बेस क्लास सदस्य का स्थानीय ओवरराइड होता है, और कोड स्थानीय ओवरराइड को छोड़कर सीधे बेस क्लास सदस्य को कॉल करना चाहता है। इस मामले में कॉल को 'बेस' के बजाय 'आधार' के साथ उपसर्ग किया जा सकता है।

डिफ़ॉल्ट रूप से, स्टाइलकॉप 'इस' उपसर्ग के पक्ष में स्थानीय वर्ग फ़ील्ड को चिह्नित करने के लिए अंडरस्कोर या एम_ के उपयोग को अस्वीकार करता है। 'यह' का उपयोग करने का लाभ यह है कि यह सभी तत्व प्रकारों के लिए समान रूप से लागू होता है जिसमें विधियों, गुणों, आदि शामिल हैं, न केवल फ़ील्ड, क्लास सदस्यों को सभी कॉल तुरंत पहचानने योग्य होते हैं, इस पर ध्यान दिए बिना कि कौन सा संपादक कोड देखने के लिए उपयोग किया जा रहा है । एक और फायदा यह है कि यह उदाहरण सदस्यों और स्थिर सदस्यों के बीच एक त्वरित, पहचानने योग्य भिन्नता बनाता है, जिन्हें पूर्ववर्ती नहीं किया जाता है।

'इस' उपसर्ग का उपयोग करने का अंतिम लाभ यह है कि यह टाइप करना। विज़ुअल स्टूडियो को इंटेलिसेन्स पॉपअप दिखाने के लिए प्रेरित करेगा, जिससे डेवलपर को कॉल करने के लिए क्लास सदस्य चुनने में तेज़ी और आसान बना दिया जाएगा।

मेरा सुझाव एक सम्मेलन चुनना है (इसका उपयोग करें या नहीं) और इसके साथ चिपके रहें।

0

कोड सरल पढ़ना है। मेरी राय में, एक और अच्छी प्रैक्टिस getXXX() को toString() में भी कॉल कर रही है (इसके बजाय this.XXX), getXXX() पर एक महत्वपूर्ण तर्क हो सकता है।

मुझे लगता है कि इसके बिना विशेषता के नाम का उपयोग आवेदन के रखरखाव के लिए एक अच्छा विचार नहीं है।

3

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

वरीयता संवाद में "जावा/कोड स्टाइल/क्लीन अप"।

2

मैं इसका उपयोग करने वाली एकमात्र जगह कक्षाओं में रचनाकारों में है जहां कक्षा के कुछ/अधिकांश क्षेत्रों को कन्स्ट्रक्टर द्वारा आपूर्ति की जा सकती है। मैं विधि हस्ताक्षर के लिए छोटे नामों का उपयोग करने के बजाय इसका उपयोग करता हूं, यह संक्षिप्त रूप से अधिक संगत लगता है।

उदाहरण के लिए एक कक्षा में "वाजिब"

बल्कि

class Rational 
{ 
    int denominator; 
    int numerator; 

    public Rational(int d, int n) 
    { 
     denominator = d; 
     numerator = n; 
    } 
} 

मैं यह कर कर रही है।

class Rational 
{ 
    int denominator; 
    int numerator; 

    public Rational(int denominator, int numerator) 
    { 
     this.denominator = denominator; 
     this.numerator = numerator; 
    } 
} 

इस तरह कॉलर्स कन्स्ट्रक्टर पैरामीटर के बारे में और जानें।

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

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