डेटा एक्सेस लेयर: एक्सपोज़िंग सूची <>: बुरा विचार?

मैं वर्तमान में एक साधारण डेटा एक्सेस लेयर कोडिंग कर रहा हूं, और मैं सोच रहा था कि मुझे किस प्रकार के अन्य परतों पर खुलासा करना चाहिए।

I am going to internally implement the Data as a List<>, but I remember reading something about not exposing the List type to the consumers if not needed.

public List GetAllUsers()//non C# users: that means List of User :)

क्या आप जानते हैं क्यों (गूगल मदद नहीं करता)? आप आमतौर पर उस तरह के सामान के लिए क्या खुलासा करते हैं? IList? IEnumerable?

3

3 उत्तर

Usually it's best to expose the least powerful interface that the user can still meaningfully work with. If the user just needs some enumerable data, return IEnumerable. If that's not enough because the user needs to be able to modify the list (attention! shouldn't often be the case), return an IList.

/ संपादित करें:

जोएल अपनी टिप्पणी में एक वैध सवाल पूछता है: उपयोगकर्ता को अधिकतम शक्ति प्रदान करने के बजाय वास्तव में कम से कम शक्तिशाली इंटरफ़ेस का खुलासा क्यों करें? (दूसरे शब्दों में बयान)

इसके पीछे विचार यह है कि डेटा को वापस करने की विधि उपयोगकर्ता को इसकी सामग्री को संशोधित करने की अपेक्षा नहीं कर सकती है: क्लास की एक अन्य विधि अभी भी सूची के संदर्भ के बाद सूची को खाली होने की उम्मीद कर सकती है। कल्पना करें कि उपयोगकर्ता सूची से सभी डेटा हटा देता है। दूसरी विधि को अब एक अतिरिक्त जांच करनी है कि ग्यारह अनावश्यक हो सकता है।

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

उदाहरण के तौर पर, कल्पना करें कि एक कुशल कार्यान्वयन एक शब्दकोश का उपयोग करता है और केवल मान संग्रह देता है जो IList को लागू नहीं करता है।

6
जोड़ा
साथ ही, जब आप कैली पक्ष पर इसे नियंत्रित करना चाहते हैं, तो आपके पास ReadOnlyCollection को वापस करने का विकल्प होता है।
जोड़ा लेखक CVertex, स्रोत
मैंने अभी तक 'कम से कम शक्तिशाली' विचार में खरीदा नहीं है; कोड के प्रत्येक ब्लॉक को यथासंभव उपयोगी बनाने के बारे में क्या?
जोड़ा लेखक Joel Coehoorn, स्रोत

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

3
जोड़ा

IENumerable लौटने से पहले आपको ध्यान से सोचना चाहिए। यदि अंतर्निहित कोड IENumerable उत्पन्न करने के लिए "उपज" का उपयोग कर रहा है, या LINQ का उपयोग कर रहा है, तो आप किसी भी संसाधन का उपयोग करके खुले रहेंगे।

इसे वापस करने से पहले आपको IENumerable को किसी अन्य IENumerable में कॉपी करना चाहिए। IList का उपयोग करके, आप इसे एक आवश्यकता बनाते हैं, ताकि कोई भी अनजाने में एक आईनेमरेबल वापस न कर सके।

दूसरी ओर, एक आईएलआईस्ट लौटने से कॉलर का तात्पर्य होता है कि वे लौटाई गई सूची बदल सकते हैं।

2
जोड़ा
अच्छी बात। शायद आप पूर्णता के लिए ऐसे मामले को चित्रित करने वाला एक उदाहरण जोड़ सकते हैं।
जोड़ा लेखक Konrad Rudolph, स्रोत