कई भाषाएं नामांकित मापदंडों का समर्थन क्यों नहीं करती हैं? [बन्द है]


14

मैं सिर्फ यह सोच रहा था कि यदि किसी फ़ंक्शन को कॉल करते समय, कोड पढ़ना कितना आसान होगा, तो आप लिख सकते हैं:

doFunction(param1=something, param2=somethingElse);

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

क्या इसका कोई नुकसान है जो मुझे याद आ रहा है? यदि नहीं, तो कई भाषाएं इसकी अनुमति क्यों नहीं देतीं?


1
क्या आप एक ऐसी भाषा दे सकते हैं जिसे (और) को नाम दिया जा सकता है लेकिन उसके पास नहीं है?
ब्रायन चेन

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

2
@SteveFallows: "नामांकित पैरामीटर मुहावरा" एक बिल्डर वर्ग पर धाराप्रवाह एपीआई (मार्टिन फाउलर द्वारा नाम) की परिभाषा के लिए एक अजीब नाम की तरह लगता है। आप जोशुआ बलोच के प्रभावी जावा के पहले आइटम में एक ही पैटर्न के उदाहरण पा सकते हैं ।
झोमिनल

3
यह आवश्यक रूप से एक राय आधारित प्रश्न नहीं है
कैट्सकुल

2
माना। "कई भाषाएं नामांकित मापदंडों का समर्थन क्यों नहीं करती हैं?" राय से ज्यादा भाषाओं के इतिहास का सवाल है। यदि किसी ने इसे "बेहतर मापदंडों का नाम नहीं दिया?" तो यह राय होगी।
एंडी फ्लेमिंग

जवाबों:


14

पैरामीटर नाम निर्दिष्ट करना हमेशा कोड को अधिक पठनीय नहीं बनाता है: उदाहरण के लिए, क्या आप पढ़ना पसंद करेंगे min(first=0, second=1)या min(0, 1)?

यदि आप पिछले पैराग्राफ के तर्क को स्वीकार करते हैं, तो यह बहुत स्पष्ट है कि पैरामीटर नामों को निर्दिष्ट करना अनिवार्य नहीं होना चाहिए। सभी भाषाएँ निर्दिष्ट पैरामीटर नामों को एक वैध विकल्प क्यों नहीं बनाती हैं?

मैं कम से कम दो कारणों के बारे में सोच सकता हूं:

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

ध्यान दें कि मुझे किसी भी भाषा का पता नहीं है जो वैकल्पिक मापदंडों को लागू किए बिना मापदंडों का नाम भी लागू करता है (जिसे नामांकित मापदंडों की आवश्यकता होती है) - इसलिए आपको उनके पठनीयता लाभ को कम करने से सावधान रहना चाहिए, जो कि धाराप्रवाह इंटरसेप्टर की परिभाषा के साथ लगातार प्राप्त किया जा सकता है ।


6
मैं नियमित रूप से कई अलग-अलग भाषाओं में कोड करता हूं, मुझे लगभग हमेशा किसी भी भाषा में एक सरल विकल्प के लिए मापदंडों को देखना पड़ता है। क्या यह सबस्ट्रिंग (आरंभ, लंबाई) या सबस्ट्रिंग (आरंभ, अंत) है और अंत स्ट्रिंग में शामिल है?
जेम्स एंडरसन

1
@JamesAnderson - एक नामित-पैरामीटर सबस्ट्रिंग आपको समस्या कैसे हल करेगा? आपको तब भी पैरामीटर देखना होगा ताकि यह पता चल सके कि दूसरे पैरामीटर का नाम क्या है (जब तक कि दोनों फ़ंक्शन मौजूद न हों और भाषा की बहुरूपता सुविधा विभिन्न नामों के साथ एक ही प्रकार के पैरामीटर की अनुमति देती है)।
मौविसील

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

