जब एक तर्क का उपयोग करने के लिए चर बनाम विधि के लिए एक तर्क गुजर रहा है


93

आप एक विधि के लिए तर्कों को पारित करने के बीच कैसे तय करते हैं बनाम उन्हें ऑब्जेक्ट ऑब्जेक्ट चर के रूप में घोषित करते हैं जो ऑब्जेक्ट के सभी तरीकों को दिखाई देते हैं?

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


1
यदि आपके पास विशिष्ट उदाहरण हैं, तो आपको सीधे सीधे उपयोगी उत्तर मिल सकते हैं
brabster

जवाबों:


55

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

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

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

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

जब एक कक्षा के आसपास डेटा पास करने की बात आती है, तो यह कहना मुश्किल है कि आप क्या कर रहे हैं कुछ कोड को देखे बिना अच्छा अभ्यास है। कभी-कभी, उदाहरण डेटा पर सीधे संचालन ठीक है; दूसरी बार, यह नहीं है। मेरी राय में, यह कुछ ऐसा है जो अनुभव के साथ आता है - आप कुछ अंतर्ज्ञान विकसित करेंगे क्योंकि आपकी वस्तु उन्मुख सोच कौशल में सुधार होगा।


मेरा उत्तर इस उत्तर को H-Man2 उत्तर (जीवनकाल) में जोड़ देगा। यह एक सदस्य विशेषता होना चाहिए अगर और केवल अगर यह वस्तु की एक स्थायी स्थिति है। यही है, मूल्य मौजूदा विधि स्टैक के दायरे के बाहर खुद से समझ में आता है।
डेविड रॉड्रिग्ज - 10

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

@ DavidRodríguez-dribeas आपको विधि स्टैक से क्या मतलब है?
committedandroider

@committedandroider: यदि मान वर्तमान फ़ंक्शन कॉल को
रेखांकित

46

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

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


21

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

यहाँ एक उदाहरण है:

myCircle = myDrawing.drawCircle(center, radius);

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

दूसरी ओर, myCircle वर्ग को केंद्र और त्रिज्या दोनों को उदाहरण चर के रूप में संग्रहीत करने की आवश्यकता होगी।

myCircle.move(newCenter);
myCircle.resize(newRadius);

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

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

और सब कुछ सार्वजनिक करने के रूप में। यह पल में आपके जीवन को आसान बना सकता है। लेकिन यह आपको परेशान करने के लिए वापस आ जाएगा। कीट न करें।


हालांकि आप मापदंडों (पुरानेकेंटर, न्यूकेंटर) का उपयोग करने के लिए कदम को परिभाषित कर सकते हैं।
obesechicken13

4

IMHO:

यदि चर उदाहरण की स्थिति का हिस्सा है, तो यह एक उदाहरण चर होना चाहिए - क्लासस्टैंड एचएएस-ए इंस्टेंटेबल।

अगर मैंने अपने आप को किसी उदाहरण के तरीकों में बार-बार गुजरते हुए पाया, या मैंने पाया कि मेरे पास बड़ी संख्या में ऐसे उदाहरण चर हैं जिन्हें मैं शायद कोशिश करूंगा और अपने डिजाइन को देखूंगा कि मैं कुछ चूक गया या कहीं न कहीं एक बुरा अमूर्त बना।

आशा करता हूँ की ये काम करेगा


3

बेशक, सार्वजनिक चर की एक बड़ी सूची को कक्षा में रखना आसान है। लेकिन सहज रूप से, आप बता सकते हैं कि यह रास्ता नहीं है।

इससे पहले कि आप इसका उपयोग करने जा रहे हैं, प्रत्येक चर को ठीक से परिभाषित करें। यदि एक चर एक विशिष्ट विधि के कार्य का समर्थन करता है, तो इसका उपयोग केवल विधि के दायरे में करें।

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

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

यह सामान्य ज्ञान को उबालता है। बिल्कुल सोचें कि आप प्रत्येक नए चर को कहां और क्यों घोषित कर रहे हैं, यह क्या होना चाहिए और वहां से यह निर्णय लेना चाहिए कि इसे किस दायरे में रहना चाहिए।


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