कक्षा के सदस्यों या आंतरिक तरीकों के बीच तर्क पारित करना पसंद करते हैं?


39

मान लीजिए कि एक वर्ग के निजी हिस्से के भीतर एक मूल्य है जो कई निजी तरीकों द्वारा उपयोग किया जाता है। क्या लोग इसे कक्षा के लिए एक सदस्य चर के रूप में परिभाषित करना पसंद करते हैं या इसे प्रत्येक विधि के तर्क के रूप में पारित कर रहे हैं - और क्यों?

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

संपादित करें:

कुछ टिप्पणियों / प्रश्नों को स्पष्ट करने के लिए, मैं स्थिरांक के बारे में बात नहीं कर रहा हूं और यह किसी विशेष मामले से संबंधित नहीं है, बल्कि केवल एक काल्पनिक है जिसके बारे में मैं कुछ अन्य लोगों से बात कर रहा था।

एक पल के लिए ओओपी कोण को अनदेखा करना, विशेष उपयोग का मामला जो मेरे मन में था वह निम्नलिखित था (केवल छद्मकोड क्लीनर बनाने के लिए संदर्भ द्वारा मान लें)

int x
doSomething(x)
doAnotherThing(x)
doYetAnotherThing(x)
doSomethingElse(x)

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


1
इस मूल्य का उपयोग कैसे किया जाता है? यह स्थिर है? क्या यह बदलता है? क्या यह संकलन के बीच परिवर्तन के अधीन है?
ऊदबिलाव

जब चीजें स्वचालित रूप से सभी समान होने का निर्धारण करती हैं, तो यह सोचना आसान है कि यह कोई फर्क नहीं पड़ता। क्या होगा अगर आपके पास एक फ़ंक्शन था जिसे एक्स -1 की तरह एक समायोजित (एक्स) मूल्य की आवश्यकता थी?
जेएफओ

जवाबों:


15

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

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


1
मैं सहमत हूं - कक्षा का मूल डिज़ाइन / उद्देश्य आपको यह बताना चाहिए कि क्या यह एक सदस्य चर या तर्क होना चाहिए। इसके अलावा निर्भरता इंजेक्शन कोण के बारे में सोचने लायक।
मार्टिज्न वर्बर्ग

14

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

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


10

सवाल पूछने के लिए धन्यवाद, मैं यह भी पूछना चाहता था।

जब मैं इस बारे में सोच रहा था, तो इसे तर्क के रूप में पारित करने के कुछ फायदे हैं

  • परीक्षण करना आसान है -> बनाए रखने में आसान (अंतिम बिंदु से संबंधित)
  • कोई साइड इफेक्ट नहीं है
  • इसे समझना आसान है

मैं स्पष्ट रूप से आपकी बात को उदाहरण के लिए देखता हूं - एक एक्सेल डॉक्यूमेंट (उदाहरण के लिए POI लाइब्रेरी का उपयोग करके) पार्स कर रहा है और उस पंक्ति के साथ काम करने के लिए हर पंक्ति को पास करने के बजाय, लेखक के पास सदस्य चर है currentRowऔर इसके साथ काम करता है।

मैं कहूंगा कि इस प्रतिमान के लिए एक नाम होना चाहिए, क्या यह है? ( यहां सूचीबद्ध नहीं है )


आप किस एंटी-पैटर्न से मतलब रखते हैं?
वाहिद ग़दिरी

संक्षेप में, सदस्य चर को केवल दो (या अधिक) फ़ंक्शन कॉल के बीच पैरामीटर साझा करने के लिए है ...
बेटलिस्टा

1

शायद आपको उस मूल्य को साझा करने वाले सभी तरीकों से युक्त एक नया वर्ग निकालना चाहिए। निश्चित रूप से उच्चतम-स्तरीय पद्धति नए वर्ग में सार्वजनिक होगी। परीक्षण के लिए उस विधि को उजागर करना सहायक हो सकता है।

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


1

क्या लोग इसे कक्षा के लिए एक सदस्य चर के रूप में परिभाषित करना पसंद करते हैं या इसे प्रत्येक विधि के तर्क के रूप में पारित कर रहे हैं - और क्यों?

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

एक तरफ मैं एक तर्क देखा जा सकता है कि एक वर्ग में राज्य (यानी सदस्य चर) को कम करना आम तौर पर एक अच्छी बात है ...

private static finalस्थिरांक को परिभाषित करने की घोषणा के साथ कुछ भी गलत नहीं है । कंपाइलर कुछ अनुकूलन पर विचार करने में मूल्य का उपयोग करने में सक्षम होगा, और स्थिरांक होने के कारण, वे वास्तव में कक्षा में राज्य नहीं जोड़ते हैं।

यद्यपि यदि एक ही मूल्य को बार-बार एक वर्ग के तरीकों में इस्तेमाल किया जा रहा है ...

प्रतीकात्मक रूप से (उदाहरण के लिए BLRFL_DURATION) को संदर्भित करने में सक्षम होने और अपने तरीकों में अतिरिक्त तर्क जोड़ने के लिए आपके कोड को अधिक पठनीय और इसलिए अधिक बनाए रखने योग्य होगा।


0

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

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