दिलचस्प पोस्ट
व्युत्पन्न क्लास फ़ंक्शन से पैरेंट क्लास फंक्शन कैसे कॉल करें? वेबएक्साशन कैसे एक शरीर के साथ पूरी प्रतिक्रिया पाने के लिए? जावा जेनेरिक – जेनेरिक को 2 इंटरफेस का विस्तार करने के लिए बनाएं Runtime.exec को कॉल करते समय stdout कैप्चर करना क्या आपके पास एकाधिक $ (दस्तावेज़) हो सकता है .ready (function () {…}); वर्गों? एंड्रॉइड: सटीक ऊंचाई कैसे प्राप्त करें? xmpp में php मेल सेटअप कितने धागे को पूरा करने के लिए इंतजार करना है? एचटीटीपी अनुरोध बॉडी के अंत का पता लगाएं डेटा योग्य और समांतर कंप्यूटिंग MySQL: रिवर्स संस्करण की तरह क्या है? WPF TreeView पदानुक्रमितडेटा टेम्पलेट – कई बच्चे संग्रह के साथ ऑब्जेक्ट करने के लिए बाइंडिंग SqlDataReader से डेटा पढ़ें कैसे जार फाइल में संसाधनों का उपयोग करने के लिए? Scala: क्यों नक्शा मूल्य एक दृश्य पैदा करता है और कोई स्थिर विकल्प है?

कार्यों के बजाय गुणों का उपयोग कब करना

यह संभवतः व्यक्तिगत प्राथमिकता का मामला है, लेकिन आप अपने कोड में फ़ंक्शन के बजाय गुणों का उपयोग कब करते हैं

उदाहरण के लिए एक त्रुटि लॉग प्राप्त करने के लिए मैं कह सकता हूँ

string GetErrorLog() { return m_ErrorLog; } 

या मैं कर सकता था

 string ErrorLog { get { return m_ErrorLog; } } 

आप कैसे तय करते हैं कि किस का उपयोग करना है? मैं अपने उपयोग में असंगत प्रतीत होता है और मैं अंगूठे के एक अच्छे सामान्य नियम की तलाश कर रहा हूं धन्यवाद।

वेब के समाधान से एकत्रित समाधान "कार्यों के बजाय गुणों का उपयोग कब करना"

मैं गुणों का उपयोग करते हैं यदि निम्न सत्य हैं:

  • संपत्ति एक एकल, तर्क मूल्य वापस आ जाएगी
  • थोड़ा या कोई तर्क शामिल नहीं है (आमतौर पर केवल एक मान लौटते हैं, या एक छोटे चेक / वापसी मान करते हैं)

मैं तरीकों का उपयोग करते हैं यदि निम्न सत्य हैं:

  • मूल्य लौटने में महत्वपूर्ण काम होने जा रहा है – यानी: यह डीबी से प्राप्त होगा, या ऐसा कुछ जो "समय" ले सकता है
  • या तो मूल्य प्राप्त करने या स्थापित करने में काफी तर्क शामिल है

इसके अलावा, मैं सुझाता हूं कि माइक्रोसॉफ्ट के प्रॉपर्टी यूसेज के डिज़ाइन दिशानिर्देश देखे। उनका सुझाव है:

एक संपत्ति का उपयोग करें जब सदस्य एक तार्किक डेटा सदस्य है।

एक विधि का उपयोग करें जब:

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

यहां माइक्रोसॉफ्ट के दिशानिर्देश हैं:

गुणों और तरीकों के बीच चयन करना

  • एक संपत्ति का उपयोग करने पर विचार करें यदि सदस्य प्रकार के एक तार्किक विशेषता का प्रतिनिधित्व करता है।

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

  • निम्न स्थितियों में संपत्ति के बजाय विधि का उपयोग करें।

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

    • ऑपरेशन एक रूपांतरण है, जैसे ऑब्जेक्ट। टॉस्ट्रिंग विधि।

    • ऑपरेशन प्रत्येक बार इसे बुलाया जाता है, एक अलग परिणाम देता है, भले ही पैरामीटर नहीं बदलते। उदाहरण के लिए, न्यूगुइड विधि हर बार इसे कहा जाता है एक अलग मान देता है।

    • ऑपरेशन के पास एक महत्वपूर्ण और अवलोकनत्मक दुष्प्रभाव है। ध्यान दें कि एक आंतरिक कैश को आम तौर पर एक साइड इफेक्ट माना जाता है

    • ऑपरेशन आंतरिक राज्य की एक प्रति देता है (इसमें स्टैक पर लौटा मूल्य प्रकार की वस्तुओं की प्रतियां शामिल नहीं हैं)।

    • ऑपरेशन एक सरणी देता है

मैं गुणों का उपयोग करता हूँ जब इसकी स्पष्ट अर्थ "ऑब्जेक्ट से कुछ मूल्य प्राप्त करें" हालांकि एक विधि का उपयोग करने के लिए संवाद करने का एक अच्छा तरीका है "इसे वापस करने के लिए एक तुच्छ प्रयास से थोड़ी अधिक लग सकता है"

उदाहरण के लिए एक संग्रह में Count संपत्ति हो सकती है संग्रह ऑब्जेक्ट मानने के लिए उचित है कि यह वास्तव में उनके द्वारा पाश के बिना कितनी वस्तुएं आयोजित किए जा रहे हैं और उन्हें गिनना है

हाथ पर इस काल्पनिक संग्रह में गेटसम () विधि हो सकती है जो कुल मिलाकर वस्तुओं के सेट को वापस करता है। संग्रह के बजाय आसानी से एक संपत्ति है लेकिन एक विधि का उपयोग करके यह इस विचार को संचारित करता है कि संग्रह को उत्तर पाने के लिए कुछ वास्तविक कार्य करना होगा।

अगर मैं एक से अधिक फ़ील्ड को प्रभावित कर सकता हूं तो मैं एक संपत्ति का कभी इस्तेमाल नहीं कर सकता- मैं हमेशा एक विधि का उपयोग करता हूं

आम तौर पर, मैं सिर्फ सार्वजनिक स्ट्रिंग त्रुटि का प्रयोग करें {get; निजी सेट; } गुणों के लिए वाक्यविन्यास और सब कुछ के लिए तरीके का उपयोग करें

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

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

इसमें एनईटी फ्रेमवर्क डिज़ाइन दिशानिर्देश पुस्तिका है जो इस तरह की चीजों को बहुत विस्तार से कवर करती है।