क्या वैकल्पिक पैरामीटर सहायक हैं या अनुप्रयोग रखरखाव के लिए बाधा हैं? [बन्द है]


15

जैसा कि शीर्षक में कहा गया है, वैकल्पिक पैरामीटर हैं, जैसे कि C # सहायक में उपयोग किए गए या क्या वे आवेदन रखरखाव के लिए बाधा हैं और उन्हें टाला जाना चाहिए क्योंकि वे कोड को समझने में कठिन बना सकते हैं?


3
अस्वीकरण: गलत हाथों में किसी भी भाषा की सुविधा का दुरुपयोग किया जा सकता है। यदि कोई भाषा इसे स्मार्ट तरीके से लागू करती है, और यह भाषा सुविधा एक सुस्त भाषा में मौजूदा भाषा सुविधा के साथ बहुत अधिक ओवरलैप नहीं करती है, तो वे ठीक हैं, वास्तव में काफी उपयोगी हैं। पायथन में कुछ साफ-सुथरा पैराम पैकिंग / अनपैकिंग और अन्य पैरामीटर "ट्रिक्स" (अच्छे में चालें, पर्ल अर्थ नहीं) हैं।
जॉब

C # में एक ऐसा ऐप लिखने का प्रयास करें, जो वैकल्पिक मापदंडों का उपयोग किए बिना Excel में हस्तक्षेप करता हो। किसी भी उचित संदेह से परे अपने प्रश्न का उत्तर देना चाहिए।
डंक

जवाबों:


22

वैकल्पिक मापदंडों में, मेरे अनुभव में, एक अच्छी बात है। मैंने उन्हें कभी भी भ्रमित नहीं किया है (कम से कम वास्तविक कार्य से अधिक भ्रमित नहीं), क्योंकि मैं हमेशा डिफ़ॉल्ट मान प्राप्त कर सकता हूं और जान सकता हूं कि क्या कहा जाता है।

उनके लिए एक उपयोग तब होता है जब मुझे एक फ़ंक्शन में एक और पैरामीटर जोड़ना पड़ता है जो पहले से ही सामान्य उपयोग में है, या कम से कम सार्वजनिक इंटरफ़ेस में। उनके बिना, मुझे मूल फ़ंक्शन को फिर से कॉल करना होगा जिसे एक और तर्क मिला है, और अगर मैं एक से अधिक बार तर्क जोड़ रहा हूं तो यह वास्तव में पुराना हो सकता है।


1
+1 और यह ओवरलोडेड तरीकों से मूल्यवान है जो एक तर्क को जोड़ते हैं जैसे new Circle(size, color, filled, ellipseProportions)कि कहाँ sizeऔर colorआवश्यक हैं और बाकी डिफ़ॉल्ट हैं।
माइकल के

15

सामान्य तौर पर, यदि आपको अक्सर कई / वैकल्पिक मापदंडों की आवश्यकता होती है, तो आपके कार्य बहुत अधिक हो रहे हैं, और टूट जाना चाहिए। आप एसआरपी (एकल जिम्मेदारी सिद्धांत) को तोड़ने की संभावना रखते हैं।

उन मापदंडों की तलाश करें जिन्हें समूहित किया जा सकता है, जैसे (x और y, एक बिंदु बन जाते हैं)।

क्या ये वैकल्पिक पैरामीटर झंडे डिफ़ॉल्ट के साथ हैं? यदि आप झंडे का उपयोग कर रहे हैं, तो फ़ंक्शन को विभाजित किया जाना चाहिए।

यह कहना है कि आपके पास वैकल्पिक पैरामीटर कभी नहीं होना चाहिए, लेकिन सामान्य तौर पर, एक या दो से अधिक पैरामीटर एक कोड गंध का सुझाव देते हैं।

यह एक सुराग भी हो सकता है कि फ़ंक्शन, वास्तव में एक वर्ग होना चाहिए, जिसमें वैकल्पिक पैरामीटर गुणों में बदल जाते हैं, और निर्माण के आवश्यक पैरामीटर भाग होते हैं।


1
सावधान रहने के लिए +1। कोई भी सुविधा, चाहे कितनी भी अच्छी हो, उसे गाली दी जा सकती है।
माइकल के

3
यह अतिरंजित रैवियोली कोड के उत्पादन के लिए बहुत अच्छी सलाह है, जहां आपके एपीआई के उपयोगकर्ताओं को कम से कम 6 कक्षाएं और 15 कार्यों का उपयोग करना पड़ता है ताकि सबसे सरल काम भी हो सके।
dsimcha

