गेटर्स और सेटर्स के अंदर क्या अनुमति दी जानी चाहिए?


45

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

  • क्या मैं सही हूं कि यह पहली जगह में गेटर्स और सेटर होने के उद्देश्य को पूरी तरह से हरा देगा और सत्यापन और अन्य लॉजिक (अजीब दुष्प्रभावों के बिना) को अनुमति दी जानी चाहिए?
  • सत्यापन कब होना चाहिए?
    • मूल्य निर्धारित करते समय, सेटर के अंदर (ऑब्जेक्ट को कभी भी अमान्य स्थिति में प्रवेश करने से बचाने के लिए - मेरी राय)
    • मान सेट करने से पहले, सेटर के बाहर
    • ऑब्जेक्ट के अंदर, प्रत्येक समय से पहले मूल्य का उपयोग किया जाता है
  • क्या एक सेटर को मान बदलने की अनुमति दी जाती है (हो सकता है कि वैध मूल्य को कुछ कैनोनिकल आंतरिक प्रतिनिधित्व में बदल दें)?

18
गेटर्स और सेटर्स के बारे में सबसे अच्छी बात यह है कि उनके पास न होने की क्षमता है , यानी सेटर की छुट्टी और आपके पास रीड-ओनली प्रॉपर्टी है, गेट्टर की छुट्टी और आपके पास कॉन्फिडेंस का ऑप्शन है जिसका करंट वैल्यू किसी का भी बिजनेस नहीं है।
माइकल बोर्गवर्ड

7
@MichaelBorgwardt एक साफ "बताओ, मत पूछो" इंटरफ़ेस है। गुण = संभावित कोड गंध।
कोनराड रुडोल्फ


2
इवेंट को बढ़ाने के लिए सेटर्स का भी उपयोग किया जा सकता है ।
जॉन यशायाह कार्मोना

@KonradRudolph मैं आपके कथन से सहमत हूँ, हालाँकि मैं "क्षमता" शब्द पर ज़ोर देना चाहूँगा।
फिल

जवाबों:


37

मुझे याद है कि विश्वविद्यालय में C ++ सीखने के दौरान मेरे लेक्चरर के साथ भी ऐसा ही तर्क था। जब मैं एक चर सार्वजनिक कर सकता था तो मैं बस गेटर्स और सेटर का उपयोग करने की बात नहीं देख सकता था। मैं अब वर्षों के अनुभव के साथ बेहतर समझ रहा हूं और मैंने "एनकैप्सुलेशन को बनाए रखने के लिए" कहने के बजाय एक बेहतर कारण सीखा है।

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

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

निम्नलिखित की तुलना करें:

int aValue = MyClass.Value;

तथा

int aValue = MyClass.CalculateValue();

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

आप शायद तर्क दे सकते हैं कि निम्नलिखित स्पष्ट होगा:

int aValue = MyClass.CalculatedValue;

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

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

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

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

MyClass.Value = 12345;

क्या यह आपको इस बारे में कुछ बताता है कि जब यह सेटर को दिया जाता है तो मूल्य का क्या होने वाला है?

कैसा रहेगा:

MyClass.RoundValueToNearestThousand(12345);

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

क्या मैं सही हूं कि यह पहली जगह में गेटर्स और सेटर होने के उद्देश्य को पूरी तरह से हरा देगा और सत्यापन और अन्य लॉजिक (अजीब दुष्प्रभावों के बिना) को अनुमति दी जानी चाहिए?

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

सत्यापन कब होना चाहिए?

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

क्या एक सेटर को मान बदलने की अनुमति दी जाती है (हो सकता है कि वैध मूल्य को कुछ कैनोनिकल आंतरिक प्रतिनिधित्व में बदल दें)?

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


पुन: मूल्य बदलें, इसे -1 या कुछ फुल फ्लैग टोकन पर सेट करना उचित हो सकता है यदि सेटर को अवैध मान दिया जाता है
मार्टिन बेकेट

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

हां, एक सेटर के औचित्य में से एक यह है कि अगर मूल्य निर्धारित किया जा सकता है तो उसे सही / गलत लौटना चाहिए।
मार्टिन बेकेट

1
"फ़्लोटिंग पॉइंट गुण एक अच्छा उदाहरण है जहाँ आप अपवाद से बचने के लिए अत्यधिक दशमलव स्थानों को गोल करना चाह सकते हैं" किस परिस्थिति में बहुत अधिक दशमलव स्थानों में अपवाद होता है?
मार्क बायर्स

