2009-06-19 18 views
17

मैं अप्रत्यक्ष रूप से किसी वर्ग के सदस्यों तक पहुंचने के लिए इंटरफ़ेस प्रदान करने के कई लाभों को समझता हूं। कुछ तुम सिर्फ (की तर्ज पर कुछ)हम सादे पुराने प्राप्त/सेट फ़ंक्शंस के बजाय .NET गुणों का उपयोग क्यों करते हैं?

public int NormalClass::getQuality() { 
    return this->quality; 
} 

और

protected void NormalClass::setQuality(int q) { 
    this->quality = q; 
} 

उपयोग कर किसी भी OO भाषा के बारे में में पूरा कर सकते हैं कि पहले से ही नहीं है: मेरा प्रश्न है?

सरासर सौंदर्यशास्त्र से परे, .NET गुणों के अतिरिक्त लाभ क्या हैं?

यदि आप इसके लिए एक आकर्षक तर्क दे सकते हैं तो मैं "पठनीयता" स्वीकार करूंगा; लेकिन व्यक्तिगत रूप से, मुझे लगता है कि एक गेट/सेट फ़ंक्शन किसी संपत्ति की तुलना में अधिक पठनीय है क्योंकि यह सीधे फ़ंक्शन है जो सीधे-सीधे मान के विपरीत है।

संपादित करें: उत्तर देने के लिए सभी को धन्यवाद! यह मेरे लिए वास्तव में जानकारीपूर्ण रहा है; योग करने के लिए मैं क्या एकत्रित की हैं/सब से सीखा कहा गया है कि, निम्नलिखित कुछ निष्कर्ष मैं अब तक पहुँच गए हैं:

  • गुण का सबसे बड़ा लाभ संपत्तियों की विशिष्ट सुविधाओं से नहीं आते स्वयं, लेकिन फ्रेमवर्क और आईडीई सुविधाओं से जो एक विशेष तरीके से गुणों को संभालते हैं; उदा।, गुण संपादक, एक्सएमएल क्रमबद्धता, डेटा बाइंडिंग।
  • गुण कुछ सुविधाजनक तरीके कि नहीं कर सकते हैं मिल/सेट कार्यों में के रूप में सरल मूल्यों इलाज किया जा सकता: , विशेष रूप से obj.Prop ++ और obj.Prop = मूल्य में।
  • गुण आप दूर त्वरित और गंदी कोड सार्वजनिक सदस्यों का उपयोग कर के साथ के माध्यम से एक गुच्छा प्राप्त/सेट बाद में कार्यों की को लागू करने के सिरदर्द जाए बिना मिलता है; यदि आप को कुछ तर्क और/या सार्वजनिक सदस्य निजी, जोड़ने की आवश्यकता हो, तो आप बस एक संपत्ति पेश कर सकते हैं और किसी पुराने कोड को तोड़ने का जोखिम नहीं उठा सकते हैं।

अब, वहाँ एक मुद्दा यह है कि 2 या जवाब में से 3 में बनाया गया है अब तक कि मैं व्यक्तिगत रूप कुछ हद तक संदिग्ध लगता है: कि गुण सस्ती पढ़ें/लिखें संचालन मतलब है और इसलिए अनिवार्य रूप से एक ही तरह के रूप में इस्तेमाल किया जा सकता सरल चर इस बिंदु के साथ मेरा मुद्दा यह है कि गुणों में अंतर्निहित कुछ भी नहीं है जो वास्तव में इसे लागू करता है; यह बस उपयोग करने के लिए माना जाता है। मेरे लिए, यह "चाहिएबीप्रेटेट" क्वालीफायर के समान है जो मानता है कि को केवल अपनी कक्षा से ही एक्सेस किया जाना चाहिए, लेकिन जिसे अभी भी बाहरी रूप से एक्सेस किया जा सकता है; या एक पुलिस बल जो सड़कों पर गश्त करता है हमें याद दिलाने के लिए कि हम खुद से व्यवहार करना चाहिए, लेकिन जब हम अपराध करना शुरू करते हैं तो वास्तव में हस्तक्षेप नहीं करते हैं (यदि यह लागू नहीं होता है, तो यह वास्तव में हमारे लिए क्या कर रहा है?)।

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

