एक पठनीयता सहायता के रूप में नामित तर्क (पैरामीटर)


11

बहुत समय पहले मैंने एडीए में बहुत प्रोग्राम किया था, और किसी फ़ंक्शन को लागू करते समय तर्कों को नाम देना सामान्य था - SomeObject.DoSomething (SomeParameterName => someValue);

अब जब C # नामित तर्कों का समर्थन करता है, तो मैं इस आदत को उन स्थितियों में बदलने के बारे में सोच रहा हूँ जहाँ यह स्पष्ट नहीं हो सकता है कि तर्क का क्या अर्थ है।

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

contentFetcher.DownloadNote (नोट, मैनुअल: सच);

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

कोड को पढ़ने में आसान बनाने के लिए आप कभी-कभार नामित तर्कों का उपयोग करने के बारे में क्या सोचते हैं?


तरीकों के शीर्ष पर पैरामीटर टिप्पणी भी मदद करती है।
अमीर रज़ाई

1
@ amir-rezaei: विधियों के शीर्ष पर पैरामीटर टिप्पणियां केवल तभी मदद करती हैं जब आप टिप्पणियों पर भरोसा कर सकते हैं। जब तक आपके पास अच्छे डेवलपर और अच्छे कोड की समीक्षा प्रक्रिया नहीं होगी, मैं टिप्पणियों पर भरोसा नहीं करूंगा।
btilly

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

मैं मानता हूं कि अडा में आपका उपयोग फिर से होगा - यह कुछ ऐसा नहीं था जो हमने हर समय किया था, लेकिन जहां यह मदद की।
डेमियन

जवाबों:


7

यह सी ++ के विकास में सुझाव दिया गया था, और स्ट्रॉस्ट्रुप ने अपने "डिजाइन और सी ++ का विकास", पृष्ठ 153 और निम्नलिखित पर चर्चा की। प्रस्ताव को अच्छी तरह से गठित किया गया था, और एडीए के साथ पूर्व अनुभव पर आकर्षित किया गया था। इसे अपनाया नहीं गया था।

सबसे बड़ा कारण यह था कि कोई भी बड़ी संख्या में मापदंडों के साथ कार्यों को प्रोत्साहित नहीं करना चाहता था। किसी भाषा में प्रत्येक अतिरिक्त सुविधा के लिए कुछ खर्च होता है, और खराब कार्यक्रमों को लिखने के लिए एक सुविधा को जोड़ने की कोई इच्छा नहीं थी।

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

यह फ़ंक्शन कॉल के बजाय ऑब्जेक्ट का उपयोग करके भी नियंत्रित किया जा सकता है। एक दर्जन मापदंडों के साथ GetWindow कॉल के बजाय, एक दर्जन निजी चर के साथ एक विंडो वर्ग बनाएं, और आवश्यक के रूप में सेटर्स जोड़ें। बसने वालों का पीछा करते हुए, ऐसा कुछ लिखना संभव है my_window.SetColor(green).SetBorder(true).SetBorderSize(3);। विभिन्न डिफॉल्ट के साथ अलग-अलग फ़ंक्शन करना भी संभव है जो फ़ंक्शन को कॉल करता है जो वास्तव में काम करता है।

यदि आप अभी के प्रलेखन प्रभाव के बारे में चिंतित हैं contentFetcher.DownloadNote(note, manual : true);, तो आप हमेशा कुछ लिख सकते हैं contentFetcher.DownloadNote(note, /* manual */ true);, इसलिए यह प्रलेखन में भी बहुत उपयोगी नहीं है।


मजेदार रूप से पर्याप्त जब मैं एडा से सी में चला गया, मैंने आपके द्वारा वर्णित सम्मेलन का उपयोग करना शुरू कर दिया - कोड समीक्षकों ने हालांकि इससे नफरत की। बड़ी संख्या में मापदंडों के लिए इसका उपयोग नहीं करने पर सहमत हों।
डेमियन

7

मुझे लगता है कि यह "सर्वोत्तम अभ्यास" के बजाय खराब कोड को अधिक पठनीय बनाने का मुद्दा है।

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