2
मैं मान को वैधता के रूप में एक विहित प्रतिनिधित्व के रूप में बदलता हुआ देखता हूं। अनुपलब्ध गुम मान (उदाहरण के लिए, वर्तमान तिथि यदि टाइमस्टैम्प में केवल समय होता है) या आंतरिक स्थिरता सुनिश्चित करने के लिए मान (.93275 -> 93.28%) स्केलिंग ठीक होनी चाहिए, लेकिन एपीआई प्रलेखन में ऐसे किसी भी हेरफेर को स्पष्ट रूप से कहा जाना चाहिए। , खासकर अगर वे एपीआई के भीतर एक असामान्य मुहावरे हैं।
TMN

20

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

जैसा कि राल्फ वाल्डो एमर्सन ने कहा, "एक मूर्खतापूर्ण स्थिरता छोटे दिमागों की हॉबोब्लिन है, जो छोटे राजनेताओं और दार्शनिकों और जावा के डिजाइनरों द्वारा पसंद की जाती है।"

गेटर्स / सेटर उपयोगी होते हैं जहां साइड इफेक्ट्स हो सकते हैं, जहां आपको अन्य आंतरिक चर को अपडेट करने, कैश्ड मानों को पुनर्गठित करने और अमान्य इनपुट से वर्ग की रक्षा करने की आवश्यकता होती है।

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


1
वाह, जावा के डिजाइनर दिव्य हैं? </ jk>

@delnan - स्पष्ट रूप से नहीं - या वे बेहतर ढंग से कविता करेंगे ;-)
मार्टिन बेकेट

क्या यह एक 3 डी बिंदु बनाने के लिए मान्य होगा जिसमें x, y, z सभी फ्लोट हैं। NAN?
एंड्रयू टी फिनेल

4
मैं आपकी बात से असहमत हूं कि "सामान्य औचित्य" (आंतरिक संरचना को छिपाना) गेटर्स और सेटर की सबसे कम उपयोगी संपत्ति है। C # में, यह निश्चित रूप से संपत्ति को एक इंटरफ़ेस बनाने के लिए उपयोगी है, जिसकी अंतर्निहित संरचना को बदला जा सकता है - उदाहरण के लिए, यदि आप केवल एन्यूमरेशन के लिए उपलब्ध संपत्ति चाहते हैं, तो IEnumerable<T>यह कुछ ऐसा करने के लिए मजबूर करने से बेहतर है List<T>। डेटाबेस एक्सेस का आपका उदाहरण मैं कहूंगा कि एकल जिम्मेदारी का उल्लंघन हो रहा है - मॉडल के प्रतिनिधित्व को कैसे मिलाया जाता है, इसे कैसे बनाए रखा जाए।
ब्रैंडन लिंटन

@AndrewFinnell - यह असंभव / वैध / हटाए गए आदि के रूप में अंकों को फ़्लैग करने का एक अच्छा तरीका हो सकता है
मार्टिन बेकेट

8

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

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

मूल्य वस्तुओं, सरल संरचनाओं को इस अमूर्त की जरूरत नहीं है, लेकिन एक पूरी तरह से विकसित वर्ग करता है, मेरी राय में।


2

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

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

इसी तरह एक सेटर, अनुबंधित रूप से दिखता है, जैसे यह किसी वस्तु की स्थिति को बदल देता है। ऐसा हो सकता है कि कुछ जटिल फैशन में- UPDATEकिसी डेटाबेस में लिखना , या किसी आंतरिक ऑब्जेक्ट पर पैरामीटर को पास करना। यह ठीक है, लेकिन राज्य की स्थापना के लिए कुछ असंबंधित करना आश्चर्यजनक होगा।

मेयर (एफिल के निर्माता) के पास सत्यापन के बारे में कहने के लिए चीजें भी थीं। अनिवार्य रूप से, जब भी कोई वस्तु विलक्षण होती है तो वह वैध अवस्था में होनी चाहिए। तो बस निर्माणकर्ता के समाप्त होने के बाद, प्रत्येक बाहरी विधि कॉल से पहले और बाद में (लेकिन जरूरी नहीं कि), वस्तु की स्थिति सुसंगत होनी चाहिए।

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


1

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


1

