ऑब्जेक्ट विधि के भीतर से ऑब्जेक्ट गुणों को आप कैसे एक्सेस करेंगे?

ऑब्जेक्ट की प्रॉपर्टी को किसी ऑब्जेक्ट विधि से एक्सेस करने के लिए "शुद्ध" या "सही" तरीका क्या है जो गेटर / सेटर विधि नहीं है?

मुझे पता है कि वस्तु के बाहर से आपको गेटर / सेटर का उपयोग करना चाहिए, लेकिन भीतर से आप बस करेंगे:

जावा:

String property = this.property;

पीएचपी:

$property = $this->property;

या आप करेंगे:

जावा:

String property = this.getProperty();

पीएचपी:

$property = $this->getProperty();

मुझे माफ़ कर दो अगर मेरा जावा थोड़ा सा है, तो जावा में प्रोग्राम किए जाने के बाद से यह एक साल हो गया है ...

संपादित करें:

ऐसा लगता है कि लोग मान रहे हैं कि मैं केवल निजी या संरक्षित चर / गुणों के बारे में बात कर रहा हूं। जब मैंने ओओ सीखा तो मुझे हर एक संपत्ति के लिए गेटर्स / सेटर्स का उपयोग करना सिखाया गया था, भले ही यह सार्वजनिक था (और वास्तव में मुझे कभी भी कोई वैरिएबल / प्रॉपर्टी सार्वजनिक नहीं करने के लिए कहा गया था)। तो, मैं जाने से झूठी धारणा से शुरू हो सकता हूं। ऐसा प्रतीत होता है कि इस सवाल का जवाब देने वाले लोग शायद कह रहे हैं कि आपके पास सार्वजनिक गुण होना चाहिए और उनको गेटर्स और सेटर्स की आवश्यकता नहीं है, जो मुझे सिखाया गया था और जो मैं बात कर रहा था, उसके खिलाफ जाता है, हालांकि शायद इस पर चर्चा की जानी चाहिए कुंआ। हालांकि यह एक अलग सवाल के लिए शायद एक अच्छा विषय है ...

0
जोड़ा संपादित
विचारों: 1

17 उत्तर

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

अब मान लीजिए कि आपके ऑब्जेक्ट में एक निजी पूर्णांक काउंटर है जो कि नाम के नाम की संख्या की गणना करता है। आप ऑब्जेक्ट के अंदर से गेट विधि का उपयोग नहीं करना चाहेंगे क्योंकि यह अमान्य गिनती उत्पन्न करेगा।

0
जोड़ा
क्या होगा यदि आप गेटटर को कुछ प्रकार के बूलियन जोड़ते हैं जैसे: PHP: पब्लिक फ़ंक्शन getName ($ outCall = true) {if ($ outCall) {$ this-> incrementNameCalled (); } $ --- नाम वापस करें; } और फिर ऑब्जेक्ट के भीतर से, यदि आप नाम प्राप्त करते हैं, तो आप इसे बढ़ने से रोक सकते हैं: PHP: $ name = $ this-> getName (false); क्या मैं बस यहाँ जा रहा हूँ?
जोड़ा लेखक cmcculloh, स्रोत
यदि छात्र वस्तु एक व्यवसाय / डोमेन वस्तु है, तो अब आप आधारभूत संरचना विवरण जोड़ रहे हैं। आदर्श रूप से, एक व्यवसाय / डोमेन ऑब्जेक्ट केवल व्यापार / डोमेन तर्क के साथ चिंतित होना चाहिए।
जोड़ा लेखक moffdub, स्रोत

क्या मैं अभी यहां जा रहा हूं?

शायद;)

एक अन्य दृष्टिकोण एक निजी / संरक्षित विधि का उपयोग वास्तव में प्राप्त करने (कैशिंग / डीबी / आदि) करने के लिए करना होगा, और इसके लिए एक सार्वजनिक रैपर जो गिनती को बढ़ाता है:

पीएचपी:

public function getName() {
    $this->incrementNameCalled();
    return $this->_getName();
}

protected function _getName() {
    return $this->name;
}