जब विधियों में केवल 1 या 2 पैरामीटर होते हैं और यह विधि नाम से स्पष्ट है कि पैरामीटर क्या हैं, तो नामित पैरामीटर कुछ भी नहीं जोड़ते हैं। यह आदर्श मामला है।

यदि आप जिस भी कोड पर काम करते हैं, उसे " क्लीन कोड " पुस्तक के रूप में लिखा जाता है , तो आपके पास नामित मापदंडों के लिए बहुत कम उपयोग होगा, हालांकि हम वास्तविक दुनिया में रहते हैं।


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

1
@ स्टीव 314 उदाहरण:void TrackDataChange(Data oldData, Data newData)
अलेक्जेंडर

3

मैं सहमत हूं कि पैरामीटर नाम जोड़ने से यह अधिक पठनीय हो जाता है। हालाँकि, मैंने जिन पुस्तकों को पढ़ा है उनमें से अधिकांश बूलियन स्विच को एक बुरा अभ्यास मानते हैं। मैं कभी-कभी ऐसा करता हूं:

public Content DownloadNote(Note note)
{
    return downloadNote(note, manual: false);
}

public Content DownloadNoteManually(Note note)
{
    return downloadNote(note, manual: true);
}

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


3
यदि आपके पास एक्स विकल्प हैं, तो क्या आप 2 ^ x फ्रंटेंड बनाएंगे?
apoorv020

@ apoorv020 - अगर मेरे पास मेथड कॉल करने के लिए पर्याप्त पैरामीटर हैं कि 2 ^ x महत्वपूर्ण हो गया है, मैं पैरामीटर मान रखने के लिए एक नया वर्ग बनाऊंगा, और बस एक पैरामीटर पास करूंगा।
स्कॉट व्हिटलॉक

@ स्कॉट-वाइटलॉक: विकल्प 1 - एक ऑब्जेक्ट बनाएं, एक्स गुण सेट करें, अपनी वस्तु के साथ एक बार एक विधि को कॉल करें। विकल्प 2 - एक्स नाम के मापदंडों के साथ एक विधि को कॉल करें। जो बेहतर है वह आपकी भाषा पर निर्भर करता है। गतिशील रूप से टाइप की गई भाषा में, विकल्प 1 को बिना किसी लाभ के साथ अधिक बॉयलर-प्लेट की आवश्यकता होती है, और इसलिए यह बदतर है। सांख्यिकीय रूप से टाइप की गई भाषा में आप अभी भी बॉयलरप्लेट को जोड़ते हैं, लेकिन गलत तरीके से नामित चाबियों के परीक्षण को रन समय के बजाय संकलन समय पर किया जाता है। इसलिए C # में विकल्प 1 बेहतर है, लेकिन विकल्प 2 पायथन में एक स्पष्ट जीत है।
btilly

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

@ स्कॉट-वाइटलॉक: क्या हम वास्तव में असहमत हैं? हम सी # में सबसे अच्छा है पर सहमत हैं। हम दोनों जानते हैं कि क्लीन कोड क्या कहता है। मेरा कहना था कि यह समझना महत्वपूर्ण है कि यह अच्छा क्यों है, ताकि आप यह जान सकें कि सलाह कब होती है या किसी अलग वातावरण में नहीं बैठती है।
btilly

3

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

कहा जा रहा है, नामांकित पैरामीटर समझदार तर्क सूचियों को बनाने के लिए एक विकल्प नहीं होना चाहिए, सहायक वस्तुओं का उपयोग करके (एक साथ शब्दार्थ रूप से संबंधित तर्कों को "टाई" करने के लिए, और उन गणनाओं का उपयोग करके जहां प्रासंगिक हो।


0

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

मुझे लगता है कि यह एक हद तक अधिक पठनीय है; लेकिन जैसा कि दूसरों ने उल्लेख किया है, कई मापदंडों में एक कोड गंध है, इसलिए मुझे इसके लिए C # जैसी ऑब्जेक्ट-ओरिएंटेड भाषा में इसके लिए बहुत अधिक उपयोग नहीं दिखता है।

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