2010-08-30 10 views
5

मुझे कुछ फ़ंक्शंस के साथ एक कक्षा मिली है जो वास्तव में केवल 'सहायक' विधियां हैं जो क्लाइंट कोड अन्य सार्वजनिक एक्सेसर गुणों/विधियों के साथ स्वयं ही कर सकता है, और मुझे इस बात की अनिश्चितता है कि मुझे इन्हें गेटटर के साथ गुणों के रूप में परिभाषित करना चाहिए या नहीं , उदाहरण विधियां, या स्थैतिक विधियां जो पैरामीटर के रूप में उदाहरण लेती हैं। इसके अलावा, मुझे कक्षा से निकाला गया एक इंटरफ़ेस भी मिला है जिसका उपयोग निर्माण के अलावा कहीं भी कहीं भी किया जाता है, ताकि मेरे कोड को इंटरफ़ेस के विरुद्ध लागू किसी भी वर्ग का उपयोग करने की अनुमति मिल सके।सी # में सहायक तरीके: स्टेटिक या गैर स्थैतिक?

सवाल यह है कि, जो एक डिजाइन बिंदु से सर्वोत्तम है? उदाहरण के लिए, इस वर्ग से प्रारंभिक होने का एक साधन के रूप:,

class Person : IPerson { 
    private string name; 

    public string Name { get { return this.name; } } 

    // Property with getter 
    public string Initial { get { return this.name.Substring(0,1); } } 

    // Instance method 
    public string GetInitial { return this.name.Substring(0,1); } 

    // Static method 
    public static string GetInitial(IPerson person) { 
    return person.Name.Substring(0,1); 
    } 
} 

संपत्ति छोटे, अधिक पठनीय ग्राहक कोड के लिए खुद को उधार देता है, लेकिन अपने स्वयं के कार्यान्वयन लिखने के IPerson के खिलाफ लागू करने की आवश्यकता होगी किसी को भी उदाहरण होगा के रूप में तरीका।

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

क्या यह सिर्फ नीचे आ गया है कि कक्षाओं को कार्यान्वित करने की अनुमति देना अच्छा नहीं है कि कैसे सहायक तरीके की गणना की जाती है?

संपादित करें: मामूली तरफ, तो मुझे सबसे अच्छा अभ्यास टैग क्यों नहीं जोड़ेगा?

+0

ऐसा लगता है कि अभी तक कोई सर्वोत्तम अभ्यास टैग नहीं है। नए टैग बनाने के लिए आपको कम से कम 1500 प्रतिष्ठा की आवश्यकता है। – M4N

+0

यह अजीब है .. निश्चित रूप से था, मैंने इसे अतीत में उपयोग किया है। – Flynn1179

+2

मेटा टैग की मौत (जैसे सर्वोत्तम प्रथाओं): http://blog.stackoverflow.com/2010/08/the-death-of-meta-tags/ – M4N

उत्तर

10

एक विस्तार विधि के बारे में कैसे? वारिस या कोड को फिर से लिखने के बिना

string initial = person.Initial(); 

इस तरह, आप कार्यान्वयन साझा कर सकते हैं:

namespace IPersonExtensions 
{ 
    public static class IPersonExtensionClass 
    { 
     public static string Initial(this IPerson @this) 
     { 
      return @this.name.Substring(0, 1); 
     } 
    } 
} 

इस तरह यह प्रयोग करें। अलग नामस्थान का उपयोग करना उपयोगकर्ताओं के लिए यह चुनना संभव बनाता है कि वे इस कोड का उपयोग करना चाहते हैं या नहीं।

+0

उस बारे में नहीं सोचा था .. हालांकि मुझे लगता है कि उस विधि को शायद एक स्ट्रिंग वापस करनी चाहिए :) – Flynn1179

+3

ऐसा लगता है कि फ्लिन इस कक्षा को खरोंच से बना रहा है। यदि ऐसा है, तो आपके पास स्रोत कोड तक पहुंच के रूप में एक एक्सटेंशन विधि का उपयोग नहीं किया जाना चाहिए। जब आप बेस क्लास को संशोधित या विस्तारित नहीं कर सकते हैं तो एक्सटेंशन विधियों का उपयोग किया जाना चाहिए। एमएसडीएन जनरल गाइडलाइन http://msdn.microsoft.com/en-us/library/bb383977.aspx "आम तौर पर, हम अनुशंसा करते हैं कि आप एक्सटेंशन विधियों को कम से कम लागू करें और केवल जब आपको करना होगा। जब भी संभव हो, क्लाइंट कोड जो एक को विस्तारित करना चाहिए मौजूदा प्रकार से व्युत्पन्न एक नया प्रकार बनाकर मौजूदा प्रकार को ऐसा करना चाहिए। " – sgriffinusa

+0

@Flynn: जब आप अपनी टिप्पणी लिख रहे थे तो मैंने इसे ठीक कर दिया होगा। :) –

1

मैं आगे और आगे जाता हूं, लेकिन मैं उन्हें गैर स्थिर बनाने की दिशा में झुकाव शुरू कर रहा हूं।

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

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

एक तरफ (और एक चरम उदाहरण) के रूप में, मेरे कुछ एक्सटेंशन एक ठोस वर्ग का पता लगाने के लिए एक आईओसी कंटेनर का उपयोग करते हैं और कॉल करते हैं इसके सदस्य

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