+0

... सिर्फ इसलिए कि आप कर सकते हैं, hehe –

+2

"यदि गुण पढ़ा सुनिश्चित/घटियापन लिखने के लिए निर्मित तंत्र के कुछ प्रकार था" - इस तरह की और कहा, "यह अच्छा होगा यदि [अपने पसंदीदा जीयूआई की तरह है ढांचे] में यह सुनिश्चित करने के लिए कुछ प्रकार के अंतर्निर्मित तंत्र थे कि लोग खराब यूआई नहीं लिखते हैं "। हां, इसके लिए एकमात्र तंत्र "प्रोग्रामर" कहा जाता है। (या डिजाइनर, या उपयोगिता अध्ययन, या जो भी हो।) कंपाइलर आपकी मदद कर सकता है, लेकिन आपको खराब कोड लिखने के लिए कुछ ज़िम्मेदारी लेनी होगी। –

+1

जो, मुझे लगता है कि यह अनिवार्य रूप से मेरा मुद्दा है: कि प्रतियों का उपयोग करके सस्ती पढ़ने/लिखने की गारंटी नहीं दी जा सकती है। यह प्रोग्रामर की ज़िम्मेदारी है। मैं इस बात पर बहस नहीं कर रहा हूं कि ढांचे के लिए तेजी से पहुंचने वाले गुणों को लागू करने के लिए एक कठोर, अनुमोदित दृष्टिकोण होना ढांचा के लिए एक अच्छा विचार है; बल्कि, मैं उन उत्तरों पर सवाल उठा रहा हूं जिन्होंने गुणों के इस वास्तविक तथ्य को कार्यात्मक लाभ के रूप में इंगित किया है, जैसे कि यह कुछ विशेष विशेषता है। .NET डेवलपर्स ने प्रदान करने के लिए कड़ी मेहनत की है। –

उत्तर

24

जॉन स्कीट के पास उनके सी # लेख ब्लॉग पर why properties matter पर एक उत्कृष्ट अवलोकन है। इसमें वह बताता है कि सार्वजनिक क्षेत्रों को उजागर करने के लिए गुणों का उपयोग क्यों किया जाना चाहिए।

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

  • गुण एक क्लीनर, अधिक संक्षिप्त वाक्य रचना को समझने और पढ़ने में आसान है कि प्रदान करते हैं।
  • गुण असाइनमेंट अभिव्यक्ति चेनिंग सक्षम करते हैं: A.x = B.y = C.z
  • गुण स्पष्ट रूप से और लगातार डेटा पहुंच के अर्थशास्त्र को व्यक्त करते हैं - उपभोक्ताओं को उम्मीद है कि कोई दुष्प्रभाव नहीं हैं।
  • गुणों को XML सीरियलाइजेशन, डब्ल्यूपीएफ बाइंडिंग, एएसपी.नेट 2-वे बाध्यकारी, आदि जैसे कार्यों के लिए .NET में कई पुस्तकालयों द्वारा मान्यता प्राप्त है।
  • गुण आईडीई और कई दृश्य डिजाइनरों द्वारा मान्यता प्राप्त हैं और एक संपत्ति संपादक में प्रदर्शित किया जा सकता है।
  • गुण वृद्धि (++) और कमी (-) ऑपरेटरों के लिए समर्थन सक्षम करते हैं।
  • गुण प्रतिबिंब का उपयोग करके विधियों से आसानी से अंतर किया जा सकता है और गतिशील उपभोक्ताओं को किसी ऑब्जेक्ट द्वारा प्रकट डेटा के बारे में ज्ञान निकालने की अनुमति देता है।
  • सी # 3 स्वचालित गुणों का समर्थन करता है जो बॉयलरप्लेट कोड को खत्म करने में मदद करता है।
