कैसे आप एक वस्तु विधि के भीतर से वस्तु गुण का उपयोग करेंगे?

वोट
81

एक वस्तु विधि है कि एक गेटर / सेटर विधि नहीं है के भीतर से एक वस्तु के गुण का उपयोग करने की शुद्धतावादी या सही तरीका क्या है?

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

जावा:

String property = this.property;

पीएचपी:

$property = $this->property;

या आप क्या करेंगे:

जावा:

String property = this.getProperty();

पीएचपी:

$property = $this->getProperty();

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

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

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

01/08/2008 को 17:10
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


18 जवाब

वोट
58

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

01/08/2008 को 17:13
का स्रोत उपयोगकर्ता

वोट
41

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

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

01/08/2008 को 19:23
का स्रोत उपयोगकर्ता

वोट
25

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

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

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

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

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

19/09/2008 को 01:13
का स्रोत उपयोगकर्ता

वोट
18

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

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

01/08/2008 को 17:19
का स्रोत उपयोगकर्ता

वोट
13

पीएचपी तरीके जादू उपाय अपना सकते हैं इस, संभाल करने के असंख्य प्रदान करता है __getऔर __set, लेकिन मैं स्पष्ट getters और setters पसंद करते हैं। यहाँ पर क्यों:

  1. मान्यता (उस बात के लिए और ही टिककर खेल) setters में रखा जा सकता
  2. IntelliSense स्पष्ट तरीकों के साथ काम करता है
  3. कोई प्रश्न नहीं है एक संपत्ति केवल पढ़ने के लिए है या नहीं, केवल लिखने या पढ़ने-लिखने
  4. आभासी गुण प्राप्त कर रहा है (यानी, परिकलित मानों) नियमित रूप से गुण के रूप में ही लग रहा है
  5. आप आसानी से एक वस्तु की संपत्ति है कि कभी नहीं किया गया है वास्तव में कहीं भी परिभाषित है, जो तब गैर-दस्तावेजी चला जाता है सेट कर सकते हैं
24/09/2008 को 18:24
का स्रोत उपयोगकर्ता

वोट
12

मैं तो बस पानी में गिर यहाँ जा रहा हूँ?

शायद;)

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

पीएचपी:

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

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

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

पीएचपी:

$name = $this->_getName();

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

01/08/2008 को 17:43
का स्रोत उपयोगकर्ता

वोट
11

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

अपने निष्कर्ष को यह ले रहा है गेटर एक गेटर बुलाना चाहिए, जो एक गेटर फोन करना चाहिए।

तो मैं एक वस्तु विधि पहुँच के अंदर एक संपत्ति सीधे कहेंगे, विशेष रूप से उस वस्तु में एक और तरीका बुला के रूप में देख रहा है (जो सिर्फ संपत्ति सीधे वैसे भी का उपयोग तो यह वापस आ जाएगी) सिर्फ एक व्यर्थ, बेकार व्यायाम है (या मैं सवाल गलत समझा है )।

04/06/2011 को 16:42
का स्रोत उपयोगकर्ता

वोट
7

मैं भी वस्तु के भीतर एक्सेसर तरीकों का उपयोग करने के लिए अपने बेहतर कहेंगे। यहाँ अंक कि तुरंत मेरे मन के लिए आते हैं कर रहे हैं:

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

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

20/01/2010 को 09:32
का स्रोत उपयोगकर्ता

वोट
7

शुद्धतावादी OO तरह से दोनों से बचने और पालन करने के लिए है Demeter के कानून का उपयोग करके पूछो मत बताओ दृष्टिकोण।

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

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

जब संपत्ति एक देशी प्रकार, जैसे पूर्णांक था, एक पहुँच विधि का उपयोग करें, समस्या डोमेन नहीं प्रोग्रामिंग डोमेन के लिए नाम यह।

  doSomethingWithProperty( this.daysPerWeek() ) ;

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

24/09/2008 को 18:04
का स्रोत उपयोगकर्ता

वोट
7

"शुद्धतावादी" द्वारा यदि आप "सबसे कैप्सूलीकरण" मतलब, तो मैं आम तौर पर निजी रूप में मेरे सभी क्षेत्रों की घोषणा और फिर वर्ग के भीतर ही से this.field उपयोग करें, लेकिन उपवर्गों सहित अन्य सभी वर्गों,, पहुँच उदाहरण राज्य ही टिककर खेल का उपयोग कर।

22/08/2008 को 12:15
का स्रोत उपयोगकर्ता

वोट
6

निर्भर करता है। यह कुछ और की तुलना में अधिक एक शैली मुद्दा है, और वहाँ कोई कठिन नियम है।

01/10/2008 को 11:51
का स्रोत उपयोगकर्ता

वोट
6

अगर मैं संपत्ति को संपादित नहीं होगा मैं एक का उपयोग करेंगे get_property()और इस तरह के किसी अन्य वस्तु जो मामले में मैं हूँ सिर्फ सार्वजनिक संपत्ति के अंदर एक MySQLi वस्तु के रूप में जब तक यह एक विशेष अवसर है सार्वजनिक विधि ही कहते हैं $obj->object_property

वस्तु के अंदर यह मेरे लिए हमेशा $ this-> संपत्ति है।

22/08/2008 को 12:34
का स्रोत उपयोगकर्ता

वोट
6

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

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

18/08/2008 को 18:43
का स्रोत उपयोगकर्ता

वोट
6

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

18/08/2008 को 18:37
का स्रोत उपयोगकर्ता

वोट
6

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

06/08/2008 को 15:43
का स्रोत उपयोगकर्ता

वोट
5

मैं द्वारा उत्तर चाहते cmcculloh , लेकिन ऐसा लगता है सबसे सही तरह से जवाब है ग्रेग Hurlman । गेटर / setters हर समय का उपयोग करें यदि आप उन्हें getgo से उपयोग शुरू कर दिया और / या उनके साथ काम करने के लिए उपयोग किया जाता है।

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

15/09/2008 को 10:46
का स्रोत उपयोगकर्ता

वोट
5

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

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

01/08/2008 को 17:56
का स्रोत उपयोगकर्ता

वोट
4

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

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

01/08/2008 को 18:01
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more