2009-09-19 12 views
8

मैंने हाल ही में देखा है कि जब मैं निजी विधियों को बनाता हूं जो उन वस्तुओं में कुछ फ़ील्ड सेट करते हैं जो उन्हें पास कर देते हैं कि रिशेर्पर एक संकेत देता है कि विधि को स्थैतिक बनाया जा सकता है।क्या मेरे निजी विधि को एक अच्छी सिफारिश स्थिर करने के लिए Resharper की सिफारिश है?

यहां मेरे तरीके की विधि का एक बहुत ही सरल उदाहरण है।

private void MakeStatusTheSame(MyClass mc, MySecondClass msc) 
{ 
    mc.Status = msc.Status; 
} 

जब मुझे इस तरह की विधि मिलती है, तो Resharper एक सिफारिश प्रदान करता है कि विधि को स्थिर बनाया जा सकता है।

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

क्या रिशेर्पर की सिफारिश एक वैध सर्वोत्तम अभ्यास है या क्या मुझे इसे बंद करना चाहिए?

+2

सार्वजनिक विधियां पूरी तरह से टेस्ट करने योग्य हैं, * यदि वे दुष्प्रभाव नहीं देते हैं। * –

उत्तर

11

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

यहाँ से किसी एक उदाहरण नहीं बदल रहा है है:

public static class Extensions 
{ 
    public static MyClass MakeStatusTheSame(this MyClass mc, MySecondClass msc) 
    { 
    mc.status = msc.status 
    return mc; /* make the method chainable */ 
    } 
} 
:

class MyClass 
{ 
    public static void MakeStatusTheSame(MyClass mc, MySecondClass msc) 
    { 
    mc.status = msc.status; 
    } 

    private void MakeStatusTheSame(MySecondClass msc) 
    { 
    this.status = msc.status; 
    } 

    private int status; 
} 

इसके अलावा, आप यह एक विस्तार विधि (जो भी स्थिर हो जाएगा) कर सकता है

7

मुझे ऐसा लगता है; यह देखते हुए कि एक विधि स्थैतिक है एक स्पष्ट संकेत है कि विधि किसी भी इंस्टेंस सदस्यों के साथ बातचीत करनी चाहिए।

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

+2

+1 यह स्पष्ट करने के लिए कि विधि उदाहरण सदस्यों के साथ बातचीत नहीं करनी चाहिए। मैं निश्चित रूप से लोगों को उदाहरण कोड पर विधियों के लिए कॉल के साथ उस विशेष कोड को संशोधित करने से पहले दो बार सोचना चाहता हूं। निजी विधि स्थैतिक को चिह्नित करके यदि किसी ने किसी उदाहरण सदस्य का उपयोग करने के लिए कोड को संशोधित किया है तो उन्हें एक संकलन चेतावनी मिल जाएगी जो कम से कम उन्हें कुछ सेकंड के लिए सोचने चाहिए। – mezoid

+0

मेरे पास आर # कुछ मिनट पहले एक विधि स्थिर बनाने की सिफारिश की गई थी, केवल एक उदाहरण फ़ील्ड तक पहुंचने का प्रयास कर संकलन त्रुटि खोजने के लिए। पहली बार ऐसा हुआ कि यह हुआ है, कुछ इसे उलझन में होना चाहिए। – ProfK

+0

बातचीत करके आपका क्या मतलब है? मूल्यों को संशोधित करना? या इसमें पढ़ने के मूल्य शामिल हैं? – guiomie

4

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

8

एक विरोधाभासी की तरह लगने के जोखिम पर, मुझे यह मानना ​​है कि मुझे आवृत्ति विधियों के साथ मिश्रित स्थिर तरीकों को पसंद नहीं है; और मैं सामान्य रूप से स्थैतिक तरीकों से नापसंद करता हूं। स्टेटिक विधियों का परीक्षण करना मुश्किल है, ओवरराइड करना मुश्किल है, और बनाए रखना मुश्किल है। मैं Foo ऑब्जेक्ट्स से एक FooUtils क्लास में या फिर बेहतर है, FooSomethingDoer क्लास के सिंगलटन उदाहरण में Foo ऑब्जेक्ट्स से निपटने के लिए सभी स्थिर तरीकों को छूना पसंद करता हूं।

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

+0

मैं तुम्हारे साथ हूँ। मैं केवल विधियों को स्थिर करता हूं जब यह समझ में आता है, न सिर्फ इसलिए कि मैं "कर सकता हूं"। – Josh

+1

मैं सार्वजनिक, संरक्षित और आंतरिक के लिए सहमत हूं - लेकिन निजी तरीकों के लिए नहीं। यदि कक्षाएं कोड गंध हैं तो नेट पर कुछ चर्चा है; मैं उन्हें देखभाल के साथ उपयोग करने का सुझाव देना चाहूंगा। – TrueWill

+0

सहमत हुए। एक विधि स्थैतिक बनाना उस विधि के उपयोग से संबंधित जानकारी को संवाद करने का प्रयास है। सबकुछ स्थिर बनाना सिर्फ कोई समझ नहीं आता है। –

संबंधित मुद्दे