वापसी इंटरफ़ेस या वर्ग


9

मान लीजिए मेरे पास एक तरीका है

public List<User> GetBatchOfUsers(IEnumerable<int> userIDs)
{
    List<User> users = new List<User>();

    // some database stuff

    return users;
}

मैंने पढ़ा है कि यह बेहतर होगा एक इंटरफेस (या तो वापस जाने के लिए IListया IEnumerable) के रूप में एक लौटने के लिए विरोध किया List। ऐसा करने के लिए मैंने जो कुछ तर्क सुने हैं वह यह है कि यह डेटा छुपाता है, और एपीआई डेवलपर को बाद की तारीख में डेटा के आंतरिक प्रतिनिधित्व को बदलने की सुविधा देता है।

बस वापस लौटने के बारे में मेरी चिंता IEnumerableयह है कि आप कार्यक्षमता खो देते हैं, जैसे कि यादृच्छिक पहुंच और Countसंपत्ति।

मुझे पता है कि IEnumerableएक पैरामीटर के रूप में स्वीकार करना समझ में आता है, क्योंकि यह उपभोक्ता को मेरी विधि में डेटा भेजने के लिए सबसे अच्छा लचीलापन देता है, विधि को संचालित करने के लिए आवश्यकताओं का न्यूनतम सेट।

वापसी प्रकार के लिए सबसे अच्छा अभ्यास क्या है?


5
अधिक महत्वपूर्ण: एक इंटरफ़ेस को पैरामीटर प्रकार के रूप में लें।
माइकल बॉर्गवर्ड

जवाबों:


10

आमतौर पर, आप इंटरफेस के साथ शुरू कर सकते हैं, और केवल ठोस प्रकार को रिटर्न प्रकार के रूप में रखने के लिए आगे बढ़ सकते हैं यदि आप पाते हैं कि आप अपेक्षा से अधिक बार अतिरिक्त तरीकों का उपयोग करते हैं।

ठीक है, यदि आप एक इंटरफ़ेस वापस करते हैं, तो आप अधिक लचीलापन बनाए रखते हैं। आप बाद में एक अलग ठोस प्रकार को वापस करने के लिए कार्यान्वयन को बदल सकते हैं। दूसरी ओर, यह स्पष्ट रूप से फोन करने वाले को कम जानकारी देता है, इसलिए वे कुछ संचालन करने में सक्षम नहीं हो सकते हैं। (उदाहरण के लिए: यदि आप वापस लौटते हैं List<T>, तो कॉलर ConvertAll आदि का उपयोग कर सकता है ... जो वे नहीं कर सकते यदि आप केवल यह घोषणा करते हैं कि आप वापस लौट आएंगे IList<T>।) कुछ स्थितियों में यह ठोस प्रकार को निर्दिष्ट करने के लायक है।

काउंट या सॉर्ट विधि के बारे में, उसके लिए कोई मानक संग्रह इंटरफेस नहीं है। हालाँकि, आप किसी भी IList को सॉर्ट या काउंट करने के लिए एक विस्तार विधि लिख सकते हैं।


मुझे लगता है कि यह वास्तव में एक कठिन नियम नहीं है?
मैथ्यू

हाँ, यह वास्तव में उपयोग पर निर्भर करता है।
युसुबोव

1

यदि आपको अपने संग्रह की आवश्यकता है तो Countआप उपयोग कर सकते हैं ICollection<T>, जो सामान्य है।


-1। गिनती पहले से ही चर्चा में थी और यह उत्तर कुछ भी नया नहीं कहता है
सुपरएम

@ कोनराड रूडोल्फ, यह एक जवाब नहीं है, इसकी टिप्पणी है।
सुपर एमएम

@superM यह अपने स्वयं के उत्तर देने के लिए पर्याप्त मूल्यवान है, मुझे लगता है, क्योंकि यह स्पष्ट रूप से पहली जगह में इंटरफेस के खिलाफ निर्णय लेने के लिए ओपी के कारण को संबोधित करता है।
कोनराड रुडोल्फ

1

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


1

उदाहरण विधि के लिए विशिष्ट: आप सही हैं कि लौटने IEnmuerable<T>का मतलब होगा कि आप Countऔर कार्यक्षमता को खो देंगे (हालांकि आप LINQ विधियों का उपयोग कर सकते हैं Count()और ElementAt(), जो कुशलतापूर्वक लागू किए जाते हैं यदि वे जिस प्रकार वास्तव में लागू होते हैं IList<T>)।

यदि आप लौट आए IList<T>, तो आप कुछ कार्यक्षमता खो देंगे, लेकिन सामान्यता में लाभ शायद इसके लायक है।

लेकिन इससे भी बेहतर कुछ IEnumerable<T>और के बीच होगा IList<T>, क्योंकि यह सबसे अधिक संभावना है कि उपभोक्ता को लौटे संग्रह को म्यूट करने के लिए समझ में नहीं आता है, लेकिन यह उसके लिए उपयोग Countया अनुक्रमण करने के लिए समझ में नहीं आता है ।

.Net 4.5 में, इस तरह का इंटरफ़ेस है IReadOnlyList<T>:।


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