@ घोषी - आप सही हैं। जब मैंने अपनी पिछली टिप्पणी लिखी तो मैं कोड पढ़ने के महत्व को भूल गया।
मौविसील

14

नामित पैरामीटर्स कोड को आसान बनाने के लिए पढ़ें, कठिन लिखने के लिए

जब मैं कोड का एक टुकड़ा पढ़ रहा होता हूं, तो नामित पैरामीटर संदर्भ प्रस्तुत कर सकता है जो कोड को समझने में आसान बनाता है। उदाहरण के लिए इस निर्माता पर विचार करें Color(1, 102, 205, 170):। पृथ्वी पर उसका क्या अर्थ है? वास्तव में, Color(alpha: 1, red: 102, green: 205, blue: 170)यह पढ़ना बहुत आसान होगा। लेकिन अफसोस, कंपाइलर "नहीं" कहता है - यह चाहता है Color(a: 1, r: 102, g: 205, b: 170)। नामित मापदंडों का उपयोग करके कोड लिखते समय, आप सटीक नामों को देखने के लिए अनावश्यक समय बिताते हैं - कुछ मापदंडों के सटीक नामों को भूलना आसान होता है, जितना कि उनके आदेश को भूलना।

DateTimeलगभग एक जैसे इंटरफेस वाले पॉइंट्स और ड्यूरेशन के लिए दो सिबलिंग क्लास वाले एपीआई का इस्तेमाल करते समय यह मुझे एक बार हो जाता है। जबकि अन्य इकाइयों के लिए DateTime->new(...)एक second => 30तर्क, DateTime::Duration->new(...)वांछित seconds => 30, और समान स्वीकार किया गया । हां, यह पूरी तरह से समझ में आता है, लेकिन इससे मुझे पता चला कि नामित पैरामीटर use उपयोग में आसानी।

बुरे नाम भी पढ़ने में आसान नहीं बनाते हैं

एक और उदाहरण है कि कैसे नामित पैरामीटर खराब हो सकते हैं शायद आर भाषा है। कोड का यह टुकड़ा एक डेटा प्लॉट बनाता है:

plot(plotdata$n, plotdata$mu, type="p", pch=17,  lty=1, bty="n", ann=FALSE, axes=FALSE)

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

  • pchवास्तव में प्लॉट चरित्र है, ग्लिफ़ जिसे हर डेटा बिंदु के लिए तैयार किया जाएगा। 17एक खाली चक्र है, या ऐसा ही कुछ।
  • ltyलाइन प्रकार है। यहाँ 1एक ठोस रेखा है।
  • btyबॉक्स प्रकार है। "n"भूखंड के चारों ओर खींचे जा रहे एक बॉक्स से बचने के लिए इसे स्थापित करना ।
  • ann अक्ष एनोटेशन की उपस्थिति को नियंत्रित करता है।

किसी ऐसे व्यक्ति के लिए जो यह नहीं जानता कि प्रत्येक संक्षिप्त नाम का क्या अर्थ है, ये विकल्प बल्कि भ्रमित करने वाले हैं। इससे यह भी पता चलता है कि R इन लेबलों का उपयोग क्यों करता है: स्व-दस्तावेजीकरण कोड के रूप में नहीं, बल्कि (डायनेमिक रूप से टाइप की गई भाषा के रूप में) मानों को उनके सही चर में मैप करने के लिए।

पैरामीटर और हस्ताक्षर के गुण

समारोह हस्ताक्षरों में निम्नलिखित गुण हो सकते हैं:

  • तर्क का आदेश दिया जा सकता है या अनियंत्रित किया जा सकता है,
  • नाम या अनाम,
  • आवश्यक या वैकल्पिक।
  • हस्ताक्षर भी आकार या प्रकार से अतिभारित हो सकते हैं,
  • और varargs के साथ एक अनिर्दिष्ट आकार हो सकता है।

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

