अधिभार या वैकल्पिक पैरामीटर


10

जब मेरे पास एक फ़ंक्शन है जो एक निश्चित पैरामीटर प्राप्त कर सकता है, या नहीं कर सकता है, तो क्या फ़ंक्शन को अधिभार करना बेहतर है, या वैकल्पिक आर्गन जोड़ना है?

यदि प्रत्येक के पास उतार-चढ़ाव है - तो मैं प्रत्येक का उपयोग कब करूंगा?


ऑप्टिमाइज़ेशन के नजरिए से वैकल्पिक पैरामीटर रखना एक बेहतर विकल्प है।
मानेत पुरी

जवाबों:


12

यदि भाषा उन्हें ठीक से समर्थन करती है (उदाहरण के लिए-सुरक्षा, यदि लागू हो), तो मैं निम्नलिखित कारणों के लिए वैकल्पिक तर्क पसंद करूंगा:

  • वे आपके इरादे को बेहतर तरीके से व्यक्त करते हैं ताकि किसी को भी संदेह न हो कि आपका कार्य अधिभार कुछ अलग करेगा (जो कि शायद वैसे भी नहीं होना चाहिए)।
  • कम कोड बनाए रखने के लिए, भले ही फ़ंक्शन अधिभार केवल अधिक व्यापक को दर्शाता है। यदि आप बाद में फ़ंक्शन का नाम बदलना चाहते हैं, तो आपके पास इसे करने के लिए कम से कम 3 स्थान हैं (दो परिभाषाएँ + एक कॉल)।
  • संकलक (यदि कोई हो) छोटे बायनेरिज़ उत्पन्न कर सकता है।
  • वैकल्पिक तर्क बेहतर पैमाने पर, कम से कम कुछ भाषाओं में। यदि आप मिश्रण और मिलान करने की क्षमता के साथ 3 वैकल्पिक तर्क चाहते हैं तो क्या होगा? पूर्ण लचीलेपन के लिए, आपको ऐसा करने के लिए 6 अधिभार की आवश्यकता होगी।
  • यदि यह एक ऑब्जेक्ट विधि है, तो कई ओवरलोड्स उपवर्गों में ओवरराइड के कार्यान्वयन में बाधा डालेंगे।

क्या आपको 8 की आवश्यकता नहीं होगी? तीन वैकल्पिक तर्क a, bऔर cइन संभावनाएं हैं: कुछ भी नहीं, ए, बी, सी, एबी, एसी, बीसी, एबीसी। यह 2^nविभिन्न प्रकारों के लिए है, नहींn!
मार्क

0

एक निर्माता की तरह की स्थिति को मानते हुए: मैं अक्सर कई विकल्पों के साथ स्थितियों को रोकने के लिए एक धाराप्रवाह बिल्डर पैटर्न चुनता हूं।

उदाहरण के लिए। Ordering.natural().onResultOf(function).reverse().compound(Ordering.natural().onResultOf(function2))अमरूद में कार्यान्वित धाराप्रवाह बिल्डर इंटरफ़ेस को कॉल करने का एक उदाहरण है।

बेशक आपको अब अपने बिल्डर की स्थिति को संभालने के लिए एक अलग वस्तु की आवश्यकता है, लेकिन आप निर्माण के व्यवहार से निर्माण के व्यवहार को अलग करके समग्र जटिलता को कम करते हैं।


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