सरल प्रश्न, लेकिन मैं अक्सर इन तीन शब्दों को इस तरह की गति के साथ परिभाषित सुनता हूं, लेकिन जो मुझे वर्षों से अलग-अलग चीजों के लिए जाना जाता है।
"प्रक्रिया", "तरीके", "कार्य", "सबरूटीन्स", आदि की "सही" परिभाषाएं क्या हैं?
सरल प्रश्न, लेकिन मैं अक्सर इन तीन शब्दों को इस तरह की गति के साथ परिभाषित सुनता हूं, लेकिन जो मुझे वर्षों से अलग-अलग चीजों के लिए जाना जाता है।
"प्रक्रिया", "तरीके", "कार्य", "सबरूटीन्स", आदि की "सही" परिभाषाएं क्या हैं?
जवाबों:
मैं यहां एक अलग उत्तर के साथ जा रहा हूं: व्यावहारिक रूप से बोलना, वास्तव में कोई अंतर नहीं है , मामूली अपवाद के साथ कि "विधि" आमतौर पर ओओ भाषाओं में किसी वस्तु से जुड़े एक सबरूटीन को संदर्भित करता है।
शब्द "प्रक्रिया, फ़ंक्शन, सबरूटीन, सबप्रोग्राम और विधि" सभी का वास्तव में एक ही मतलब है: एक बड़े कार्यक्रम के भीतर एक कॉल करने योग्य उप-प्रोग्राम। लेकिन ऐसी परिभाषा के साथ आना मुश्किल है जो इन शर्तों के सभी प्रकार के उपयोगों को पकड़ती है, क्योंकि वे लगातार प्रोग्रामिंग भाषाओं या प्रतिमानों में उपयोग नहीं किए जाते हैं।
आप कह सकते हैं कि कोई फ़ंक्शन मान लौटाता है। खैर, निम्नलिखित C फ़ंक्शन मान वापस नहीं करता है:
void f() { return; }
... लेकिन मुझे संदेह है कि आपको कोई भी मिल जाएगा जो इसे एक प्रक्रिया कहेगा।
निश्चित रूप से, पास्कल में, प्रक्रियाएँ मान नहीं लौटाती हैं और फ़ंक्शन मान लौटाते हैं, लेकिन यह केवल एक प्रतिबिंब है कि पास्कल को कैसे डिज़ाइन किया गया था। फोरट्रान में, एक फ़ंक्शन एक मान देता है, और एक सबरूटीन कई मान लौटाता है। फिर भी इनमें से कोई भी हमें इन शर्तों के लिए "सार्वभौमिक" परिभाषा के साथ आने की अनुमति नहीं देता है।
वास्तव में, "प्रक्रियात्मक प्रोग्रामिंग" शब्द सी, फोरट्रान और पास्कल सहित भाषाओं की एक पूरी कक्षा को संदर्भित करता है, जिनमें से केवल एक ही वास्तव में कुछ भी करने के लिए "प्रक्रिया" शब्द का उपयोग करता है।
तो यह वास्तव में सुसंगत नहीं है। एकमात्र अपवाद संभवतः "विधि" है, जिसका उपयोग लगभग पूरी तरह से ओओ भाषाओं के साथ किया जाता है, जो एक फ़ंक्शन के साथ जुड़ा हुआ है। हालांकि, यहां तक कि यह हमेशा सुसंगत नहीं है। सी ++, उदाहरण के लिए, आमतौर पर विधि के बजाय "सदस्य फ़ंक्शन" शब्द का उपयोग करता है, (भले ही शब्द "विधि" प्रोग्रामर्स के बीच C ++ वर्नाक्यूलर में क्रेप हो।)
मुद्दा यह है कि इनमें से कोई भी वास्तव में सुसंगत नहीं है। यह उस समय जो भी भाषाएं प्रचलित हैं, उनके द्वारा नियोजित शब्दावली को दर्शाता है।
एक फ़ंक्शन एक मान लौटाता है, लेकिन एक प्रक्रिया नहीं होती है।
एक विधि एक फ़ंक्शन के समान है, लेकिन एक वर्ग के हिस्से के लिए आंतरिक है । शब्द विधि का उपयोग लगभग विशेष रूप से ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में किया जाता है।
function
जेएस में दोनों भूमिकाओं को पूरा करता है, लेकिन जेएस फ़ंक्शन सभी वापसी करते हैं। जब रिटर्न स्टेटमेंट का कोई मूल्य नहीं होता है, तो मान निहित होता है undefined
। जब कोई रिटर्न स्टेटमेंट अनुपस्थित होता है, तो दुभाषिया एक निहित रिटर्न स्टेटमेंट जोड़ता है। Esoteric, हो सकता है, लेकिन यह यहां दी गई परिभाषा के अनुरूप है। यही कारण है कि var x = function() {}();
जेएस में कानूनी है; यदि निहित रिटर्न के लिए नहीं, तो यह एक त्रुटि होने की आवश्यकता है, क्योंकि यह पास्कल में होगा।
एक फ़ंक्शन कुछ ऐसा है जो इनपुट का एक गुच्छा लेता है और एक या अधिक मान लौटाता है। यदि दिए गए मान पूरी तरह से इनपुट द्वारा निर्धारित किए गए हैं, और फ़ंक्शन का कोई साइड इफेक्ट नहीं है (लॉगिंग, शायद, या खुद के बाहर राज्य परिवर्तन का कारण बनता है), तो इसे एक शुद्ध फ़ंक्शन कहा जाता है।
एक प्रक्रिया एक ऐसा फ़ंक्शन है जो मान वापस नहीं करता है। विशेष रूप से, इसका मतलब है कि एक प्रक्रिया केवल दुष्प्रभाव पैदा कर सकती है। (इसमें इनपुट पैरामीटर को बदलना शामिल हो सकता है!)
एक विधि एक फ़ंक्शन है जो चर के एक सेट पर बंद हो जाता है, अर्थात, एक बंद । यह शून्य या अधिक इनपुट पैरामीटर लेता है, चर के इस सेट तक पहुंच है, और शून्य या अधिक मान लौटाता है। OO भाषाओं में ये विधियाँ वस्तुओं या कक्षाओं से जुड़ी होती हैं।
अधिकांश मुख्यधारा की ओओ भाषाओं में, उन क्लोज-ओवर वेरिएबल्स को ऑब्जेक्ट के सदस्य क्षेत्र या उदाहरण के चर कहा जाता है। एक विधि एक शुद्ध कार्य, एक अशुद्ध कार्य या एक प्रक्रिया हो सकती है।
बाद की परिभाषा वस्तु की ओर जाती है = संरचना + बंद पत्राचार।
foo.doSomething()
पैरामीटर रहित नहीं है। इसमें foo
कुछ सिंटैक्टिक शुगर के साथ एक पैरामीटर (ऑब्जेक्ट ) होता है। इस तरह के एक पैरामीटर की आवश्यकता के बिना एक बंद अपने ऑब्जेक्ट को संदर्भित करने में सक्षम होगा। यह कहना है कि विधियों को बंद नहीं किया जा सकता है, बस यह नहीं है, और यह कि OO होना बंद करने के लिए एक भाषा के लिए पर्याप्त नहीं है।
foo.doSomething()
foo
चर पर बंद हो जाता है। आपकी भाषा के आधार पर कोई भी बयान या के माध्यम से doSomething
पहुंच सकता है । यह "क्लोज ओवर" की बहुत परिभाषा है। कक्षाएं अपने सदस्य चरों पर बंद हो जाती हैं, इसलिए ("OO क्या है" की अनदेखी करते हुए), OO पर्याप्त है। यह साहित्य में बहुत प्रसिद्ध है ...foo
this
self
foo.
सामने थोड़ा देखो foo.doSomething()
? कि आप doSomething()
एक पैरामीटर पास कर रहे हैं। सिर्फ इसलिए कि यह कोष्ठक के बीच नहीं है इसका मतलब यह नहीं है कि यह एक पैरामीटर नहीं है। this
या self
विधि के अंदर उस पैरामीटर संदर्भित करने के लिए बस वाक्यात्मक चीनी है।
ब्रूस के पास एक अच्छा जवाब है । मैं जोड़ूंगा, शब्दार्थ:
printf
)A procedure should "do something" to the arguments
- या कुछ अन्य दुष्प्रभाव (जैसे printf
)।
printf
एक मान लौटाता है - मुद्रित वर्णों की संख्या - तो यह तकनीकी रूप से एक कार्य है।
printf
यह एक मूल्य है। इसके आह्वान के दायरे के बाहर इसका विशिष्ट साइड इफेक्ट था: अर्थात I / O जो भी मानक आउटपुट इसके होने का अनुमान था। भले ही, स्कॉट स्पष्ट रूप से इस अंतर को स्पष्ट नहीं कर रहा था, कार्यात्मक प्रोग्रामिंग कार्यों में साइड इफेक्ट्स होने की संभावना नहीं है, और प्रश्नों का उत्तर देने में सक्षम होना चाहिए जैसे कि आपके पास वास्तविक डेटा था जो इसे लौटाता है।
ऊपर अच्छा विस्तृत जवाब; लघुकथा यह है कि वे सबरूटीन्स के सभी स्वादों को प्राप्त करेंगे; प्रत्येक शब्द का अर्थ प्रोग्रामिंग भाषा के संदर्भ के अनुसार अलग-अलग होगा
सामान्य तौर पर, फ़ंक्शन एक मान लौटाते हैं, लेकिन उनके पास नहीं है
विधियाँ वर्तमान में एक सामान्य OOP शब्द हैं
SQL में, संग्रहीत कार्यविधियों में आउटपुट होते हैं, लेकिन आम तौर पर केवल एक त्रुटि कोड लौटता है, जबकि उपयोगकर्ता द्वारा परिभाषित कार्यों को एक मान लौटना चाहिए (जो एक परिणाम हो सकता है)
फिर, इन शब्दों के बीच सटीक अंतर इस बात पर निर्भर करता है कि आप किससे बात कर रहे हैं!
80% प्रवीणता सीधे नामकरण के साथ परिचित से संबंधित है,
उत्पादकता का 95% यह पहचानने की क्षमता है कि इसका वर्णन करने के लिए इस्तेमाल की गई शर्तों के बावजूद इस समय क्या उपयोगी है
मैं बहुत ज्यादा उन सभी तरीकों को सी # में कॉल करना पसंद करता हूं, जब मैं MSSQL का इस्तेमाल करता हूं, तब तक सिवाय इसके कि हमने स्प्रोक्स किया था, लेकिन निश्चित रूप से अब हम पोस्टग्रैज का उपयोग करते हैं और उन्हें फ़ंक्शन कहा जाता है।