वैरिकाज़ के साथ डायनामिक रूप से टाइप की गई भाषाएं (कमांड लाइन इंटरफेस, पर्ल,…) वैकल्पिक नामित मापदंडों का अनुकरण कर सकती हैं। सिग्नेचर साइज़ ओवरलोडिंग वाली भाषाओं में स्थितीय वैकल्पिक मापदंडों जैसा कुछ होता है।

नामांकित पैरामीटर को लागू करने के लिए कैसे नहीं

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

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

अब एक महत्वपूर्ण सवाल यह है कि तर्कों को वास्तव में फ़ंक्शन में कैसे पारित किया जाता है। आदेश दिए गए मापदंडों के साथ, आर्ग्स को एक रजिस्टर में, या स्टैक पर उनके अंतर्निहित क्रम में पारित किया जा सकता है। जब हम एक पल के लिए रजिस्टरों को बाहर करते हैं, तो समस्या यह है कि स्टैक पर अनियोजित वैकल्पिक तर्क कैसे रखे जाएं।

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

उप-संकलन और लिस्कोव प्रतिस्थापन सिद्धांत के प्रकाश में भी इस पर विचार करें - संकलित आउटपुट में, एक ही निर्देश संभवतया नए नामित मापदंडों के साथ एक उपप्रकार पर विधि को लागू करने में सक्षम होना चाहिए, और एक सुपरटेप पर।

संभव कार्यान्वयन

यदि हमारे पास एक निश्चित क्रम नहीं हो सकता है, तो हमें कुछ अनियंत्रित डेटा संरचना की आवश्यकता है।

  • सबसे सरल कार्यान्वयन केवल मानों के साथ मापदंडों का नाम पारित करना है। इस प्रकार पेरल्स में या कमांड लाइन टूल्स के साथ पैराम्स का नामकरण किया जाता है। यह ऊपर वर्णित सभी एक्सटेंशन समस्याओं को हल करता है, लेकिन अंतरिक्ष का एक बड़ा अपशिष्ट हो सकता है - प्रदर्शन-महत्वपूर्ण कोड में विकल्प नहीं। इसके अलावा, इन नामित पारमों को संसाधित करना एक स्टैक से बस मूल्यों को पॉप करने की तुलना में बहुत अधिक जटिल है।

    दरअसल, स्ट्रिंग पूलिंग का उपयोग करके अंतरिक्ष आवश्यकताओं को कम किया जा सकता है, जो बाद की स्ट्रिंग तुलनाओं को सूचक तुलनाओं को कम कर सकता है (सिवाय इसके कि जब यह गारंटी नहीं दी जा सकती है कि स्थिर तार वास्तव में पूल किए जाते हैं, तो उस स्थिति में दोनों तारों की तुलना की जाएगी। विस्तार)।

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

तो यह ज्यादातर मामलों में बहुत महंगा है

यदि नामांकित मापदंडों के साथ एक फ़ंक्शन ठीक से एक्स्टेंसिबल होना है, तो एक निश्चित आदेश नहीं माना जा सकता है। तो केवल दो समाधान हैं:

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

अन्य नुकसान

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

नामित तर्कों के अनुकरण के साथ एक मुद्दा कॉलर की ओर स्थिर जाँच की कमी है। तर्कों का एक शब्दकोश (आप, पायथन को देखते हुए) गुजरते समय यह भूलना आसान है। यह महत्वपूर्ण है क्योंकि एक शब्दकोश को पारित करना एक सामान्य समाधान है, उदाहरण के लिए जावास्क्रिप्ट में foo({bar: "baz", qux: 42}):। यहां, न तो मूल्यों के प्रकार और न ही कुछ नामों के अस्तित्व या अनुपस्थिति को सांख्यिकीय रूप से जांचा जा सकता है।

नामांकित पैरामीटर का अनुकरण करना (सांख्यिकीय रूप से टाइप की गई भाषाओं में)

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

// Java

static abstract class Arguments {
  public String bar = "default";
  public int    qux = 0;
}

void foo(Arguments args) {
  ...
}

