फ़ंक्शन केवल अपरिवर्तित पैरामीटर देता है, बेकार?


15

मैं अभी जिस प्रोजेक्ट में काम कर रहा हूं उसमें यह फंक्शन मिला:

  -- Just returns the text unchanged.
  -- Note: <text> may be nil, function must return nil in that case!
  function Widget:wtr(text)
      return text
  end

बहुत दुखी है, कंपनी में अब कोडर काम नहीं करता है। कोई ऐसा फ़ंक्शन क्यों करेगा जो कुछ भी नहीं करता है, लेकिन इसके साथ बुलाया पैरामीटर लौटाता है?

क्या इस तरह के फ़ंक्शन का कोई उपयोग है, इस उदाहरण के लिए निर्दिष्ट नहीं है, लेकिन किसी भी मामले में कुल मिलाकर?

के चलते

function aFunction(parameter)
    return parameter
end

में समाप्त

aFunction(parameter) == parameter

मैं ऐसा कुछ क्यों लिखूंगा

aFunction(parameter) == whatIWantToCheck

के बजाय

parameter == whatIWantToCheck

?



13
@gnat पृथ्वी पर कैसे एक डुप्लिकेट है?
किलन फ़ॉथ

13
है ना? यह फ़ंक्शन अपने पैरामीटर को लौटाता है - चेनिंग में रिटर्निंग शामिल है this
किलियन फोथ