1
@dsimcha, जो मैंने लिखा है, उससे आपको कैसे मिलता है? वाह। कृपया समझाएँ? यह एक "सुपर फ़ंक्शन" होने के लिए समान रूप से खराब डिज़ाइन होगा जो कि आपको तब मिलता है जब आपके पास बहुत सारे वैकल्पिक पैरामीटर होते हैं। SOLID डिजाइन सिद्धांतों, और परीक्षण योग्य कोड के बारे में पढ़ें। अधिमानतः टीडीडी का उपयोग करना। फिर वापस आकर कोशिश करें और मुझे समझाएं कि कार्यों में मापदंडों को कम करना एक बुरी बात है।
कैफ़ीक्यूक

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

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

4

वैकल्पिक पैरामीटर ठीक हैं

आमतौर पर औचित्य या तो यह है कि 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

}

बदले में यह पैरामीटर ऑब्जेक्ट के रूप में प्रदान किए गए विनिर्देश के साथ फ़ैक्टरी पैटर्न के आधार पर एक बेहतर डिज़ाइन का कारण बन सकता है।


1
प्रिन्टिंग जैसे स्ट्रिंग प्रारूपण कार्य नियम के अपवाद हैं, कोई यह तर्क दे सकता है कि जब वे वैकल्पिक मापदंडों की एक असीम सूची का उपयोग करते हैं , तो यह अधिक पसंद है कि यह तर्क वैकल्पिक मापदंडों की तुलना में एक सरणी है, इसके बावजूद इसे कैसे लागू किया जाता है।
कैफ़ीक नेक

@ क्या मैंने अपने जवाब को वैकल्पिक मापदंडों के बीच बेहतर अंतर करने के लिए समायोजित किया है और जब वे एक कोड गंध में संक्रमण करते हैं (जैसा कि आपने अपने उत्तर में उल्लेख किया है)।
गैरी रोवे

@ गैरी रोवे, ज्यादातर मामलों में बहुत अधिक वैकल्पिक पैरामीटर खराब हैं।
कैफ़ीक नेक

@ मैं सहमत हूं, लेकिन अधिकांश भाषाएं वैकल्पिक तर्कों की संख्या पर एक सीमा निर्दिष्ट करने का एक तरीका प्रदान नहीं करती हैं, इसलिए यह एक या कुछ भी नहीं है। आपको इसे लागू करने के लिए अपने तरीके पर छोड़ने के लिए मजबूर किया जाता है और जाहिर है कि अगर आपका तरीका 500 चर के साथ काम कर रहा है तो निश्चित रूप से इसे फिर से शुरू करने की आवश्यकता है।
गैरी रोवे 20

@ गैरी रोव, आपका क्या मतलब है "अधिकांश भाषाएं वैकल्पिक तर्कों की संख्या पर सीमा निर्दिष्ट करने का एक तरीका प्रदान नहीं करती हैं"? अधिकांश भाषाओं में आप उन्हें इस तरह चिह्नित करते हैं, या फ़ंक्शन को कॉल करते समय उन्हें मान प्रदान नहीं करते हैं, लेकिन फ़ंक्शन हेडर में अभी भी पैरामीटर परिभाषित हैं। दी गई, कुछ भाषाओं में आप परिभाषित मापदंडों में भरे जाने के बाद आप जितने चाहें, उतने पैरामीटर जोड़ सकते हैं, लेकिन मुझे नहीं लगता कि हम यहां जिस तरह के वैकल्पिक मापदंडों की बात कर रहे हैं। (स्ट्रिंग प्रारूप अपवाद से अलग)
कैफीक

2

C # में डिफ़ॉल्ट पैरामीटर के साथ समस्याओं में से एक है (मैं शून्य DoSomething (int x = 1) सोच रहा हूं) वे निरंतर हैं। इसका मतलब है कि यदि आप डिफ़ॉल्ट बदलते हैं तो आपको उस विधि कॉल के किसी भी उपभोक्ता को फिर से स्थापित करना होगा। जबकि यह करना काफी आसान है ऐसे मौके हैं जहां यह खतरनाक है।


1

