गुणों की बात क्या है?


11

यहाँ गुणों और मेरे प्रतिवाद के लिए कुछ तर्क दिए गए हैं:

गेट्टर और सेटर विधियों को लिखने की तुलना में उपयोग करने में आसान

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

किसी वस्तु के उपभोक्ता के लिए जो महत्वपूर्ण है वह वह करता है, न कि वह कैसे करता है। इसका व्यवहार यह है कि यह क्या करता है; इसकी स्थिति यह है कि यह कैसे करता है। यदि आप अपने आप को एक वस्तु की स्थिति के बारे में देखभाल करते हुए पाते हैं (दृढ़ता के अलावा, हालांकि यह भी ओओ को तोड़ता है), तो आप बस ओओपी नहीं कर रहे हैं और इसके फायदे खो रहे हैं।

वे उपभोक्ताओं को प्रदर्शन का एक मोटा संकेत देते हैं

यह ऐसी चीज है जो भविष्य में किसी भी संपत्ति के लिए बदल सकती है। मान लें कि 1.0 रिलीज में, प्रॉपर्टी एक्सेस करने से केवल एक क्षेत्र मिलता है। 1.5 रिलीज में, यदि फ़ील्ड शून्य है, तो एक नया नल ऑब्जेक्ट बनाने के लिए PropertyX नल ऑब्जेक्ट पैटर्न का उपयोग करता है। 2.0 रिलीज़ होने पर, प्रॉपर्टीएक्स में गेट्टर विधि द्वारा क्षेत्र को और अधिक मान्य किया जा रहा है।

जैसा कि संपत्ति अधिक से अधिक जटिल हो जाती है, संपत्ति का उपयोग करने का प्रदर्शन संकेत कम और कम सच लगता है।

वे सार्वजनिक क्षेत्रों से बेहतर हैं

यह सच है। लेकिन तरीके हैं।

वे एक विधि की तुलना में किसी वस्तु के मूलभूत रूप से भिन्न पहलू का प्रतिनिधित्व करते हैं, और वस्तु के सभी उपभोक्ताओं को इस बारे में ध्यान देना चाहिए

क्या आप सुनिश्चित हैं कि उपरोक्त दोनों कथन सत्य हैं?

उन्हें टाइप करना आसान है, यार

ज़रूर, टाइपिंग myObject.Lengthकी तुलना में टाइपिंग आसान है myObject.Length(), लेकिन क्या थोड़ी सी भी चीनी के साथ तय नहीं किया जा सकता है?


गुणों के बजाय तरीकों का उपयोग क्यों करें?

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

  • उपभोक्ता के लिए सोचने के लिए कम। क्या इस संपत्ति में एक सेटर है? यकीन है कि एक विधि नहीं है।

  • उपभोक्ता एक उचित ओओपी मानसिकता से सोच रहा है। एक एपीआई के उपभोक्ता के रूप में, मैं एक वस्तु के व्यवहार के साथ बातचीत करने में दिलचस्पी रखता हूं। जब मैं एपीआई में गुण देखता हूं, तो यह बहुत कुछ राज्य जैसा दिखता है। वास्तव में, यदि संपत्तियाँ बहुत अधिक होती हैं, तो उन्हें गुण भी नहीं होने चाहिए, इसलिए वास्तव में, API में गुण ऐसे होते हैं जैसे वे उपभोक्ताओं को दिखाई देते हैं।

  • एपीआई के प्रोग्रामर रिटर्न मानों के साथ तरीकों के बारे में अधिक गहराई से सोचेंगे, और यदि संभव हो तो ऐसे तरीकों में ऑब्जेक्ट की स्थिति को संशोधित करने से बचें। जहाँ भी संभव हो, प्रश्नों से आदेशों का पृथक्करण लागू किया जाना चाहिए।


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

(ये विचार CQS के बारे में सोचने के बाद मेरे पास आए।)


5
+1। गुण फ़ील्ड्स के सिंटैक्स के साथ विधियाँ हैं और इसका कोई मतलब नहीं है।
निमन्जा ट्राइफुनोविक

23
@ नेमंजा ट्रिफ़ुनोविक: अगर आप type GetFoo() void SetFoo()दस हज़ार बार लिख चुके हैं तो यह सही समझ में आता है। मेरे सभी समय में C # कोड लिखने से मैं कभी भी किसी संपत्ति से भ्रमित नहीं हुआ।
एड एस।

23
मुझे लगता है जैसे आप पहले से ही अपना मन बना चुके हैं। प्रश्न क्या है?
डीन हार्डिंग

