क्या किसी कारण के रूप में वैकल्पिक का उपयोग करने का कोई कारण नहीं है मामले में जहां आप जानते हैं कि तर्क कुछ ऐसा है जिसकी आवश्यकता हो सकती है या नहीं?


11

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

क्या Optionalइस मामले में एक विधि तर्क के रूप में उपयोग नहीं करने का कोई कारण है जहां आप जानते हैं कि तर्क कुछ ऐसा है जिसकी आवश्यकता हो सकती है या नहीं? यहाँ एक उदाहरण है जिसके बारे में मैं सोच सकता हूँ:

Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)

हास्केल में यह उनके लिए एक सामान्य उपयोग है, जिसमें डिफ़ॉल्ट तर्क (दर्द का दर्द) भी नहीं है।
डैनियल ग्रैजर

संबंधित स्टैक ओवरफ्लो प्रश्न के लिए मेरा उत्तर देखें । संक्षेप में, Optionalमुख्य रूप से वापसी मूल्यों के लिए इरादा है जो अनुपस्थित हो सकते हैं। अन्य उपयोग संभव हैं, निश्चित रूप से, लेकिन बोझिल हैं और संभवतः खराब शैली है।
स्टुअर्ट मार्क्स

जवाबों:


6

एक कारण यह है कि धारणात्मक, firstName, middleName, और lastNameतार्किक हैं एक तर्क है, न कि तीन। वे एक बड़े पूरे के सभी हिस्से हैं, और एक कल्पना कर सकता है कि वे लगभग हमेशा एक साथ गुजरते हैं। कार्यात्मक भाषाओं में वे संभवत: टपल या रिकॉर्ड के रूप में पारित किए जाएंगे; जावा में उन का अभाव है, इसलिए उन्हें संभवतः एक नाम वर्ग में एकत्रित किया जाएगा। ध्यान दें कि यदि आपको पूर्ण नाम लेने और वापस करने वाले कार्यों की रचना करने की आवश्यकता है, तो आप उन्हें एकत्र किए बिना नहीं कर पाएंगे - आप केवल एक मान वापस कर सकते हैं, सब के बाद।

शायद यह अभी बहुत बार नहीं आया है कि एक मूल्य वैकल्पिक है और एक बड़े पूरे का हिस्सा नहीं है। यदि फ़ंक्शन को अपना काम करने के लिए एक निश्चित मूल्य की आवश्यकता होती है, तो उस फ़ंक्शन को ए स्वीकार नहीं करना चाहिए Optional। यदि आपको उन श्रृंखलाओं के संचालन की आवश्यकता है जो एक मान नहीं लौटा सकते हैं, Nothingअगर रास्ते में कोई भी फ़ंक्शन विफल हो जाता है, तो आप कॉल को चेन कर सकते हैं flatMap, और यदि आप अपवाद के साथ विफल होना चाहते हैं, तो आप get()रास्ते में या रास्ते में किसी भी चरण में उपयोग कर सकते हैं श्रृंखला का अंत।

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

मुझे नहीं लगता कि यह इतना गलत है क्योंकि यह अपेक्षाकृत असामान्य उपयोग का मामला है।


5

ऐसी कई भाषाएँ नहीं हैं जो डिफ़ॉल्ट तर्कों का समर्थन नहीं करती हैं, इसलिए यह एक सामान्य उपयोग नहीं है। मुझे व्यक्तिगत रूप से लगता है कि आपका उपयोग भयानक नहीं है, लेकिन यह मुहावरेदार जावा नहीं है। जावा में जानबूझकर डिफ़ॉल्ट तर्क नहीं होते हैं, इसके बजाय ओवरलोडिंग के उपयोग को मजबूर करने के लिए, जिससे ifफ़ंक्शन के अंदर बयानों की आवश्यकता के बजाय संकलक को आपके तर्कों की जांच करने का फायदा होता है।

दूसरे शब्दों में, आप क्वेरी के दो अलग-अलग संस्करण बनाने जा रहे हैं: एक मध्य नाम के साथ और एक बिना। यदि आप एक संक्षिप्त तरीके से कर सकते हैं, तो एक विकल्प का उपयोग करना एक अच्छा विचार है। यदि यह पर्याप्त है कि आप इसे दो अलग-अलग कार्यों में चाहते हैं, तो आप ओवरलोडिंग का उपयोग कर सकते हैं और इसे मुहावरेदार बना सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.