जैसा कि शीर्षक में कहा गया है, वैकल्पिक पैरामीटर हैं, जैसे कि C # सहायक में उपयोग किए गए या क्या वे आवेदन रखरखाव के लिए बाधा हैं और उन्हें टाला जाना चाहिए क्योंकि वे कोड को समझने में कठिन बना सकते हैं?
जैसा कि शीर्षक में कहा गया है, वैकल्पिक पैरामीटर हैं, जैसे कि C # सहायक में उपयोग किए गए या क्या वे आवेदन रखरखाव के लिए बाधा हैं और उन्हें टाला जाना चाहिए क्योंकि वे कोड को समझने में कठिन बना सकते हैं?
जवाबों:
वैकल्पिक मापदंडों में, मेरे अनुभव में, एक अच्छी बात है। मैंने उन्हें कभी भी भ्रमित नहीं किया है (कम से कम वास्तविक कार्य से अधिक भ्रमित नहीं), क्योंकि मैं हमेशा डिफ़ॉल्ट मान प्राप्त कर सकता हूं और जान सकता हूं कि क्या कहा जाता है।
उनके लिए एक उपयोग तब होता है जब मुझे एक फ़ंक्शन में एक और पैरामीटर जोड़ना पड़ता है जो पहले से ही सामान्य उपयोग में है, या कम से कम सार्वजनिक इंटरफ़ेस में। उनके बिना, मुझे मूल फ़ंक्शन को फिर से कॉल करना होगा जिसे एक और तर्क मिला है, और अगर मैं एक से अधिक बार तर्क जोड़ रहा हूं तो यह वास्तव में पुराना हो सकता है।
new Circle(size, color, filled, ellipseProportions)
कि कहाँ size
और color
आवश्यक हैं और बाकी डिफ़ॉल्ट हैं।
सामान्य तौर पर, यदि आपको अक्सर कई / वैकल्पिक मापदंडों की आवश्यकता होती है, तो आपके कार्य बहुत अधिक हो रहे हैं, और टूट जाना चाहिए। आप एसआरपी (एकल जिम्मेदारी सिद्धांत) को तोड़ने की संभावना रखते हैं।
उन मापदंडों की तलाश करें जिन्हें समूहित किया जा सकता है, जैसे (x और y, एक बिंदु बन जाते हैं)।
क्या ये वैकल्पिक पैरामीटर झंडे डिफ़ॉल्ट के साथ हैं? यदि आप झंडे का उपयोग कर रहे हैं, तो फ़ंक्शन को विभाजित किया जाना चाहिए।
यह कहना है कि आपके पास वैकल्पिक पैरामीटर कभी नहीं होना चाहिए, लेकिन सामान्य तौर पर, एक या दो से अधिक पैरामीटर एक कोड गंध का सुझाव देते हैं।
यह एक सुराग भी हो सकता है कि फ़ंक्शन, वास्तव में एक वर्ग होना चाहिए, जिसमें वैकल्पिक पैरामीटर गुणों में बदल जाते हैं, और निर्माण के आवश्यक पैरामीटर भाग होते हैं।
वैकल्पिक पैरामीटर ठीक हैं
आमतौर पर औचित्य या तो यह है कि a) आप जानते हैं कि आपके पास आपके तरीके के लिए बहुत सारे संभावित तर्क हैं, लेकिन जब आप सभी संभावित तर्कों को नहीं जानते हैं, तो आप अपने एपीआई, या b) के बंद होने के डर से ओवरलोड नहीं करना चाहते हैं। अपने उपयोगकर्ता को एक सरणी प्रदान करने के लिए बाध्य नहीं करना चाहते हैं। प्रत्येक मामले में वैकल्पिक पैरामीटर साफ और सुरुचिपूर्ण तरीके से बचाव के लिए आते हैं।
यहाँ कुछ उदाहरण हैं:
1. आप ओवरलोडिंग से बचना चाहते हैं और एक सरणी निर्दिष्ट नहीं करना चाहते हैं
सी, पर्ल, जावा आदि से प्रिंटफ () पर एक नज़र डालें , यह वैकल्पिक मापदंडों की शक्ति का एक बड़ा उदाहरण है।
उदाहरण के लिए:
printf("I want %d %s %s",1,"chocolate","biccies");
printf("I want %d banana",1);
कोई अतिभार नहीं, कोई सरणियाँ, सरल और सहज (एक बार जब आप मानक स्ट्रिंग प्रारूप कोड समझ गए हैं)। कुछ आईडीई आपको यह भी बताएंगे कि क्या आपका प्रारूप स्ट्रिंग आपके वैकल्पिक मापदंडों से मेल नहीं खाता है।
2. आप चूक के उपयोग की अनुमति देना चाहते हैं और उन्हें विधि के उपयोगकर्ता से छिपाए रखना चाहते हैं
sendEmail ( "test@example.org");
SendEmail विधि पता लगाती है कि विभिन्न आवश्यक मान गायब हैं और उन्हें परिभाषित चूक (विषय, निकाय, cc, bcc आदि) का उपयोग करने में भरता है। एपीआई को साफ, अभी तक लचीला रखा गया है।
बहुत सारे मापदंडों पर एक नोट
हालांकि, जैसा कि दूसरों ने कहा है, एक विधि में बहुत अधिक अनिवार्य पैरामीटर होने से संकेत मिलता है कि आपके डिजाइन में शायद कुछ गड़बड़ है। यह विशेष रूप से सच है अगर वे उसी प्रकार का हिस्सा लेते हैं, क्योंकि डेवलपर द्वारा स्विच किया जा सकता है दुर्घटना के कारण रनटाइम पर अजीब परिणाम हो सकते हैं:
String myMethod(String x, String y, String z, String a, int b, String c, int d) {}
परिचय पैरामीटर वस्तु बनाने के लिए एक आदर्श उम्मीदवार बनाने के लिए refactoring है
String myMethod(ParameterObject po) {}
class ParameterObject {
// Left as public for clarity
public String x;
public String y;
... etc
}
बदले में यह पैरामीटर ऑब्जेक्ट के रूप में प्रदान किए गए विनिर्देश के साथ फ़ैक्टरी पैटर्न के आधार पर एक बेहतर डिज़ाइन का कारण बन सकता है।
C # में डिफ़ॉल्ट पैरामीटर के साथ समस्याओं में से एक है (मैं शून्य DoSomething (int x = 1) सोच रहा हूं) वे निरंतर हैं। इसका मतलब है कि यदि आप डिफ़ॉल्ट बदलते हैं तो आपको उस विधि कॉल के किसी भी उपभोक्ता को फिर से स्थापित करना होगा। जबकि यह करना काफी आसान है ऐसे मौके हैं जहां यह खतरनाक है।
यह इस पर निर्भर करता है कि आपका कोड क्या कर रहा है। यदि समझदार चूक हैं तो आपको वैकल्पिक मापदंडों का उपयोग करना चाहिए लेकिन यदि कोई समझदार चूक नहीं हैं तो वैकल्पिक मापदंडों को जोड़ने से आपका कोड अधिक जटिल हो जाएगा। कई उदाहरणों में वैकल्पिक पैरामीटर शून्य जांच को हटाने और ब्रांचिंग तर्क को काटने का एक अच्छा तरीका है। जावास्क्रिप्ट में वैकल्पिक पैरामीटर नहीं हैं, लेकिन उनके साथ अनुकरण करने का एक तरीका है || (तार्किक या) और मैं इसका उपयोग हर समय डेटाबेस से संबंधित सामान करते समय करता हूं क्योंकि यदि उपयोगकर्ता कुछ मूल्य प्रदान नहीं करता है तो मैं अपने स्वयं के मूल्यों को इसकी मदद से प्रतिस्थापित करता हूं || जो मुझे तब के एक पूरे समूह को लिखने की परेशानी से बचाता है।
वैकल्पिक पैरामीटर सरल चीजों को सरल और जटिल चीजों को एक साथ संभव बनाने का एक शानदार तरीका है। यदि एक स्पष्ट उचित डिफ़ॉल्ट है जो अधिकांश उपयोगकर्ता चाहते हैं, कम से कम त्वरित और गंदे उपयोग के मामलों में, तो उन्हें बॉयलरप्लेट को मैन्युअल रूप से निर्दिष्ट करने के लिए हर बार जब वे आपके फ़ंक्शन को कॉल करते हैं, तो इसे लिखना नहीं चाहिए। दूसरी ओर, यदि लोगों के पास इसे बदलने की इच्छा के लिए एक अच्छा कारण हो सकता है, तो इसे उजागर करने की आवश्यकता है।
एक वर्ग का उपयोग करना IMHO एक भयानक समाधान है, क्योंकि यह क्रियात्मक, अक्षम और असंगत है जो एक वर्ग के विशिष्ट मानसिक मॉडल के साथ होता है। एक क्रिया एक क्रिया के लिए एकदम सही अमूर्त है, यानी कुछ करना और वापस लौटना। एक वर्ग एक संज्ञा के लिए सही अमूर्तता है, अर्थात ऐसा कुछ जिसमें राज्य है और जिसे कई तरीकों से जोड़-तोड़ किया जा सकता है। यदि पूर्व में API उपयोगकर्ता का मानसिक मॉडल होना चाहिए, तो उसे वर्ग न बनाएं।
वैकल्पिक तर्कों के साथ समस्या यह है कि लोग संबंधित फ़ंक्शन को एक नए फ़ंक्शन में निकालने के बजाय फ़ंक्शन पर अधिक से अधिक (और अधिक) तर्कों पर टिक जाते हैं। इसे php में चरम पर ले जाया जाता है । उदाहरण के लिए:
bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC
[, mixed $arg = SORT_REGULAR [, mixed $... ]]] )
मैंने शुरुआत में अजगर में इस सुविधा को पसंद किया है, और इसका इस्तेमाल पहले से इस्तेमाल किए गए तरीकों को 'विस्तारित' करने के लिए किया है। और यह अच्छा और आसान लग रहा था, लेकिन यह जल्द ही वापस आ गया; क्योंकि जब मैंने एक वैकल्पिक पैरामीटर जोड़ा था, तो यह एक मौजूदा पद्धति के व्यवहार को संशोधित कर रहा था जो पुराने ग्राहक पर निर्भर था और एक तरह से जो मौजूदा इकाई परीक्षण मामलों द्वारा पकड़ा नहीं गया था। मूल रूप से ऐसा करने से ओपन क्लोज्ड सिद्धांत टूट रहा है; कोड विस्तार के लिए खुला है लेकिन संशोधन के लिए बंद है। इसलिए मेरा मानना है कि मौजूदा कोड को संशोधित करने के लिए इस सुविधा का उपयोग करना एक अच्छा विचार नहीं है; लेकिन ठीक है अगर शुरू से इस्तेमाल किया
मुझे लगता है कि वैकल्पिक मापदंडों के उपयोग की तुलना में विभिन्न हस्ताक्षरों (यानी मापदंडों) के साथ एक फ़ंक्शन को अधिभार देना बेहतर होगा।