C # में निजी स्थैतिक विधियाँ कुछ भी आहत करती हैं?


10

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


10
स्थैतिक विधियों के साथ "ज्ञात समस्याएं" क्या हैं?
रॉबर्ट हार्वे

3
@ एड: राइट। ठीक से लिखे गए स्थिर तरीकों को बाहरी एपीआई या राज्य को वैसे भी स्पर्श नहीं करना चाहिए। एक वर्ग के भीतर व्याप्त आंतरिक स्थिति में हेरफेर करना मेरे लिए पूरी तरह से ठीक लगता है, और इकाई परीक्षण के लिए विधि की आवश्यकता नहीं होती है, क्योंकि इकाई परीक्षण कक्षा के बाहरी व्यवहार का परीक्षण करता है।
रॉबर्ट हार्वे

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

2
@ तमसा स्टेटिक विधियां केवल वैश्विक स्थिति को संशोधित करती हैं यदि आप उन्हें उस तरह से लिखते हैं, जो मैं कभी नहीं करता। आमतौर पर, मैं केवल उपयोगिता वर्गों में स्थिर विधियों का उपयोग करता हूं, ऐसे तरीके जो एक या अधिक ऑब्जेक्ट लेते हैं और साइड इफेक्ट्स के बिना किसी ऑब्जेक्ट को वापस करते हैं। इस प्रकार की विधियों में आपके द्वारा वर्णित समस्याओं में से कोई भी नहीं है।
रॉबर्ट हार्वे

1
@ TamásSzelei कैसे वे वैश्विक राज्य को संशोधित करने के लिए प्रवण हैं? जब तक आप इसे एक पैरामीटर में पारित नहीं करते, तब तक वे वैश्विक स्थिति का पता नहीं लगा सकते।
कोडइन्चोस

जवाबों:


16

मुझे लगता है: "क्या मुझे यह परीक्षण करने की आवश्यकता है?"

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

तो, मेरी राय में: नहीं, "निजी" विधि "निजी स्थिर" बनाने से कोई दीर्घकालिक आक्षेप नहीं होगा।


17

मेरे दृष्टिकोण से निजी स्थिर विधियां सबसे आसान संभव हैं।

DataIn -> विधि -> DataOut

बाहरी वस्तुओं पर कोई निर्भरता नहीं है, कोई दुष्प्रभाव नहीं है। आप उन्हें बुरा क्यों मानते हैं?


धन्यवाद। मैंने सवाल के तहत टिप्पणियों में अपनी चिंताओं को समझाया।
तामसी सजेलेई

2
आप जो वर्णन करते हैं वह केवल स्थैतिक तरीकों के लिए ही सही है, जो स्थिर सदस्य चर पर निर्भर नहीं करता है - यही वह है जो "अच्छे" और "बुरे" स्थिर तरीके के बीच अंतर कर सकता है।
डॉक ब्राउन

2

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

हालाँकि, मैं निजी स्थैतिक विधियों का उपयोग नहीं करने का कोई कारण नहीं देख सकता। वास्तव में, एक मामूली प्रदर्शन लाभ है, क्योंकि आपको मेमोरी पर कब्जा करने के लिए कक्षा के उदाहरण की आवश्यकता नहीं है।

दूसरी ओर कुछ भी स्थिर एक कोड गंध का एक सा है। क्या यह वास्तव में एक "सहायक वर्ग" है? क्या ऐसा हो सकता है कि विधि एक पैरामीटर के रूप में पारित वर्गों में से किसी एक पर अधिक उपयोगी हो सकती है? उन सवालों का जवाब अक्सर "स्थिर के रूप में ठीक है" लेकिन यह याद रखने योग्य है।


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