/* using an initializer block */
foo(new Arguments(){{ bar = "baz"; qux = 42; }});

3
" it is easier to forget the exact names of some parameters than it is to forget their order" ... यह एक दिलचस्प दावा है।
कैटस्कुल

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

1
नामांकित मापदंडों को करने के लिए कार्यान्वयन लागत और ट्रेडऑफ़ के बारे में समग्र बिंदुओं के लिए +1। मुझे लगता है कि शुरुआत लोगों को खो देगी।
mtraceur

@mtraceur आपके पास एक बिंदु है। अब, 5 साल बाद, मैं शायद इसका उत्तर काफी अलग तरीके से लिखूंगा। यदि आप चाहते हैं कि आप कम उपयोगी सामान को हटाने के लिए मेरे उत्तर को संपादित कर सकें। (आमतौर पर इस तरह के संपादन को अस्वीकार कर दिया जाएगा क्योंकि वे लेखक के इरादे के विपरीत हैं, लेकिन यहां मैं इसके साथ ठीक हूं)। उदाहरण के लिए, अब मुझे लगता है कि कई नामांकित पैरामीटर समस्याएं सिर्फ गतिशील भाषाओं का प्रतिबंध हैं, और उन्हें बस एक प्रकार की प्रणाली मिलनी चाहिए। उदाहरण के लिए जावास्क्रिप्ट में फ्लो और टाइपस्क्रिप्ट हैं, पायथन में MyPy है। उचित आईडीई एकीकरण के साथ जो सबसे अधिक प्रयोज्य समस्याओं को समाप्त करता है। मैं अभी भी पर्ल में किसी चीज का इंतजार कर रहा हूं।
आमोन

7

इसी कारण से कि हंगेरियन नोटेशन का अब व्यापक रूप से उपयोग नहीं किया जाता है; Intellisense (या गैर-Microsoft IDE में इसके समकक्ष नैतिक)। अधिकांश आधुनिक आईडीई आपको केवल एक पैरामीटर के बारे में सब कुछ बताएंगे जो आपको पैरामीटर संदर्भ पर केवल मँडरा करके पैरामीटर के बारे में जानने की आवश्यकता है।

इसने कहा, कई भाषाएं पैरामीटर नाम का समर्थन करती हैं, जिनमें C # और डेल्फी शामिल हैं। C # में, यह वैकल्पिक है, इसलिए आपको इसका उपयोग नहीं करना है यदि आप नहीं करना चाहते हैं, और विशेष रूप से सदस्यों को घोषित करने के अन्य तरीके हैं, जैसे ऑब्जेक्ट आरंभीकरण।

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


4
पायथन नामांकित मापदंडों का उपयोग करता है, और यह भाषा की एक अद्भुत विशेषता है। मेरी इच्छा है कि अधिक भाषाओं ने इसका उपयोग किया। यह डिफ़ॉल्ट तर्कों को आसान बनाता है क्योंकि आप सी + + के रूप में मजबूर नहीं हैं, क्योंकि डिफ़ॉल्ट रूप से किसी भी तर्क को "पहले" स्पष्ट रूप से निर्दिष्ट करना है। (जैसा कि आपके अंतिम पैराग्राफ में है, यह है कि बिना किसी ओवरलोडिंग के साथ अजगर कैसे दूर हो जाता है ... डिफ़ॉल्ट तर्क और नाम तर्क आपको सभी समान काम करने देते हैं।) नामांकित तर्क भी अधिक पठनीय कोड के लिए बनाते हैं। जब आपके पास कुछ होता है sin(radians=2), तो आपको "Intellisense" की आवश्यकता नहीं होती है।
रोबोट

2

