c# - विधि स्थिर बना दिया जा सकता है, लेकिन यह चाहिए?




.net refactoring (9)

Resharper प्रति एएसपीनेट पेज के कई कार्यों को इंगित करना पसंद करता है जिसे स्थैतिक बनाया जा सकता है। क्या यह मेरी मदद करता है अगर मैं उन्हें स्थिर बना देता हूं? क्या मुझे उन्हें स्थिर बनाना चाहिए और उन्हें उपयोगिता वर्ग में ले जाना चाहिए?


ReSharper तर्क की जांच नहीं करता है। यह केवल जांच करता है कि विधि उदाहरण सदस्यों का उपयोग करती है या नहीं। यदि विधि निजी है और केवल (केवल एक ही) उदाहरण विधियों द्वारा बुलाया जाता है तो यह एक उदाहरण विधि देने के लिए एक संकेत है।


आपको किसी दिए गए परिदृश्य में सबसे अधिक पढ़ने योग्य और सहज ज्ञान युक्त करना चाहिए।

निष्पादन तर्क सबसे चरम स्थितियों को छोड़कर एक अच्छा नहीं है क्योंकि वास्तव में केवल एक चीज हो रही है कि एक अतिरिक्त पैरामीटर ( this ) उदाहरण विधियों के लिए ढेर पर धकेल रहा है।


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

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


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

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


बस मेरी tuppence: एक उपयोगिता वर्ग में सभी साझा स्थैतिक तरीकों को जोड़ने से आप जोड़ सकते हैं

using static className; 

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

मुझे नहीं पता कि यह अच्छा अभ्यास है या नहीं। मुझे सी # 4/5 के बारे में जानने के लिए बहुत कुछ है और इतने सारे विरासत कोड को रिफैक्टर करने के लिए कि मैं बस Roselyn युक्तियों को मुझे मार्गदर्शन करने की कोशिश कर रहा हूं।

एक छोटा सा सिक्का


मुझे यकीन है कि यह आपके मामले में नहीं हो रहा है, लेकिन मैंने कुछ कोड में एक "खराब गंध" देखी है जिसे मुझे कई स्थैतिक तरीकों का उपयोग करने के लिए पीड़ित होना पड़ा है।

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

हालांकि, स्थैतिक विधियां काफी उपयोगी होती हैं जब वे डोमेन-तर्क को कारक बनाती हैं जो वास्तव में वस्तु के उदाहरण की स्थिति पर निर्भर नहीं होती है। वे आपके कोड को और अधिक पठनीय बना सकते हैं।

बस सुनिश्चित करें कि आप उन्हें सही जगह पर डाल रहे हैं। क्या स्थिर तरीके अन्य वस्तुओं की आंतरिक स्थिति को घुसपैठ कर रही हैं? क्या एक अच्छा मामला बन सकता है कि उनका व्यवहार इसके बजाय उन वर्गों में से एक से संबंधित है? यदि आप चिंताओं को सही तरीके से अलग नहीं कर रहे हैं, तो आप बाद में सिरदर्द में हो सकते हैं।


यह दिलचस्प पढ़ा है:

http://thecuttingledge.com/?p=57

ReSharper वास्तव में सुझाव नहीं दे रहा है कि आप अपनी विधि स्थिर बनाते हैं। आपको खुद से पूछना चाहिए कि उस वर्ग में उस पद्धति का विरोध क्यों किया गया है, कहता है, कक्षाओं में से एक जो इसके हस्ताक्षर में दिखाया गया है ...

लेकिन यहां रेफरपर डॉक्यूमेंटेशन कहता है: http://confluence.jetbrains.net/display/ReSharper/Member+can+be+made+static


यह नामस्थान प्रदूषण को नियंत्रित करने में मदद करता है।


इंस्टेंट विधियों बनाम स्टेटिक विधियां
10.2.5 सी # भाषा विशिष्टता के स्टेटिक और इंस्टेंस सदस्य अंतर बताते हैं। आम तौर पर, स्थिर विधियां उदाहरण विधियों पर बहुत कम प्रदर्शन वृद्धि प्रदान कर सकती हैं, लेकिन केवल कुछ चरम स्थितियों में ( इस पर कुछ और विवरणों के लिए यह उत्तर देखें)।

FxCop या कोड विश्लेषण में नियम CA1822 कहता है:

"[सदस्यों को स्थैतिक के रूप में चिह्नित करने के बाद], कंपाइलर इन सदस्यों को गैर वर्चुअल कॉल साइट्स उत्सर्जित करेगा जो प्रत्येक कॉल के लिए रनटाइम पर चेक को रोक देगा जो वर्तमान ऑब्जेक्ट पॉइंटर को गैर-शून्य सुनिश्चित करता है। इसके परिणामस्वरूप एक मापनीय प्रदर्शन लाभ हो सकता है प्रदर्शन-संवेदनशील कोड के लिए। कुछ मामलों में, वर्तमान ऑब्जेक्ट इंस्टेंस तक पहुंचने में विफलता एक शुद्धता समस्या का प्रतिनिधित्व करती है। "

उपयोगिता कक्षा
आपको उन्हें एक उपयोगिता वर्ग में नहीं ले जाना चाहिए जब तक कि यह आपके डिजाइन में समझ में न हो। यदि स्थैतिक विधि किसी विशेष प्रकार से संबंधित है, जैसे ToRadians(double degrees) विधि कोणों का प्रतिनिधित्व करने वाली कक्षा से संबंधित है, तो उस विधि के उस स्थिर सदस्य के रूप में मौजूद होने के लिए यह विधि ToRadians(double degrees) (नोट, यह एक संक्षिप्त उदाहरण है प्रदर्शन के प्रयोजन)।





static-methods