अपेक्षित व्यवहार जब संग्रह के लिए अनुरोध में शून्य आइटम होंगे


13

मान लीजिए कि आपको निम्नलिखित दिए गए हैं ...

List<Thing> theThings = fubar.Things.All();

अगर लौटने के लिए कुछ भी नहीं थे, तो आप क्या उम्मीद करेंगे।

संपादित करें: राय के लिए धन्यवाद। मैं थोड़ा इंतजार करूंगा और सबसे अधिक अप के साथ प्रवेश स्वीकार करूंगा।

मैं अब तक की प्रतिक्रियाओं से सहमत हूँ, विशेष रूप से एक खाली संग्रह का सुझाव देने वाले। एक विक्रेता ने ऊपर दिए गए उदाहरण के समान कई कॉल के साथ एक एपीआई प्रदान किया। एक विक्रेता जिन्होंने पिछले साल अपने एपीआई (बी) के माध्यम से राजस्व में $ 4.6 मिलियन किया था, बीटीडब्ल्यू। वे कुछ ऐसा करते हैं जो मैं मौलिक रूप से असहमत हूं - वे एक अपवाद फेंकते हैं।


एक बहुत ही ठोस सहमति [यहाँ] [1] लगता है: खाली संग्रह। हमेशा। [१]: stackoverflow.com/questions/1969993/…
जेसी सी। स्लाइसर

इसके लिए डेटाटाइप क्या है Things? यदि यह Thingsफ़ील्ड रिटर्न शून्य होने के लिए समझ में आता है , तो यह आपके लिए एक अपवाद प्राप्त करने के लिए समझ में आता है क्योंकि आपने कॉल करने से पहले नल के लिए जांच नहीं की थी All()। हालांकि, मैं उन लोगों से सहमत हूं जो सोचते हैं कि fubar.Thingsअशक्त के बजाय एक खाली संग्रह वापस करना चाहिए।
कॉलिन डी

मैं देख रहा हूं कि आप कॉलिन में क्या कर रहे हैं। इस स्थिति में, आप मान सकते हैं कि चीजें मौजूद हैं और सभी () स्थिर है। अपवाद खाली होना संग्रह के लिए विशिष्ट है, किसी अन्य कारण से नहीं।
21

OMG वे एक अपवाद फेंक ...! o_O
स्टुअर्ट मार्क्स

अब, अधिक दिलचस्प सवाल यह होगा कि पृथ्वी पर किसी को भी इस तरह के एक सामान्य मामले में फेंकने का क्या कारण हो सकता है, या क्या मामला इतना फेंकने के लिए विशेष बनाता है ??
मार्टिन बा

जवाबों:


29

दो संभावनाओं में से (यानी nullएक खाली संग्रह लौटाते हुए या वापस लौटते हुए) मैं एक खाली संग्रह लौटाऊंगा, क्योंकि यह कॉल करने वाले को लौटाए गए मूल्य का एक चेक छोड़ देता है। इसके बजाय यह लिखना

List<Thing> theThings = fubar.Things.All();
if (theThings != null) {
    for (Thing t : theThings) {
        t.doSomething();
    }
}

वे इसे लिखने में सक्षम होंगे:

List<Thing> theThings = fubar.Things.All();
for (Thing t : theThings) {
    t.doSomething();
}

यह दूसरा कोड टुकड़ा छोटा और पढ़ने में आसान है, क्योंकि घोंसले का स्तर एक से कम है।


2
मुझे लगता है कि मुझे 'सेट खाली है' (कोई आइटम नहीं) के रूप में वैचारिक रूप से समझना आसान होगा। नल 'कोई सेट नहीं है', जो काफी अलग है। (यह उन चीजों को भी कवर करना चाहिए जो तार्किक असंभावनाएं हैं - सभी वस्तुओं का सेट जो विषम हैं जो भी खाली हैं, खाली नहीं होना चाहिए)। मुझे ईमानदारी से यकीन नहीं है कि क्या (तार्किक रूप से) एक अशक्त सेट का गठन होगा ... (भले ही आप एक द्वीप पर नग्न हो, आपकी संपत्ति एक खाली सेट है, एक शून्य नहीं है)
घड़ी की कल-पहेली

@ X-Zero लेकिन अगर आप हिरन को नग्न करते हैं, तो "बैकपैक में संपत्ति" एक अशक्त सेट लौटा सकती है, क्योंकि आपके पास भी आप पर बैकपैक नहीं है। यह एक BackNotFoundException हो सकती है, लेकिन केवल अगर यह वास्तव में अप्रत्याशित है। यह एक सामान्य राज्य होना चाहिए, कहते हैं, एक द्वीप अस्तित्व का खेल है।
इज़काता

अतिरिक्त अशक्त जांच वह है जो मुझे रात में सोने में मदद करती है।
जोएल बी

6

मुझे एक खाली सूची की उम्मीद होगी। theThingsअभी भी एक वस्तु होगी, लेकिन theThings.Countया theThings.size()वापस आ जाएगी 0


5

इस तरह के डिजाइन मुद्दों को नल ऑब्जेक्ट पैटर्न द्वारा संबोधित किया जाता है

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

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

सुझाव विशेष रूप से आपके मामले में लागू होता है ( Listजब कोई Thingएस नहीं होता है ):

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


3

आपको चाहिए, IMHO, एक EMPTY मान लौटाएं। मैं C # के बारे में नहीं जानता, लेकिन जावा में हमारे पास यह है:

  List list = Collections.EMPTY_LIST;
  Set set = Collections.EMPTY_SET;
  Map map = Collections.EMPTY_MAP;

  // For the type-safe 
  List<String> s = Collections.emptyList();
  Set<Long> l = Collections.emptySet();
  Map<Date> d = Collections.emptyMap();

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html


1
C # समतुल्य है Enumerable.Empty<T>(), जो एक खाली लौटाता है IEnumerable<T>(देखें msdn.microsoft.com/en-us/library/bb341042.aspx )
Avner Shahar-

1
वर्तमान डॉक्स यहां हैं: docs.oracle.com/javase/7/docs/api/java/util/Collections.html - 1.4.2 डॉक्स अब लगभग दस साल पुराने हैं।
स्टुअर्ट मार्क्स

2

मैं शून्य मान लौटाने पर एक खाली संग्रह लौटा दूंगा क्योंकि इस तरह से आप कॉलिंग कोड में अशक्त सत्यापन लिखने से बच सकते हैं।


2

दो समाधान वे अलग चीजों का मतलब है।

यदि आप वापस लौट रहे हैं, तो बस शून्य हैं, आप हमेशा एक खाली संग्रह लौटाते हैं! निर्देशिका लिस्टिंग के मामले को लें। यदि निर्देशिका में कोई फ़ाइल नहीं है, तो आप फ़ाइलों का एक खाली संग्रह लौटाते हैं।

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


बहुत ही उचित व्याख्या। लौटाया गया परिणाम अमान्य स्थिति के लिए कवर नहीं होना चाहिए, हमारे पास इसके लिए अपवाद हैं।
Ivaylo Slavov
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.