+0

मुझे लगता है कि यह उन सभी का सबसे व्यापक उत्तर है। बहुत बढ़िया। –

+4

न केवल ++ और -, लेकिन संशोधित-असाइन ऑपरेटर जैसे + =, * =, | =, आदि –

+5

वाह, जब भी जॉन स्कीट सवाल का जवाब नहीं दे रहा है, तो जॉन स्कीट इस सवाल का जवाब दे रहा है :) – Oorang

13

गुण (विशेष रूप से स्वचालित गुण।नेट 3.5) सेटर्स/गेटर्स की तुलना में अधिक संक्षिप्त हैं, और == कम बग बनाए रखने के लिए कोड == कम कोड की कम लाइनें हैं।

मैं पठनीयता पहले कहते थे, लेकिन आप पहले से ही कहा कि .. आप के लिए गिनती नहीं होगी :)

+0

मैं बस स्वचालित गुणों पर पढ़ता हूं: हाँ, अच्छी तरह से वहां ले जाएं। नियमित रूप से पुराने (पूर्व-3.5) गुणों के लिए, हालांकि, वे अधिक संक्षिप्त कैसे हैं? मैं उत्सुकता से पूछ रहा हूं, तर्कसंगत नहीं होना चाहिए: .NET गुण, जैसा कि मैं उनसे परिचित हूं, को कोड/कोडों के समान कोड की संख्या की आवश्यकता होती है। लेकिन आप कह रहे हैं कि यह मुझे लगता है कि मुझे कुछ याद आ रहा है। –

+0

आप लाइनों की संख्या के बारे में सही हैं, मैंने यह भी ध्यान नहीं दिया था .. मुझे लगता है कि मैं बहुत लंबे समय तक ऑटो गुणों का उपयोग कर रहा हूं .. ऊपर एलबीशकिन का जवाब शानदार था। –

+0

आप सैद्धांतिक रूप से फ़ाइल पर विभिन्न सिरों पर अपना प्राप्त और सेट विधियां डाल सकते हैं। गुण आपको ऐसा करने नहीं देंगे। मैं इसका जिक्र करता हूं क्योंकि मैं इस मुद्दे पर कई बार आया हूं जहां कोड तर्कसंगत रूप से गठबंधन नहीं है। –

2
मेरे लिए

, यह आसान है:

myprop = myvalue; 
console.writeline(myprop); 

mysetfunc(myvalue); 
console.writeline(mygetprop); 
की कोई आवश्यकता नहीं
+0

mygetprop पर एक टाइपो प्रतीत होता है। यह mygetprop होना चाहिए() – usr

+3

मान लें कि यह speudo कोड है और असली कोड नहीं है ;-) – Fredou

2

मुझे कुछ मामलों में पता है, आप एक संपत्ति को "कॉलम" एक डेटा सेट में नाम की तरह। मुझे लगता है कि .NET आत्मनिरीक्षण के माध्यम से करता है। मैं प्राप्त नहीं करता/प्राप्त कार्यों के साथ यह संभव नहीं है।

7

न केवल भाषा में बल्कि क्लियर में संपत्तियों का मतलब है कि .NET पर मौजूद सभी अपने मेटा-डेटा पर भरोसा कर सकते हैं। एक संपत्ति के दुष्प्रभावों के बिना होने का अर्थ होता है और दोनों तेजी से संचालन करते हैं और सेट करते हैं। कई टूल इन धारणाओं का उपयोग करते हैं: Winforms डिजाइनर, LINQ से SQL ...

तो यह केवल सुविधा के बारे में नहीं बल्कि मेटाडाटा का एक अतिरिक्त टुकड़ा भी है।

customer.Name = "a"; 
Assert.IsTrue(customer.Name == "a"); 

try { var ignored = customer.Name; } 
catch { Assert.Fail("Exceptions are not expected"); } 
10