9
@Nemanja Trifunovic: "गेटर्स और सेटर आमतौर पर खराब होते हैं" आप जितनी बार चाहें उतनी बार दोहरा सकते हैं, लेकिन यह सच नहीं होगा। यह समझाने के बारे में कि आपको क्यों लगता है कि वे बुरे हैं? जहाँ तक SO अंतर्निहित अंतर्निहित नाम के बजाय संपत्ति का नाम टाइप करने के कारण दुर्घटनाग्रस्त हो जाता है, तो यह मानना ​​असंभव है कि जब आप संपत्ति को कॉल करते हैं तो यह आपके प्रोग्राम को क्रैश कर देगा और यह बहुत दुर्लभ है। जब ऐसा होता है तो मुझे पता होता है कि मैंने इसके कारण क्या किया है और मैंने इसे दो सेकंड में तय किया है। मुझे समस्या नहीं दिख रही है।
एड एस।

3
@NemanjaTrifunovic की ओर इशारा करते हुए बस इतना ही कहा गया कि क्यों गटर और सेटर के तरीके बुरे लेख हैं, काफी पुराना है , जावा के बारे में है और एक जावा कमजोरी को रेखांकित करता है : गुण न होने की कमजोरी । (इसलिए बहुत से कार्यान्वयन विवरण दिखाते हुए) ... यहाँ हमारी पूंछ काट रही है। (यह शीर्षक पाने वालों और बसने वालों को जावा में खराब होना चाहिए , क्योंकि हमारे पास उन लोगों के बारे में कोई अच्छा मानक नहीं है )
ZJR

जवाबों:


44

यह "गुणों के विरुद्ध तरीके" क्यों है? एक विधि कुछ करती है। एक संपत्ति, ठीक है, एक वस्तु का एक सदस्य है। वे पूरी तरह से अलग चीजें हैं, हालांकि दो तरह की विधियां आमतौर पर लिखी जाती हैं - गेटर्स और सेटर - गुणों के अनुरूप। चूँकि गुणों की तुलना सामान्य तरीके से नहीं की जाती है, इसलिए मुझे लगता है कि आप गेटर्स / सेटर के बारे में बात करना चाहते हैं।

गेट्टर और सेटर विधि जोड़े एक कोड गंध हैं।

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

किसी वस्तु के उपभोक्ता के लिए जो महत्वपूर्ण है वह वह करता है, न कि वह कैसे करता है। इसका व्यवहार यह है कि यह क्या करता है; इसकी स्थिति यह है कि यह कैसे करता है। यदि आप अपने आप को एक वस्तु की स्थिति के बारे में देखभाल करते हुए पाते हैं (दृढ़ता के अलावा, हालांकि यह भी ओओ को तोड़ता है), तो आप बस ओओपी नहीं कर रहे हैं और इसके फायदे खो रहे हैं।

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

जैसा कि संपत्ति अधिक से अधिक जटिल हो जाती है, संपत्ति का उपयोग करने का प्रदर्शन संकेत कम और कम सच लगता है।

[तरीके हैं] कोई प्रदर्शन की गारंटी नहीं है। विधि अधिक जटिल होने पर भी API सत्य रहेगा। उपभोक्ता को अपने कोड को प्रोफाइल करने की आवश्यकता होगी यदि वे प्रदर्शन के मुद्दों पर चल रहे हैं, और वर्ड-ऑफ-एपीआई पर भरोसा नहीं करते हैं।

लगभग सभी मामलों में, सभी सत्यापन तर्क आदि अभी भी प्रभावी रूप से ओ (1) है, या अन्यथा लागत में नकारात्मक है। यदि नहीं, तो शायद आप बहुत दूर चले गए हैं और बदलाव का समय आ गया है। और एक getX()विधि को आमतौर पर सस्ते के रूप में भी माना जाता है!

ज़रूर, myObject टाइप करना। Length myObject.Length () टाइप करने की तुलना में आसान है, लेकिन क्या यह थोड़ी सी सिंथेटिक चीनी के साथ तय नहीं किया जा सकता है?

गुण हैं कि सिंटैक्टिक शुगर।

उपभोक्ता के लिए सोचने के लिए कम। क्या इस संपत्ति में एक सेटर है? यकीन है कि एक विधि नहीं है।

"क्या इस गटर के लिए कोई सेटर है?" बराबर असमानताएं।

एपीआई के प्रोग्रामर रिटर्न मानों के साथ तरीकों के बारे में अधिक गहराई से सोचेंगे, और यदि संभव हो तो ऐसे तरीकों में ऑब्जेक्ट की स्थिति को संशोधित करने से बचें। जहाँ भी संभव हो, प्रश्नों से आदेशों का पृथक्करण लागू किया जाना चाहिए।