प्रॉपर्टी ऐक्सेसर्स और आइवर्स के बीच हमेशा 1-1 मैपिंग नहीं होती है जो डेटा स्टोर करते हैं।

उदाहरण के लिए, एक दृश्य वर्ग एक centerसंपत्ति प्रदान कर सकता है, भले ही कोई आइवर न हो जो दृश्य के केंद्र को संग्रहीत करता है; सेटिंग centerअन्य कारणों से परिवर्तन करती है, जैसे originया transformजो भी हो, लेकिन वर्ग के ग्राहकों को यह पता नहीं है या परवाह नहीं है कि कैसे center संग्रहीत किया जाता है बशर्ते कि यह सही ढंग से काम करता हो। हालांकि, जो नहीं होना चाहिए , वह यह है कि centerनए मूल्य को बचाने के लिए जो कुछ भी आवश्यक है उससे परे चीजों को स्थापित करना, हालांकि ऐसा किया जाता है।


0

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


-4

मेरा मानना ​​है कि बसने वाले और पाने वाले बुरे होते हैं और इसका उपयोग केवल उन वर्गों में किया जाना चाहिए जो एक ढांचे / कंटेनर द्वारा प्रबंधित किए जाते हैं। एक उचित वर्ग के डिजाइन में गेटर्स और सेटर नहीं निकलना चाहिए।

संपादित करें: इस विषय पर एक अच्छी तरह से लिखा गया लेख

Edit2: सार्वजनिक क्षेत्र एक OOP दृष्टिकोण में एक बकवास है; यह कहते हुए कि गेटर्स और सेटर बुराई हैं, मेरा मतलब यह नहीं है कि उन्हें सार्वजनिक क्षेत्रों द्वारा प्रतिस्थापित किया जाना चाहिए।


1
मुझे लगता है कि आप लेख के उस बिंदु को याद कर रहे हैं, जो सुझाव देता है कि गेटर्स / सेवर्स का उपयोग करना और जब तक आवश्यक न हो, तब तक वर्ग डेटा को उजागर करने से बचें। यह IMHO एक समझदार डिज़ाइन सिद्धांत है जिसे डेवलपर द्वारा जानबूझकर लागू किया जाना चाहिए। एक वर्ग पर गुण पैदा करने के मामले में, आप बस एक चर को उजागर कर सकते हैं , लेकिन इससे चर को सेट करने पर सत्यापन प्रदान करना कठिन हो जाता है, या जब "मिला", तब अनिवार्य रूप से इनकैप्सुलेशन का उल्लंघन करते हुए वैकल्पिक स्रोत से मूल्य खींचना, और संभवतः इंटरफ़ेस डिज़ाइन को बनाए रखने के लिए आपको लॉक करना मुश्किल है।
S.Robins

@ S.Robins मेरी राय में सार्वजनिक गेटर्स और सेटर गलत हैं; सार्वजनिक क्षेत्र अधिक गलत हैं (यदि वह तुलनीय है)।
m3th0dman

@ मैथोडमैन हां, मैं मानता हूं कि एक सार्वजनिक क्षेत्र गलत है, हालांकि एक सार्वजनिक संपत्ति उपयोगी हो सकती है। उस संपत्ति का उपयोग उस समय की विशिष्ट आवश्यकता के आधार पर डेटा की सेटिंग या वापसी से संबंधित सत्यापन या घटनाओं के लिए एक स्थान प्रदान करने के लिए किया जा सकता है। गेटर्स और सेटर्स स्वयं गलत-से-नहीं हैं। कैसे और कब उनका उपयोग किया जाता है या दूसरी तरफ दुर्व्यवहार किया जाता है, यह परिस्थितियों के आधार पर डिजाइन और स्थिरता के संदर्भ में खराब देखा जा सकता है। :)
S.Robins

@ S.Robins OOP और मॉडलिंग की मूल बातें के बारे में सोचो; वस्तुओं को वास्तविक जीवन की संस्थाओं की नकल करना चाहिए। क्या वास्तविक जीवन की संस्थाएं हैं जिनके पास इस प्रकार के संचालन / गुण हैं जैसे गेटर्स / सेटर?
m3th0dman

यहाँ बहुत सारी टिप्पणियाँ होने से बचने के लिए, मैं इस बातचीत को इस बातचीत में ले जाऊँगा और वहाँ आपकी टिप्पणी को संबोधित करूँगा ।
S.Robins
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.