11
@gnat सवाल यह है कि कोई कभी ऐसा फंक्शन क्यों लिखेगा, जिसमें खुद को छोड़कर कुछ भी नहीं होता है। हाँ, आप कुछ चीजों या मानों को विधि-निर्धारण की अनुमति दे सकते हैं, लेकिन यह उनका प्रश्न नहीं है। उनका सवाल यह है कि कोई व्यक्ति कभी ऐसा क्यों लिखेगा जैसे int getParam(int param) { //DO NOTHING return param; } कि पद्धति के परिप्रेक्ष्य में यह पूरी तरह से निरर्थक और अनावश्यक कॉल है क्योंकि आप ओपी के फ़ंक्शन को एक विधि श्रृंखला से बाहर छोड़ सकते हैं और इससे एक भी फर्क नहीं पड़ेगा।
जीरोस्टैटिक

4
यह संभवतः अपमानजनक है और लुआ पर लागू नहीं होता है, लेकिन PHP में इसके लिए एक वैध उपयोग-मामला है - पुराने संस्करणों में, new Foo()->method();मान्य सिंटैक्स नहीं था, और जैसे निर्माण function with($what) { return $what; }; with(new Foo())->method();का उपयोग वर्कअराउंड के रूप में किया गया था।
DCoder

जवाबों:


57

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

एक और तरीका रखो, यह एक आसान डिफ़ॉल्ट फ़ंक्शन बनाता है। जैसे आप offset = 0एक डिफ़ॉल्ट पूर्णांक के रूप में सेट करना चाहते हैं , भले ही वह ऑफ़सेट कुछ भी नहीं करता है, यह filterFunction = identityएक डिफ़ॉल्ट फ़ंक्शन के रूप में सेट करने में सक्षम होने के लिए काम में आ सकता है , भले ही वह फ़िल्टर कुछ भी नहीं करता है।


क्या फ़िल्टर फ़ंक्शन को बूलियन मान वापस नहीं करना चाहिए? इस स्थिति में "शून्य" फिल्टर फ़ंक्शन वह होगा जो सही रिटर्न देता है।
Kirill Rakhman

1
@ ज्येष्ठ एक नक्शा समारोह, तब।
सपि

6
या इसे एक डिजाइन अवधारणा के तहत छड़ी करने के लिए: अशक्त वस्तु पैटर्न , फ़ंक्शन संस्करण
blgt

@ गंभीर, यह एक विधेय के लिए होगा जो एक उच्च-क्रम फ़ंक्शन में एक तर्क के रूप में पारित हो जाता filterहै। पहले क्रम के filterकार्य का प्रकार होता है [a] -> [a],
कार्ल बेवेलफेल्ट

उदाहरण के लिए C # I में प्रायः .OrderBy(x => x)
CodeInChaos

27

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

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


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

3
@Sempie फिर, अगर एपीआई को एक फॉर्मेटिंग फ़ंक्शन की आवश्यकता होती है , तो अनएलेक्टेड टेक्स्ट प्राप्त करने का एकमात्र तरीका यह है कि फ़ंक्शन टेक्स्ट को कुछ भी नहीं करता है।
डोभाल

3
दूसरे शब्दों में: यदि आपके पास कोई फ़ंक्शन है जिसे फ़िल्टर / स्वरूप तर्क पास करने की आवश्यकता है , और आप बिल्कुलnull तर्क के रूप में उपयोग नहीं कर सकते हैं , तो आप एक खाली फ़िल्टर फ़ंक्शन का उपयोग करते हैं जो प्रोग्राम को शिकायत करने से रोकने के लिए 'कुछ नहीं' के साथ फ़िल्टर करता है।
जीरोस्टैटिक

3
@Sempie आपने एसक्यूएल के साथ काम किया है, है ना? आप जानते हैं कि आपको एक WHEREक्लॉज़ शामिल करने या न करने के लिए कैसे मिलता है ? यह शिथिल चीनी की बात है। अनिवार्य रूप से एक WHEREखंड की अनुपस्थिति ठीक उसी तरह है जैसे कि आपके पास एक WHEREखंड था जो बस आगे बढ़ता है और सब कुछ की अनुमति देता है। तथ्य यह है कि एसक्यूएल के डिजाइनर आपको एक WHEREखंड निर्दिष्ट नहीं करते हैं , इसके बजाय आप एक नीचे रख देते हैं, यहां तक ​​कि जब यह सब कुछ स्वीकार करता है, तो अधिक-या-कम सिंथैटिक शुगर होता है, और उन्होंने आपको केवल सरल सुविधा के लिए वह विकल्प प्रदान किया है। ..
पैंजरक्रिस

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

15

क्या यह सिर्फ एक बहुरूपता नहीं है?

क्यूटी tr() और wtr()विधियों के साथ मेरे अनुभव का उपयोग किया जाना चाहिए (वहां, क्यूटी में ) के Widgetपाठ के स्थानीयकरण में ।

तो, अपरिवर्तित पाठ को वापस करके यह विधि बस कहती है Widget does no localization (translation of the text) by default. Override this function to enable your own logic:।


1
एहसास नहीं था कि यह क्यूटी बात है - यह स्पष्ट रूप से जवाब है।
Corley Brigman

8

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

function getIndex(index)
    return index
end

और जब से आपका सूचकांक 0 से शुरू होता है यह सब ठीक है। आप बाद में एक घटक को कहीं और बदल देते हैं, इस घटक को 1 पर शुरू करने के लिए आपको अपने सूचकांक का अनुवाद करने की आवश्यकता है। आपको अपने कोड में हर जगह सैकड़ों सूचकांक + 1 जोड़ना होगा। लेकिन इस तरह एक विधि के साथ, बस कहते हैं:

 function getIndex(index)
    return index+1
end

और तुम ठीक हो इस तरह के कार्य जल्दी से अति-इंजीनियरिंग का कारण बन सकते हैं लेकिन कुछ बिंदुओं पर वे बहुत मायने रखते हैं!


2
हां, हालांकि यह ध्यान देने योग्य है कि ओपी द्वारा पोस्ट किए गए फ़ंक्शन का सिद्धांत यह नहीं बताता है कि यह उनके मामले में फ़ंक्शन का उद्देश्य है।
मार्क अमेरी

6

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


5

एक अतिरिक्त परिदृश्य गुणों के अजगर और सी # में उपयोग के समान है, लेकिन उन भाषाओं में जिनके पास सुविधा नहीं है।

सामान्य तौर पर, आप कक्षा के सदस्य के रूप में कुछ घोषित कर सकते हैं; मान लीजिए, एक स्ट्रिंग के रूप में 'नाम' है। इसका मतलब है कि आप इसे इस तरह एक्सेस करते हैं:

someobject.name

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

someobject.name()

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

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

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

टीएल; डीआर यह भविष्य में होने वाले परिवर्तनों के लिए आगे की योजना बनाने वाला एक बुद्धिमान प्रोग्रामर हो सकता है।


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

1
यह करने के लिए नहीं है ... इसका मतलब है कि अभी, मैं इस डेटा को संसाधित नहीं करता हूं, लेकिन बाद में, अगर मैं इसे संसाधित करना चाहता हूं, तो उस डेटा के प्रत्येक उपयोगकर्ता को मुफ्त में संसाधित डेटा मिलता है। मूर्खतापूर्ण उदाहरण: मान लीजिए कि आप स्क्रीन पर तार प्रिंट करते हैं, और आप आमतौर पर करते हैं print data। फिर बाद में, आपको एहसास होता है कि सभी तारों को ऊपरी मामला होना चाहिए - आपको अपने कार्यक्रम में हर प्रिंट ढूंढना होगा और इसमें बदलाव करना होगा print data.upper()। लेकिन अगर आपके पास है def cdata(data): return dataऔर हर जगह कहता है print cdata(data), तो आप बस बदल जाते हैं def cdata(data): return data.upper()और यह एकमात्र परिवर्तन है।
Corley Brigman

मैं देख रहा हूं कि आपका वहां क्या मतलब है। इससे अधिक समझ में आता है
मैथ्यू स्टीवर्स

2

यह बेकार नहीं है, वास्तव में यह बेहद उपयोगी हो सकता है, क्योंकि यह आपके कोड को अधिक समान और लचीला बनाता है।

उदाहरण के लिए, यह कहें कि आपके पास लोगों की एक सूची है और उपयोगकर्ता के लिए चयन करने के लिए एक ड्रॉपडाउन है कि क्या हम "सभी" या "पुरुष" या "महिला" देखना चाहते हैं।

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


4
यह परिदृश्य फिट नहीं है। मेरा मतलब था कि एक ऐसा फंक्शन जो उसके मापदंडों को लौटाए और किसी भी मामले में कुछ और न करे।
सेम्पी

@ कर्मचारी: यही वह कह रहा है। यदि आपके पास एक Filterवर्ग या इंटरफ़ेस है जिसमें MaleFilterऔर FemaleFilterउपवर्ग हैं, और आपके कोड को कुछ फ़िल्टर की आवश्यकता होती है, एक फ़िल्टर जो कुछ भी नहीं करता है (इसके पैरामीटर को अपरिवर्तित लौटाता है) यह है कि आप कैसे संभालते हैं All। फ़ंक्शन कभी भी कुछ नहीं करता है, लेकिन जो करता है, उसके लिए प्रतिस्थापित किया जा सकता है।
मैजस

@ मैगस, लेकिन आपके परिदृश्य में फ़ंक्शन किसी प्रकार का प्लेसहोल्डर विच है, जिसे बाद में बदल दिया जाएगा, या बस मौजूद होगा क्योंकि पुराना फ़ंक्शन अप्रचलित हो गया है, लेकिन प्रोग्राम को इस पोज़स्ट्रॉ की आवश्यकता है। वैसे भी, यह एक हैंडओवर नहीं है। फ़ंक्शन किसी अन्य फ़ंक्शन को अपरिवर्तित पैरामीटर नहीं देता है, जैसा कि फ़िल्टर कर सकता है, लेकिन इसे कॉलिंग फ़ंक्शन पर वापस कर देता है।
सेमेपी

@ सेम्पी नहीं, यह न तो एक प्लेसहोल्डर है, न ही यह एक अस्थायी पैशाच के रूप में उपयोग किया जाता है। यह एक उपयोगी कोडिंग (और गणितीय) धारणा है, "पहचान" फ़ंक्शन। और, हां, यह अभी भी एक हैंडओवर है, चाहे वह इसे "दूसरे फ़ंक्शन" या कॉलिंग फ़ंक्शन पर लौटाए। कुंजी यह है कि "पहचान" फ़ंक्शन कॉलिंग फ़ंक्शन द्वारा बुलाए गए कई संभावित कार्यों में से एक हो सकता है, और इसका उपयोग किया जाता है अगर और विशेष-आवरण से बचने के लिए जब बुलाया फ़ंक्शन को कुछ भी करने की आवश्यकता नहीं है।
हज्जाजमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.