मुझे यकीन नहीं है कि आप हमें यहां बताने की कोशिश कर रहे हैं। गुणों के लिए, साइड इफेक्ट्स का कारण नहीं होने के लिए एक और भी मजबूत अलिखित कानून है।


3
+1, और इसका अलिखित कानून नहीं है। MSDN पर संपत्ति उपयोग के दिशानिर्देशों ने इसे कई अन्य लोगों के साथ लिखा है। मुझे लगता है कि ओपी को उनके माध्यम से जाना चाहिए ताकि वे खुद को कई संदेह से दूर कर सकें। और जब से मैं अपने फोन से यह लिख रहा हूं, मैं यहां लिंक पोस्ट नहीं कर सकता, लेकिन दिशानिर्देशों को ढूंढना आसान होना चाहिए।
चक्रवात


@delnan: गुण वह संश्लिष्ट चीनी नहीं हैं। गुणों को खेतों की तरह माना जा सकता है (यदि वे एक सेटर के रूप में उपयोग किए जा सकते हैं, तो उन्हें एक असाइनमेंट लक्ष्य के रूप में इस्तेमाल किया जा सकता है)। तरीके नहीं कर सकते।
ज़ोफ़ज़

1
@SamPearson: obj.x = yमैप्स टू obj.setX(y)और obj.xमैप्स टू obj.getX()। कैसे अलग है?

1
@SamPearson आप एक संपत्ति सेटर की दृश्यता को बदल सकते हैं और एक दूसरे से स्वतंत्र हो सकते हैं। मैं अपने एंटिटी फ्रेमवर्क ऑब्जेक्ट्स के साथ हर समय इसका उपयोग करता हूं: मेरे सेटर सुरक्षित हैं (इसलिए केवल फ्रेमवर्क एक मान सेट कर सकता है)। तो यह की अनुमति के बिना कहने के लिए पूर्णांक लंबाई = myObject.Length पूरी तरह से व्यवहार्य है myObject.Length = 10
माइकल ब्राउन

19

गेट्टर और सेटर विधि जोड़े एक कोड गंध हैं।

यह एक दोषपूर्ण धारणा है और पूरी तरह से गलत है। Get / Set मेथड्स डेटा सदस्य को एनकैप्सुलेट करने का एक तरीका है और किसी भी तरह से "कोड गंध" नहीं है। मैं वास्तव में जिस तरह से कुछ लोगों को "कोड गंध" शब्द के चारों ओर फेंकने से नफरत करता हूं, लेकिन वैसे भी ...

यह ऐसी चीज है जो भविष्य में किसी भी संपत्ति के लिए बदल सकती है। मान लें कि 1.0 रिलीज में, प्रॉपर्टी एक्सेस करने से केवल एक क्षेत्र मिलता है। 1.5 रिलीज में, यदि फ़ील्ड शून्य है, तो एक नया नल ऑब्जेक्ट बनाने के लिए PropertyX नल ऑब्जेक्ट पैटर्न का उपयोग करता है। 2.0 रिलीज़ होने पर, प्रॉपर्टीएक्स में गेट्टर विधि द्वारा क्षेत्र को और अधिक मान्य किया जा रहा है।

जैसा कि संपत्ति अधिक से अधिक जटिल हो जाती है, संपत्ति का उपयोग करने का प्रदर्शन संकेत कम और कम सच लगता है।

खराब तरीके से डिजाइन किए गए एपीआई की तरह लगता है, मुझे नहीं लगता कि संपत्ति सिंटैक्स की गलती कैसे है।

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


1
मैं कोड गंध से बेहतर शब्द के साथ आने के लिए एक इनाम देने जा रहा हूं। बस एक पुस्तक को रिफैक्ट करने पर पढ़ें जहां इसका उपयोग लगभग हजार बार किया जाता है। यह एक चॉकबोर्ड पर नाखूनों की तरह है।
जेफ़ो

1
@ जेफ ओ: हाँ, मुझे पता है कि जो लोग उस शब्द को सबसे आम तौर पर फेंकते हैं, उनके पास बहुत अधिक अनुभव नहीं है।
एड एस।

6
@ जेफ़ ओ और @ ईडी एस: आईएमई, "कोड गंध" गो-टू-टर्म बन गया है जिसका उपयोग लोग तब करते हैं जब वे वास्तव में इसका मतलब "मुझे यह पसंद नहीं है, लेकिन मेरे पास वास्तव में कोई कारण नहीं है"
स्टीवन एवर्स