और फिर वस्तु के भीतर से:

पीएचपी:

$name = $this->_getName();

इस तरह आप अभी भी किसी और चीज के लिए उस पहले तर्क का उपयोग कर सकते हैं (जैसे यहां कैश डेटा का उपयोग करना है या नहीं, इसके लिए ध्वज भेजना)।

0
जोड़ा

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

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

0
जोड़ा

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

0
जोड़ा
@ euphoria83 शायद, लेकिन यह होने से इसे रोकता नहीं है।
जोड़ा लेखक Greg Hurlman, स्रोत
संपत्ति के मूल्य को सेट करने के अलावा जावा में गलत उपयोग का उदाहरण सेट करने के अलावा किसी अन्य में कुछ भी नहीं कर रहा है।
जोड़ा लेखक euphoria83, स्रोत

खैर, यह सी # 3.0 गुणों के डिफ़ॉल्ट कार्यान्वयन के साथ लगता है, निर्णय आपके लिए लिया जाता है; आपको (संभवतः निजी) संपत्ति सेटटर का उपयोग करके संपत्ति सेट करना है।

मैं व्यक्तिगत रूप से केवल निजी सदस्य का उपयोग करता हूं- ऐसा करने पर, जब वस्तु वांछनीय स्थिति से कम हो जाती है, जैसे प्रारंभिक या कैशिंग / आलसी लोडिंग शामिल होने पर।

0
जोड़ा

जैसा कि कुछ टिप्पणियों में बताया गया है: कभी-कभी आपको चाहिए, कभी-कभी आपको नहीं करना चाहिए। निजी चर के बारे में बड़ा हिस्सा यह है कि आप कुछ जगहों को बदलने में सक्षम होते हैं जब आप कुछ बदलते हैं। यदि आपका गेटर / सेटर कुछ ऐसा करता है जो आपको चाहिए, तो इसका इस्तेमाल करें। यदि इससे कोई फर्क नहीं पड़ता कि आप निर्णय लेते हैं।

विपरीत मामला बनाया जा सकता है कि यदि आप गेटर / सेटर का उपयोग करते हैं और कोई गेटटर / सेटर बदलता है तो उन्हें सभी जगहों का विश्लेषण करना होता है ताकि गेटटर और सेटर का आंतरिक रूप से उपयोग किया जा सके ताकि यह देखने के लिए कि यह कुछ गड़बड़ कर रहा है या नहीं।

0
जोड़ा

मैं गलत हो सकता हूं क्योंकि मैं ऑटोडिडैक्ट हूं, लेकिन मेरे जावा क्लास में कभी भी उपयोगकर्ता सार्वजनिक गुण नहीं होते हैं, वे हमेशा निजी या संरक्षित होते हैं, ताकि आउट कोड को गेटर्स / सेटर द्वारा एक्सेस किया जाना चाहिए। रखरखाव / संशोधन उद्देश्यों के लिए यह बेहतर है। और अंदर कक्षा कोड के लिए ... अगर गेटर विधि तुच्छ है तो मैं सीधे संपत्ति का उपयोग करता हूं, लेकिन मैं हमेशा सेटर विधियों का उपयोग करता हूं क्योंकि अगर मैं चाहूं तो आसानी से आग घटनाओं में कोड जोड़ सकता हूं।

0
जोड़ा

यदि "purist" से आपका मतलब है "सबसे अधिक encapsulation", तो मैं आम तौर पर अपने सभी क्षेत्रों को निजी के रूप में घोषित करता हूं और फिर कक्षा के भीतर से इस क्षेत्र का उपयोग करता हूं, लेकिन उप-वर्गों सहित सभी अन्य वर्ग, गेटर्स का उपयोग करके एक्सेस उदाहरण राज्य।

0
जोड़ा

निर्भर करता है। यह किसी और चीज की तुलना में एक स्टाइल मुद्दा है, और कोई कठोर नियम नहीं है।

0
जोड़ा

If I won't edit the property I'll use a get_property() public method unless it's a special occasion such as a MySQLi object inside another object in which case I'll just public the property and refer to it as $obj->object_property.