यह इस पर निर्भर करता है कि आपका कोड क्या कर रहा है। यदि समझदार चूक हैं तो आपको वैकल्पिक मापदंडों का उपयोग करना चाहिए लेकिन यदि कोई समझदार चूक नहीं हैं तो वैकल्पिक मापदंडों को जोड़ने से आपका कोड अधिक जटिल हो जाएगा। कई उदाहरणों में वैकल्पिक पैरामीटर शून्य जांच को हटाने और ब्रांचिंग तर्क को काटने का एक अच्छा तरीका है। जावास्क्रिप्ट में वैकल्पिक पैरामीटर नहीं हैं, लेकिन उनके साथ अनुकरण करने का एक तरीका है || (तार्किक या) और मैं इसका उपयोग हर समय डेटाबेस से संबंधित सामान करते समय करता हूं क्योंकि यदि उपयोगकर्ता कुछ मूल्य प्रदान नहीं करता है तो मैं अपने स्वयं के मूल्यों को इसकी मदद से प्रतिस्थापित करता हूं || जो मुझे तब के एक पूरे समूह को लिखने की परेशानी से बचाता है।


1

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

एक वर्ग का उपयोग करना IMHO एक भयानक समाधान है, क्योंकि यह क्रियात्मक, अक्षम और असंगत है जो एक वर्ग के विशिष्ट मानसिक मॉडल के साथ होता है। एक क्रिया एक क्रिया के लिए एकदम सही अमूर्त है, यानी कुछ करना और वापस लौटना। एक वर्ग एक संज्ञा के लिए सही अमूर्तता है, अर्थात ऐसा कुछ जिसमें राज्य है और जिसे कई तरीकों से जोड़-तोड़ किया जा सकता है। यदि पूर्व में API उपयोगकर्ता का मानसिक मॉडल होना चाहिए, तो उसे वर्ग न बनाएं।


1

वैकल्पिक तर्कों के साथ समस्या यह है कि लोग संबंधित फ़ंक्शन को एक नए फ़ंक्शन में निकालने के बजाय फ़ंक्शन पर अधिक से अधिक (और अधिक) तर्कों पर टिक जाते हैं। इसे php में चरम पर ले जाया जाता है । उदाहरण के लिए:

bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC
                      [, mixed $arg = SORT_REGULAR [, mixed $... ]]] )

1

वैकल्पिक पैरामीटर मूल रूप से एक फ़ंक्शन को ओवरलोड करने का एक अलग तरीका है। तो यह मूल रूप से नीचे आता है: "एक फ़ंक्शन खराब हो रहा है"?


1

मैंने शुरुआत में अजगर में इस सुविधा को पसंद किया है, और इसका इस्तेमाल पहले से इस्तेमाल किए गए तरीकों को 'विस्तारित' करने के लिए किया है। और यह अच्छा और आसान लग रहा था, लेकिन यह जल्द ही वापस आ गया; क्योंकि जब मैंने एक वैकल्पिक पैरामीटर जोड़ा था, तो यह एक मौजूदा पद्धति के व्यवहार को संशोधित कर रहा था जो पुराने ग्राहक पर निर्भर था और एक तरह से जो मौजूदा इकाई परीक्षण मामलों द्वारा पकड़ा नहीं गया था। मूल रूप से ऐसा करने से ओपन क्लोज्ड सिद्धांत टूट रहा है; कोड विस्तार के लिए खुला है लेकिन संशोधन के लिए बंद है। इसलिए मेरा मानना ​​है कि मौजूदा कोड को संशोधित करने के लिए इस सुविधा का उपयोग करना एक अच्छा विचार नहीं है; लेकिन ठीक है अगर शुरू से इस्तेमाल किया


0

मुझे लगता है कि वैकल्पिक मापदंडों के उपयोग की तुलना में विभिन्न हस्ताक्षरों (यानी मापदंडों) के साथ एक फ़ंक्शन को अधिभार देना बेहतर होगा।


क्यों? मुझे लगता है कि यदि आप सभी विधियों की मूल कार्यक्षमता समान है तो अमूल क्लीनर को एक ही तरीके से ओवरलोड विधियों के एक समूह में जोड़ सकते हैं
अमित वाधवा

आप ऐसा सोच सकते हैं। मैं यह सोचने के लिए एक नहीं हूं कि Microsoft सब कुछ सही तरीके से करता है, लेकिन अगर आप सटीक थे, तो मैं कभी भी .NET फ्रेमवर्क का उपयोग करते समय ओवरलोड्स नहीं देखूंगा, सिर्फ एक विशाल फंक्शन सिग्नेचर - जैसे ol 'VB6 में।
हार्डकोड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.