3
@SnOrfus: हाँ, या जब वे "धार्मिक" विचार रखते हैं, जो अक्सर अभ्यास में कम समझ में आता है, जैसे "एक विधि में कभी भी X संख्या से अधिक की रेखाएं नहीं होनी चाहिए" , जो बदले में आमतौर पर केवल कुछ का दोहराव होता है जो वे कहीं पढ़ते हैं।
एड एस।

1
अनुचित गेटर / सेटर तरीकों का उपयोग एक कोड गंध है, लेकिन तो भी के अनुचित उपयोग किया जाना चाहिए कुछ भी । यहां तक ​​कि जब चीजों के संकीर्ण उपयोग के मामले होते हैं, तो उन उपयोग के मामलों के लिए ऐसी चीजों को नियोजित करना एक कोड गंध नहीं माना जाना चाहिए। हर चीज के लिए बसने वालों का निर्माण एक अंधे की आदत नहीं होनी चाहिए, लेकिन जब उचित हो तो उन्हें शामिल करने से डरना नहीं चाहिए। राज्य को बदलने में सक्षम होने के ग्राहकों के लिए उपयोगिता को संतुलित करना आवश्यक है, या भविष्य में यह पता लगाने में सक्षम होने के लिए कि राज्य पहले क्या था (यदि राज्य अपरिवर्तनीय है तो आसान है)। दोनों उपयोगी हैं, लेकिन कोड एक चुनना होगा।
सुपरकैट

10

आपका आधार गलत है।

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

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


6

उपभोक्ता एक उचित ओओपी मानसिकता से सोच रहा है। एक एपीआई के उपभोक्ता के रूप में, मैं एक वस्तु के व्यवहार के साथ बातचीत करने में दिलचस्पी रखता हूं। जब मैं एपीआई में गुण देखता हूं, तो यह बहुत कुछ राज्य जैसा दिखता है। वास्तव में, यदि संपत्तियाँ बहुत अधिक होती हैं, तो उन्हें गुण भी नहीं होने चाहिए, इसलिए वास्तव में, API में गुण ऐसे होते हैं जैसे वे उपभोक्ताओं को दिखाई देते हैं।

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

एक सेटर या गेट्टर में बहुत अधिक (कितना बहुत निर्भर करता है) कोड डालना गलत है, लेकिन सिर्फ इसलिए कि यह संभव नहीं है सभी मामलों में पैटर्न को बाहर फेंकने का एक कारण नहीं है।


6

एक बात जो आप याद कर रहे हैं, और मुझे नहीं पता कि यह अज्ञानता के कारण है या यदि आप जानबूझकर इस विवरण को देख रहे हैं, तो यह है कि गुण विधियां हैं।

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

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

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

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

गुणों का उल्टा यह है कि किसी अन्य वस्तु का लाभ लेना बहुत आसान है। गुणों का नकारात्मक पक्ष यह है कि किसी अन्य वस्तु का लाभ उठाना बहुत आसान है, और आप आसानी से उसे रोक नहीं सकते हैं।

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

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


5

गुणों का उपयोग करने के लिए मेरी पुस्तक में एक और महत्वपूर्ण कारण यह है कि वे पठनीयता को बहुत बढ़ा सकते हैं।

account.setBalance(Account.getBalance()+deposit);

की तुलना में स्पष्ट रूप से बहुत कम पठनीय है

account.Balance += deposit;

6
सिवाय इसके कि शेष राशि एक संपत्ति नहीं होनी चाहिए क्योंकि इसे बदलने के साथ जुड़े महत्वपूर्ण व्यावसायिक तर्क होना निश्चित है (ओवरड्राफ्ट के लिए जांच; प्रभार सेवा शुल्क; रिकॉर्ड लेनदेन, आदि) आपकी पठनीयता बिंदु पूरी तरह से वैध है यदि एक अलग उदाहरण पर लागू किया जाता है ( तापमान, पृष्ठभूमिकोलोर आदि)
केट ग्रेगोरी

9
खाता क्यों नहीं। डिपोजिटरी (राशि)?
१२:१५

4
@ सैम पियरसन: +1। क्यों गेटर्स / सेटर्स अक्सर खराब डिज़ाइन का संकेत देते हैं, इसका एक आदर्श उदाहरण है।
निमन्जा ट्राइफुनोविक

4

आप मेरे साथ लगभग विपरीत धार्मिक दृष्टिकोण रखते हैं :)