Inside the object it's always $this->property for me.

0
जोड़ा

मैं ऑब्जेक्ट के भीतर भी एक्सेसर विधियों का उपयोग करना बेहतर कहूंगा। यहां उन बिंदुएं हैं जो तुरंत मेरे दिमाग में आती हैं:

1) यह वस्तु के बाहर किए गए उपयोग के साथ स्थिरता बनाए रखने के हित में किया जाना चाहिए।

2) कुछ मामलों में, ये एक्सेसर विधियां केवल फ़ील्ड तक पहुंचने से ज्यादा कुछ कर सकती हैं; वे कुछ अतिरिक्त प्रसंस्करण कर रहे थे (हालांकि यह दुर्लभ है)। यदि ऐसा है, तो सीधे क्षेत्र तक पहुंचकर आप उस अतिरिक्त प्रसंस्करण को खो देंगे और आपका प्रोग्राम भयानक हो सकता है यदि यह एक्सेसिंग उन एक्सेसों के दौरान हमेशा की जाती है

0
जोड़ा

मैं काफी आश्चर्यचकित हूं कि भावना कितनी सर्वसम्मति है कि getters और सेटर्स ठीक और अच्छे हैं। मैं एलन होलब द्वारा आग्रह करता हूं लेख का सुझाव देता हूं " गेटर्स और सेटर्स हैं ईविल "। अनुमोदित, शीर्षक सदमे के मूल्य के लिए है, लेकिन लेखक वैध अंक बनाता है।

अनिवार्य रूप से, यदि आपके पास प्रत्येक कोड के लिए getters और setters हैं, तो आप उन फ़ील्ड को सार्वजनिक के रूप में अच्छे बना रहे हैं। आपको getter कहने वाले प्रत्येक वर्ग पर लहर प्रभाव के बिना निजी फ़ील्ड के प्रकार को बदलने के लिए बहुत कठिन दबाव डाला जाएगा।

इसके अलावा, सख्ती से ओओ दृष्टिकोण से, वस्तुओं को संदेशों (विधियों) का जवाब देना चाहिए जो उनकी (उम्मीदवार) एकल जिम्मेदारी से मेल खाते हैं। getters और setters का विशाल बहुमत उनके घटक वस्तुओं के लिए समझ में नहीं आता है; Pen.dispenseInkOnto (सतह) मुझसे अधिक समझ में आता है Pen.getColor()

गेटर्स और सेटर्स कक्षा के उपयोगकर्ताओं को कुछ डेटा के लिए ऑब्जेक्ट से पूछने, गणना करने के लिए प्रोत्साहित करते हैं, और उसके बाद ऑब्जेक्ट में कुछ अन्य मान सेट करते हैं, जिसे प्रक्रियात्मक प्रोग्रामिंग के रूप में जाना जाता है। आप ऑब्जेक्ट को बस उस स्थान पर करने के लिए बेहतर सेवा देंगे जो आप पहले स्थान पर जा रहे थे; सूचना विशेषज्ञ मुहावरे के रूप में भी जाना जाता है।

गेटर्स और सेटर्स, हालांकि, परतों की सीमा पर आवश्यक बुराई हैं - यूआई, दृढ़ता, और बहुत आगे। किसी कक्षा के आंतरिक, जैसे सी ++ के मित्र कीवर्ड, जावा के पैकेज सुरक्षित पहुंच, .NET की आंतरिक पहुंच, और मित्र वर्ग पैटर्न आपको getters और सेटर्स की दृश्यता को कम करने में सहायता कर सकता है, जिन्हें केवल उनकी आवश्यकता है।

0
जोड़ा

शुद्धवादी ओओ तरीका दोनों से बचने और डेमेटर का कानून का पालन करना है। = "http://c2.com/cgi/wiki?TellDontAsk" rel = "nofollow noreferrer"> पूछो मत पूछें दृष्टिकोण।

ऑब्जेक्ट की संपत्ति का मूल्य प्राप्त करने के बजाय, जो कसकर जोड़ों दो वर्ग, ऑब्जेक्ट को पैरामीटर के रूप में उपयोग करें

  doSomethingWithProperty() {
     doSomethingWith( this.property ) ;
  }