मेरा मानना ​​है कि एक्सएमएल क्रमबद्धता केवल पढ़ता/सार्वजनिक गुण लिखते हैं, तो आपके प्राप्त और सेट तरीकों नजरअंदाज कर दिया जाएगा:

यहाँ अन्य विशिष्ट मान्यताओं कर रहे हैं।

इसके अलावा, यदि आपके पास ऑब्जेक्ट्स की सामान्य सूची है, तो आप इसे DataGridView.DataSource पर असाइन कर सकते हैं और आपको अपनी प्रत्येक संपत्ति के लिए कॉलम मिल जाएगा। यही हो सकता है कि @ एलपाल्मर का जिक्र हो रहा था।

+0

मुझे इनमें से किसी भी चीज़ को नहीं पता था। मैंने वास्तव में serialization (अभी तक) के साथ कोई काम नहीं किया है, लेकिन कॉलम पीढ़ी के बारे में आपका दूसरा बिंदु ऐसा कुछ है जो वास्तव में मेरे लिए वास्तव में आसान हो सकता है - धन्यवाद! –

0

कम से कम DataBinding
यूआई संबंधी विकास के लिए इसके बिना जिस तरह से और अधिक जटिल हो जाता है। गुणों के

4

दो बड़े फायदे:

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

मुझे आपका पहला बिंदु पसंद है। आपके दूसरे के बारे में: मैं देख सकता हूं कि आप कहां से आ रहे हैं, लेकिन क्या यह गुणों की वास्तविक विशेषता नहीं है बल्कि केवल एक सम्मेलन है जिसे प्रोत्साहित किया जाता है? आखिरकार, .NET डेवलपर्स को अच्छी तरह से कोड करने के लिए प्रोत्साहित करने के लिए "वेलकोडेड फ़ंक्शन" निर्माण प्रदान कर सकता है, लेकिन यह वास्तव में कोई वास्तविक कार्यक्षमता नहीं जोड़ता है। –

+0

निश्चित रूप से, वे "[फास्टविथनोसाइडफेक्ट्स]" विशेषता को "डीबगर में परिणाम दिखाने के लिए सुरक्षित" इंगित करने के लिए बना सकते थे, और फिर केवल गैर-शून्य वापसी मूल्य के साथ पैरामीटर रहित कार्यों पर ध्यान दिया है। लेकिन गुण एक सरल समाधान की तरह लगते हैं। –

4

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

हमारे सिर में अवधारणाएं वास्तविक वस्तुओं पर आधारित होती हैं जो हम अपने आस-पास समझते हैं (चाहे हम उन्हें समझें या हम उन लोगों के साथ संवाद करें जो उन्हें समझ चुके हैं)।

हमारे आस-पास की वस्तुओं - फर्नीचर, जानवरों, अंतरिक्ष शटल आदि - विशिष्ट गुण हैं और विशिष्ट तरीकों से कार्य करते हैं।

यही वह जगह है जहां हमें गुण और विधियां मिलती हैं।

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

+0

संभावित रूप से अतिरिक्त चेक, कैशिंग, आदि की आवश्यकता होने पर: हाँ, लेकिन यह किसी संपत्ति को प्राप्त/सेट विधियों की एक जोड़ी से अलग नहीं करता है, है ना? संकल्पनात्मक रूप से, मैं आपके साथ हूं। लेकिन मुझे यह भी लगता है कि अगर यह .NET गुणों का एकमात्र उद्देश्य था, तो वे उपलब्ध टूल्स में बहुत कुछ नहीं जोड़ पाएंगे। अगर मेरे पास कोई फंक्शन Box.getWidth() है, तो भी मैं एक ऑब्जेक्ट को मॉडलिंग कर रहा हूं और इसकी विशेषताओं में से किसी एक को एक्सेस करने का तरीका प्रदान कर रहा हूं जैसे कि मैं संपत्ति बॉक्स का उपयोग करता हूं। विथथ। बेशक, संपत्तियों में अन्य उपयोगी विशेषताएं भी हैं, क्योंकि अन्य उत्तरों ने स्पष्ट किया है। –