जब मैं डेल्फी से जावा में स्थानांतरित हुआ, तो गुणों की कमी मेरे लिए बहुत बड़ा संघर्ष था। मुझे एक संपत्ति की घोषणा करने के लिए इस्तेमाल किया गया था और या तो इसे सीधे एक निजी चर की ओर इशारा किया गया था या संपत्ति को एक (संरक्षित) गेट्टर और सेटर लिखा था, फिर उन्हें "प्लंबिंग" किया। इसने संपत्ति को इनकैप्सुलेट किया और नियंत्रित किया कि इसे स्पष्ट स्पष्ट तरीके से कैसे एक्सेस किया जाए। आपके पास केवल पढ़ने योग्य संपत्ति हो सकती है जो एक्सेस करने पर कुल की गणना करती है और इसे "कुल" नहीं "_getTotal ()" या इसी तरह के गुब्बारे कहती है। इसका मतलब यह भी था कि आप संपत्तियों को एक्सेस करने से रोक सकते हैं, ताकि उन्हें एब्सट्रैक्ट बेस क्लास में संरक्षित किया जा सके और फिर उन्हें सार्वजनिक या उपवर्गों में प्रकाशित किया जा सके।

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


+1 यह वास्तव में एक संपत्ति का वास्तविक उपयोग है। बहुत बढ़िया जवाब। " इसका अर्थ यह भी था कि आप संपत्तियों को ऐब्सट्रैक्ट बेस क्लास में संरक्षित करके उन्हें सार्वजनिक या उपवर्गों में प्रकाशित करने तक सीमित कर सकते हैं। "
कार्तिक श्रीनिवासन

डेल्फी के गुणों का दुरुपयोग विज्ञापन nauseam। आप सूची को क्रमबद्ध नहीं करते हैं, आप इसकी sorted संपत्ति निर्धारित करते हैं true। इसलिए इसे सेट करने falseसे आपको मूल सूची मिल जाएगी। : डी या क्या यह बेतरतीब ढंग से फेरबदल करता है? : डी या जो भी हो, यह सिर्फ बेवकूफ है। इसके अतिरिक्त, यह एक उचित क्रमबद्ध सेट की तुलना में धीमा है। गुण ख़राब नहीं हैं, लेकिन मैंने उन्हें बहुत संयम से इस्तेमाल करना सीखा है (जब तक कि गटर और सेटर से काफी खुश होने की बात है; मैं ज्यादातर जावा का उपयोग कर रहा हूँ)।
मातरिनस

1

जावा बीन्स फ्रेमवर्क में गुणों को पेश करने के कारणों में से एक आईडीई के साथ एकीकरण की अनुमति देना था - आप उन घटकों को आईडीई तक खींच सकते हैं और संपत्ति संपादकों का उपयोग करके गुणों को संपादित कर सकते हैं।

(तब वे केवल नियमित गेटर्स और सेटर थे - और केवल नामकरण सम्मेलन द्वारा परिभाषित किए गए थे - और यह वास्तव में गंध नहीं था)

आज ऐसे और भी मामले हैं जहाँ संपत्तियों तक पहुँचा और नियमित कोड के माध्यम से संशोधित नहीं किया गया है - जैसे कि डीबगिंग करते समय।


1

एक अन्य कोण - वे वास्तव में वीबी से आए थे। याद रखें, 20 वीं शताब्दी के अंधेरे दिनों में जब .NET परिकल्पना की गई थी तो एक प्रमुख जोर यह था कि यह VB के लिए एक आसान, ड्रॉप-इन प्रतिस्थापन है, इसलिए आपके VB प्रोग्रामर वेबफॉर्म पर चीजों को सिर्फ ड्रैग और ड्रॉप कर सकते हैं। VB में गुण थे इसलिए आपको सही अनुवाद करने के लिए उस सुविधा को बनाए रखने की आवश्यकता थी।


1
एंडर्स हेलज्सबर्ग ने C # (और कुछ IL) को डिजाइन किया और डेल्फी को भी डिजाइन किया - जिसमें गुण थे।
जेसी सी। स्लीपर

1

संपत्तियों के लिए कम से कम दो उद्देश्य हैं:

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

  • वे वाक्यात्मक रूप से सार्वजनिक (संभवतः केवल पढ़ने के लिए) फ़ील्ड के समान हैं। इसका मतलब है कि सार्वजनिक क्षेत्र को स्रोत स्तर पर कॉल करने वालों को तोड़ने के बिना एक संपत्ति में बदला जा सकता है।


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

1
सार्वजनिक क्षेत्र को एक संपत्ति में बदलने से द्विआधारी संगतता टूट जाएगी , उपभोग कोड को फिर से
संकलित करना

@MattDavey: धन्यवाद। वही तो मेरा मतलब था। संपादित।
dsimcha
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.