जहां संपत्ति मूल प्रकार थी, उदा। int, एक एक्सेस विधि का उपयोग करें, समस्या डोमेन के लिए इसे प्रोग्रामिंग डोमेन नहीं नाम दें।

  doSomethingWithProperty( this.daysPerWeek() ) ;

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

0
जोड़ा

मैंने सेटर्स / गेटर्स का उपयोग करके पाया है कि मेरे कोड को पढ़ने में आसान बना दिया गया है। मुझे यह भी पसंद है कि जब अन्य वर्ग विधियों का उपयोग करते हैं और यदि मैं डेटा बदलता हूं तो संपत्ति स्टोर की जाएगी।

0
जोड़ा

सार्वजनिक या संरक्षित संपत्तियों के साथ निजी क्षेत्र। मानों तक पहुंच गुणों के माध्यम से जाना चाहिए, और एक स्थानीय चर में कॉपी किया जाना चाहिए यदि वे एक विधि में एक से अधिक बार इस्तेमाल किया जाएगा। अगर और केवल अगर आपके पास अपना शेष एप्लिकेशन है तो पूरी तरह से tweaked, rocked बाहर, और अन्यथा अनुकूलित किया गया है कि उनके assosciated गुणों के माध्यम से मूल्यों का उपयोग कर एक बाधा बन गया है (और यह कभी नहीं होगा, मैं गारंटी देता हूँ) आप भी शुरू करना चाहिए गुणों के अलावा कुछ भी देने पर विचार करने के लिए सीधे उनके बैकिंग चर स्पर्श करें।

.NET डेवलपर्स इसे लागू करने के लिए स्वचालित गुणों का उपयोग कर सकते हैं क्योंकि आप डिज़ाइन समय पर बैकिंग चर भी नहीं देख सकते हैं।

0
जोड़ा

PHP इसे प्रबंधित करने के कई तरीकों की पेशकश करता है, जिसमें जादू विधियों __ get और __ set शामिल हैं, लेकिन मैं स्पष्ट गेटर्स और सेटर्स पसंद करता हूं। यहाँ पर क्यों:

  1. प्रमाणीकरण सेटर्स (और उस मामले के लिए गेटर्स) में रखा जा सकता है
  2. इंटेलिसेंस स्पष्ट तरीकों के साथ काम करता है
  3. कोई सवाल नहीं कि कोई संपत्ति केवल पढ़ी जाती है, केवल लिखें या पढ़ें-लिखें
  4. आभासी गुणों को पुनर्प्राप्त करना (यानी, गणना मूल्य) नियमित गुणों के समान दिखते हैं
  5. आप आसानी से ऑब्जेक्ट प्रॉपर्टी सेट कर सकते हैं जिसे वास्तव में कभी भी परिभाषित नहीं किया जाता है, जो तब अनियंत्रित होता है
0
जोड़ा

मुझे यहां बिंदु याद आना चाहिए, आप उस ऑब्जेक्ट की संपत्ति तक पहुंचने के लिए ऑब्जेक्ट के अंदर गेटर का उपयोग क्यों करेंगे?

इसे अपने निष्कर्ष पर ले जाने के लिए गेटर को गेटर को कॉल करना चाहिए, जिसे गेटटर कहा जाना चाहिए।

तो मैं कहूंगा कि किसी ऑब्जेक्ट विधि के अंदर सीधे संपत्ति का उपयोग होता है, विशेष रूप से उस ऑब्जेक्ट में किसी अन्य विधि को कॉल करने के रूप में देखकर (जो कि संपत्ति को सीधे एक्सेस करेगा, फिर भी इसे वापस कर देगा) केवल एक व्यर्थ, अपर्याप्त अभ्यास है (या मैंने सवाल को गलत समझा है )।

0
जोड़ा
मुझे उसी ज़रूरत से प्रेरित किया गया था जिस पर आपको टिप्पणी करनी थी ... इसके अलावा इसका जवाब बंद नहीं किया गया था;)
जोड़ा लेखक Egg Vans, स्रोत