बैश निश्चित रूप से प्रोग्रामिंग की इस शैली का समर्थन करता है, और पर्ल और रूबी दोनों पासिंग नेम / वैल्यू पैरामीटर सूचियों का समर्थन करते हैं (जैसा कि मूल हैश / मैप समर्थन के साथ कोई भी भाषा होगी)। एक संरचना / रिकॉर्ड या हैश / मैप को परिभाषित करने के लिए चुनने से कुछ भी नहीं रोकता है जो मापदंडों को नाम देता है।

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

ध्यान दें कि अनुभवी प्रोग्रामर ऑर्डर / स्लॉट द्वारा पासिंग मापदंडों के साथ सहज हो गए हैं। आपको यह भी पता चल सकता है कि यह मुहावरा केवल तभी मूल्यवान है जब आपके पास कुछ तर्क से अधिक हो (कहते हैं> 5/6)। और चूंकि बड़ी संख्या में तर्क अक्सर (अत्यधिक) जटिल तरीकों का संकेत देते हैं, आप पा सकते हैं कि यह मुहावरा केवल सबसे जटिल तरीकों के लिए फायदेमंद है।


2

मुझे लगता है कि यह वही कारण है जो c # VB.net से अधिक लोकप्रिय है। जबकि VB.NET अधिक "पठनीय" है जैसे कि आप एक समापन कोष्ठक के बजाय "अंत" टाइप करते हैं, तो यह समाप्त हो जाता है और अधिक सामान होता है जो कोड को पैड करता है और अंततः इसे समझना कठिन हो जाता है।

यह पता चला है कि क्या कोड को समझना आसान बनाता है। कम बेहतर। फंक्शन पैरामीटर नाम आमतौर पर वैसे भी बहुत स्पष्ट होते हैं, और वास्तव में उस कोड को समझने में आपकी मदद नहीं करते हैं।


1
मैं इस बात से असहमत हूं कि "कम बेहतर"। अपने तार्किक चरम पर, कोड गोल्फ विजेता "सर्वश्रेष्ठ" कार्यक्रम होंगे।
रिले मेजर

2

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

foo(1)जिन भाषाओं को रिफलेक्टर करना मुश्किल होता है, वे अक्सर नामांकित मापदंडों का समर्थन करते हैं, क्योंकि foo()परिवर्तनों के हस्ताक्षर foo(name:1)होने पर टूटने वाला है , लेकिन परिवर्तन करने के लिए प्रोग्रामर से कम प्रयास की आवश्यकता होने पर टूटने की संभावना कम है foo

जब आप निम्न फ़ंक्शन के लिए एक नया पैरामीटर लागू करना चाहते हैं, तो आप क्या करते हैं और उस फ़ंक्शन को कॉल करने की सैकड़ों या हजारों लाइनें हैं?

foo(int weight, int height, int age = 0);

अधिकांश प्रोग्रामर निम्नलिखित करेंगे।

foo(int weight, int height, int age = 0, string gender = null);

अब, कोई भी रिफैक्टरिंग की आवश्यकता नहीं होती है और फ़ंक्शन genderशून्य होने पर विरासत मोड में निष्पादित हो सकता है।

विशिष्ट genderमान के लिए अब कॉल में HARDCODED हैage । इस उदाहरण के रूप में:

 foo(10,10,0,"female");

प्रोग्रामर ने फ़ंक्शन परिभाषा को देखा, देखा कि उस ageमूल्य का एक डिफ़ॉल्ट मान है 0और इसका उपयोग किया है।

अब ageफ़ंक्शन परिभाषा में डिफ़ॉल्ट मान पूरी तरह से बेकार है।

नामित पैरामीटर आपको इस समस्या से बचने की अनुमति देते हैं।

foo(weight: 10, height: 10, gender: "female");

नए मापदंडों को जोड़ा जा सकता है fooऔर आपको उनके द्वारा जोड़े गए आदेश के बारे में चिंता करने की ज़रूरत नहीं है और आप डिफ़ॉल्ट मान बदल सकते हैं यह जानकर कि आपने जो डिफ़ॉल्ट सेट किया है वह वास्तव में सही डिफ़ॉल्ट मान है।

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