+1

हां, getWidth/setWidth किसी ऑब्जेक्ट पर किसी प्रॉपर्टी के विचार को मॉडल कर सकता है। लेकिन वे गुणों के लिए एक समर्पित वाक्यविन्यास के साथ ही यह नहीं करते हैं। प्रोग्रामिंग का बिंदु हमें अपने ज्ञान को कंप्यूटर पर स्थानांतरित करने में मदद करना है, इसलिए हम अपनी सोच के तरीके से संगत भाषाओं को डिज़ाइन करते हैं। सोचने के हमारे तरीके में, असली दुनिया की वस्तुओं में गुण होते हैं, न कि गेटर्स और सेटर्स। यह विचार, कि हम उन वस्तुओं के संदर्भ में सोचते हैं जिनके पास विशिष्ट गुण हैं और विशिष्ट तरीके से कार्य करते हैं, आपके प्रश्न के कई अन्य उत्तरों को कम करते हैं। – yfeldblum

2

शायद मामूली बिंदु, लेकिन गेटर्स/सेटर्स के साथ मुझे यह परेशान लगता है कि जब मैं 'इंटेलिजेंस' के साथ आईडीई में उनके माध्यम से साइकिल चला रहा हूं तो एक दूसरे के बगल में 'गेटर्स' का एक बड़ा ब्लॉक है और ' setters '। मुझे जो दिख रहा है उसे ढूंढना मुझे और मुश्किल लगता है।

3

सार पर गुण विधि जोड़े प्राप्त/सेट हैं।

गुण मेटाडेटा समर्थन वाले सेट सेट विधियों की एक जोड़ी को उजागर करने का एक रनटाइम समर्थित तरीका है जिसका अर्थ यह है कि वे अनुमान लगाए बिना प्रतिबिंब का उपयोग करके खोजने योग्य हैं कि विधि नाम और हस्ताक्षर के आधार पर एक्सेसर को किस तरीके से बनाना है।

गुणों का अन्य लाभ यह है कि वे सिरेक्टिक रूप से फ़ील्ड की तरह कार्य करते हैं, और विधियों की तरह नहीं, जिनके पास अधिक स्वच्छ कोड बनाने का लाभ होता है।

मैं एक प्राप्त/सेट समारोह एक संपत्ति की तुलना में अधिक पठनीय है, क्योंकि यह स्पष्ट रूप से एक समारोह के रूप में एक सीधे-अप मूल्य के लिए विरोध किया है सोचने के लिए इच्छुक हूँ।

समय गुण से अधिकांश, जीत इंजन द्वारा inlined रहे हैं क्योंकि वे बहुत ही सरल, जिसका अर्थ है समय गुण के सबसे अधिक की तुलना में वे कार्यों की तरह कार्य क्षेत्रों की तरह काम करते हैं, इसलिए वे के करीब कैसे क्षेत्रों से व्यवहार करते हैं कर रहे हैं कार्य करता है।

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

  • नोट: सभी गुण सस्ते नहीं हैं, लेकिन सामान्य दिशानिर्देश बताते हैं कि उन्हें यथासंभव सरल और हल्का होना चाहिए।
1

usr के रूप में कहता है:

"एक संपत्ति बिना किसी दुष्प्रभाव जा रहा है पाने का एक अर्थ है और दोनों हो और सेट एक तेजी से ऑपरेशन किया जा रहा है।"

बिल्कुल। यह निहित है कि एक गेटर/सेटर जल्दी होगा। संपत्ति के रूप में कुछ उजागर करके आप यह कह रहे हैं कि आप किसी ऑब्जेक्ट पर एक विशेषता को जल्दी से ला रहे हैं/डाल रहे हैं। एक विशेषता को प्राप्त करने/सेट करने की तुलना में अधिक चक्र शामिल करने के लिए मानी जाने वाली कुछ प्रकार के काम करने के तरीके हैं। हम आमतौर पर एक गेटफू (...)/SetFoo (...) विधियों में एक लंबे ऑपरेशन 'गुण' डाल देंगे यह इंगित करने के लिए कि गणना गणना एक संपत्ति से भारी है।

0

वे इस प्रकार के उपयोगकर्ता को सरलीकृत वाक्यविन्यास रखने की अनुमति देते हैं, और आपको केवल पढ़ने के लिए और केवल-पढ़ने वाले फ़ील्ड बनाने की अनुमति देते हैं। इस प्रकार मुझे। सैटएज (34); आयु = मुझे। गेटएज(); me.age = 34 बन जाता है; आयु = me.age;

3

एक मूल्य के लिए गुण का उपयोग करने का अर्थ शुद्धता कि एक वस्तु का एक संपत्ति का वर्णन करता है के अलावा, आप इस के साथ बहस नहीं कर सकते हैं:

obj.SetValue(obj.GetValue() + 1); 

बनाम

obj.Value++; 
2

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

class Point 
{ 
    private int x, y; 

    // Ew, pointless boilerplate! 
    public int getX()  { return x; } 
    public void setX(int x) { this.x = x; } 

    public int getY()  { return y; } 
    public void setY(int y) { this.y = y; } 
} 

// ... 

Point p = new Point(); 
p.setX(5); 
p.setY(10); 

गुण के साथ आप बॉयलरप्लेट getters और गुण होते हैं कि केवल तुच्छ getters और setters के 90% के लिए setters समाप्त कर सकते हैं। तुम सिर्फ सार्वजनिक चर सीधे फिर बाद में अवगत कराया

class Point 
{ 
    public int x, y; 
} 

Point p = new Point(); 
p.x = 5; 
p.y = 10; 

यदि आप यह तय get या set तरीकों में वास्तविक व्यवहार के साथ गुण करने के लिए उन्हें बदल सकते हैं आप अपनी सार्वजनिक चर के लिए कुछ व्यवहार जोड़ना चाहते हो सकता है। यहां की तरफ यह है कि आपकी कक्षा के उपयोगकर्ता बिल्कुल प्रभावित नहीं हैं। कुछ नहीं बदला है; उन्हें point.x = 5 से point.setX(5) पर स्विच करने की आवश्यकता नहीं है। आपका सार्वजनिक इंटरफ़ेस स्थिर है, आपको पहले सादे चर का उपयोग करने और धीमे get/set विधियों पर स्विच करने की अनुमति देता है जब आप कुछ गार्डिंग/लॉगिंग/जो भी जोड़ते हैं।

class Point 
{ 
    public int x { get; set; } 
} 

// No change! 
Point p = new Point(); 
p.x = 5; 
p.y = 10; 

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

+0

मुझे यह जवाब बहुत पसंद है, खासकर जब से हाल ही में मेरे सहकर्मियों में से एक को इस मुद्दे का सामना करना पड़ा (कुछ सार्वजनिक सदस्यों के पुनर्प्राप्ति के लिए कुछ तर्क जोड़ने की आवश्यकता है), और इसलिए उन्होंने समस्या चर को फ़ंक्शन में परिवर्तित कर दिया, जो सभी के लिए ठीक काम करता था कोड के असीमित हिस्सों को "प्राप्त करें" के दौरान, उन जगहों के मुकाबले तोड़ते हुए जहां हम वास्तव में मूल्य निर्दिष्ट कर रहे थे। यह खत्म हो गया और ठीक करने के लिए आसान हो गया; लेकिन हिंडसाइट में, एक संपत्ति जाने का रास्ता होता। मैं यह भी जोड़ना चाहता हूं कि मैं बहुत प्रभावित हूं कि यह वाक्प्रचार एक बंदर द्वारा लिखा गया था। –

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