विधि बनाम प्रक्रिया बनाम प्रक्रिया


107

सरल प्रश्न, लेकिन मैं अक्सर इन तीन शब्दों को इस तरह की गति के साथ परिभाषित सुनता हूं, लेकिन जो मुझे वर्षों से अलग-अलग चीजों के लिए जाना जाता है।

"प्रक्रिया", "तरीके", "कार्य", "सबरूटीन्स", आदि की "सही" परिभाषाएं क्या हैं?


4
आप "दिनचर्या" से
गुजरते हैं

1
@teresko: मुझे लगता है कि "सबरूटीन" अधिक सामान्य है।
mk12

जवाबों:


108

मैं यहां एक अलग उत्तर के साथ जा रहा हूं: व्यावहारिक रूप से बोलना, वास्तव में कोई अंतर नहीं है , मामूली अपवाद के साथ कि "विधि" आमतौर पर ओओ भाषाओं में किसी वस्तु से जुड़े एक सबरूटीन को संदर्भित करता है।

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

आप कह सकते हैं कि कोई फ़ंक्शन मान लौटाता है। खैर, निम्नलिखित C फ़ंक्शन मान वापस नहीं करता है:

void f() { return; }

... लेकिन मुझे संदेह है कि आपको कोई भी मिल जाएगा जो इसे एक प्रक्रिया कहेगा।

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

वास्तव में, "प्रक्रियात्मक प्रोग्रामिंग" शब्द सी, फोरट्रान और पास्कल सहित भाषाओं की एक पूरी कक्षा को संदर्भित करता है, जिनमें से केवल एक ही वास्तव में कुछ भी करने के लिए "प्रक्रिया" शब्द का उपयोग करता है।

तो यह वास्तव में सुसंगत नहीं है। एकमात्र अपवाद संभवतः "विधि" है, जिसका उपयोग लगभग पूरी तरह से ओओ भाषाओं के साथ किया जाता है, जो एक फ़ंक्शन के साथ जुड़ा हुआ है। हालांकि, यहां तक ​​कि यह हमेशा सुसंगत नहीं है। सी ++, उदाहरण के लिए, आमतौर पर विधि के बजाय "सदस्य फ़ंक्शन" शब्द का उपयोग करता है, (भले ही शब्द "विधि" प्रोग्रामर्स के बीच C ++ वर्नाक्यूलर में क्रेप हो।)

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


यह वही है जो मैंने सोचा था कि जवाब था। (मैं "सबरूटीन" को एक अन्य संस्करण के रूप में शामिल करना चाहिए। क्योंकि यह तकनीकी रूप से गलत है, या क्योंकि "प्रक्रिया" शब्द वर्तमान में प्रचलन से बाहर है?
जोंगो रेनहार्ड्ट

7
C प्रोग्रामर "फ़ंक्शन" शब्द का उपयोग केवल इसलिए करते हैं क्योंकि C के डिजाइनर उस शब्द का उपयोग करते हैं।
चार्ल्स साल्विया

15
चलो बच्चे को स्नान के पानी के साथ बाहर न फेंकें। सिर्फ इसलिए कि शब्दावली का उपयोग पूर्ण स्थिरता के साथ नहीं किया जाता है, इसका मतलब यह नहीं है कि विभिन्न शब्दों के अलग-अलग अर्थ नहीं हैं। @ ब्रूस और @ फ्रैंक की परिभाषाएं व्यापक रूप से मान्यता प्राप्त हैं, न कि अज्ञात। तथ्य यह है कि अर्थ सार्वभौमिक नहीं हैं महत्वपूर्ण है, लेकिन यह "व्यावहारिक रूप से बोलने, वास्तव में कोई अंतर नहीं है" छलांग को उचित नहीं ठहराता है। (@ डिंगो)
लार्स

9
C ++ में दोहरी की तरह, जो "सदस्य फ़ंक्शंस", जावा और C # कॉल फ़ंक्शंस को "स्टैटिक मेथड्स" कहता है।
जॉर्ग डब्ल्यू मित्तग

2
यदि आप प्रोग्रामिंग में नए हैं तो ब्रूस का जवाब निश्चित रूप से आपको चाहिए। उसकी परिभाषाएँ 99% समय के हिसाब से बिल्कुल सही होंगी। लेकिन मैं एक तकनीकी / सैद्धांतिक उत्तर की तलाश में था। कभी-कभी नए प्रोग्रामर केवल अपने स्वयं के डोमेन को जानते हैं, और जोर देते हैं कि सब कुछ है। वास्तव में आज भी प्रोग्रामर काम कर रहे हैं जो अभी भी पुरानी भाषाओं का उपयोग करते हैं, और जो विभिन्न परिभाषाओं का उपयोग करने के लिए "गलत" नहीं हैं। यही मेरी सबसे ज्यादा दिलचस्पी थी।
जिआंगो रेनहार्ड्ट

67

एक फ़ंक्शन एक मान लौटाता है, लेकिन एक प्रक्रिया नहीं होती है।

एक विधि एक फ़ंक्शन के समान है, लेकिन एक वर्ग के हिस्से के लिए आंतरिक है । शब्द विधि का उपयोग लगभग विशेष रूप से ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में किया जाता है।


8
बिल्कुल आंतरिक नहीं। एक विधि किसी भी कार्य या प्रक्रिया है जो एक वर्ग का हिस्सा है।
स्कॉट व्हाइटलॉक

8
तो एसक्यूएल में एक "संग्रहीत प्रक्रिया" किसी भी मूल्य को वापस नहीं करता है? पास्कल जैसी किसी चीज़ में "प्रक्रिया" के बारे में क्या? क्या आपकी परिभाषाएँ वर्तमान रुझानों पर आधारित हैं या उन्हें सार्वभौमिक परिभाषा माना जाना चाहिए? धन्यवाद!
जोंगो रेनहार्ड्ट

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

1
FWIW, FORTRAN में शुरुआती दिनों से ही SUBROUTINEs और FUNCTION मौजूद थे, अंतर यह है कि SUBROUTINE एक मान नहीं लौटाता था। मुझे ALGOL के बारे में याद नहीं है, जो पास्कल के वंशज हैं।
डेविड थॉर्नले

2
@ 3p1c_d3m0n यह निश्चित रूप से सच है कि functionजेएस में दोनों भूमिकाओं को पूरा करता है, लेकिन जेएस फ़ंक्शन सभी वापसी करते हैं। जब रिटर्न स्टेटमेंट का कोई मूल्य नहीं होता है, तो मान निहित होता है undefined। जब कोई रिटर्न स्टेटमेंट अनुपस्थित होता है, तो दुभाषिया एक निहित रिटर्न स्टेटमेंट जोड़ता है। Esoteric, हो सकता है, लेकिन यह यहां दी गई परिभाषा के अनुरूप है। यही कारण है कि var x = function() {}();जेएस में कानूनी है; यदि निहित रिटर्न के लिए नहीं, तो यह एक त्रुटि होने की आवश्यकता है, क्योंकि यह पास्कल में होगा।
सेमीकॉलन

52

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

एक प्रक्रिया एक ऐसा फ़ंक्शन है जो मान वापस नहीं करता है। विशेष रूप से, इसका मतलब है कि एक प्रक्रिया केवल दुष्प्रभाव पैदा कर सकती है। (इसमें इनपुट पैरामीटर को बदलना शामिल हो सकता है!)

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

अधिकांश मुख्यधारा की ओओ भाषाओं में, उन क्लोज-ओवर वेरिएबल्स को ऑब्जेक्ट के सदस्य क्षेत्र या उदाहरण के चर कहा जाता है। एक विधि एक शुद्ध कार्य, एक अशुद्ध कार्य या एक प्रक्रिया हो सकती है।

बाद की परिभाषा वस्तु की ओर जाती है = संरचना + बंद पत्राचार।


5
तो एक वस्तु चर का एक संग्रह और इन आम चर पर बंद होने का एक संग्रह है। मूल रूप से, ऑब्जेक्ट-ओरिएंटेड भाषाओं में हमेशा क्लोजर होता है और किसी को नहीं पता होता है? दिलचस्प दृश्य! +1
जियोर्जियो

1
मुझे विश्वास नहीं है कि अधिकांश तरीके किसी भी चीज़ के करीब हैं। foo.doSomething()पैरामीटर रहित नहीं है। इसमें fooकुछ सिंटैक्टिक शुगर के साथ एक पैरामीटर (ऑब्जेक्ट ) होता है। इस तरह के एक पैरामीटर की आवश्यकता के बिना एक बंद अपने ऑब्जेक्ट को संदर्भित करने में सक्षम होगा। यह कहना है कि विधियों को बंद नहीं किया जा सकता है, बस यह नहीं है, और यह कि OO होना बंद करने के लिए एक भाषा के लिए पर्याप्त नहीं है।
8bittree

3
foo.doSomething()fooचर पर बंद हो जाता है। आपकी भाषा के आधार पर कोई भी बयान या के माध्यम से doSomethingपहुंच सकता है । यह "क्लोज ओवर" की बहुत परिभाषा है। कक्षाएं अपने सदस्य चरों पर बंद हो जाती हैं, इसलिए ("OO क्या है" की अनदेखी करते हुए), OO पर्याप्त है। यह साहित्य में बहुत प्रसिद्ध है ...foothisself
फ्रैंक शीयर

1
एर कोई। कि foo.सामने थोड़ा देखो foo.doSomething()? कि आप doSomething()एक पैरामीटर पास कर रहे हैं। सिर्फ इसलिए कि यह कोष्ठक के बीच नहीं है इसका मतलब यह नहीं है कि यह एक पैरामीटर नहीं है। thisया selfविधि के अंदर उस पैरामीटर संदर्भित करने के लिए बस वाक्यात्मक चीनी है।
8bittree

1
@FrankShearar, मैं कहूंगा कि कंप्यूटिंग में केवल दो स्पष्ट रूप से स्पष्ट अंतर हैं - डेटा, और निर्देश। यहां तक ​​कि सेल्फ-मॉडिफाइंग कोड के मामले में (असामान्य) विंडो बाहर जाती है। OO में, जिसे आम तौर पर एक "विधि" (या "सदस्य फ़ंक्शन") के रूप में संदर्भित किया जाता है, आपको या तो अपनी परिभाषा के अनुसार विधि या कार्य करने की आवश्यकता नहीं है - सामान्य उपयोग के ये सभी शब्द प्रभावी रूप से एक सामान्य और विनिमेय अर्थ के साथ समानार्थी हैं। "अशुद्ध कार्य" जिसका अस्तित्व आप के लिए है, बस एक और है (और सबसे लंबे समय तक घुमावदार और शब्दजाल) भी समान "निर्देश" की सामान्य अवधारणा के लिए पर्यायवाची है।
स्टीव

14

ब्रूस के पास एक अच्छा जवाब है । मैं जोड़ूंगा, शब्दार्थ:

  • एक प्रक्रिया को तर्कों के लिए "कुछ करना" चाहिए या कुछ अन्य दुष्प्रभाव पैदा करना चाहिए (जैसे printf)
  • एक फ़ंक्शन को तर्कों के बारे में एक प्रश्न का उत्तर देना चाहिए, या (ख) तर्कों के आधार पर एक नए मूल्य की गणना करें
  • एक फ़ंक्शन विधि को ऑब्जेक्ट की स्थिति के बारे में एक प्रश्न का उत्तर देना चाहिए
  • एक प्रक्रिया विधि वस्तु की स्थिति को बदलना चाहिए

बहुत बढ़िया जवाब! बस एक छोटा सा जोड़: A procedure should "do something" to the arguments- या कुछ अन्य दुष्प्रभाव (जैसे printf)।
एलोन गुरेलनेक

1
@ सभी नोट जो printfएक मान लौटाता है - मुद्रित वर्णों की संख्या - तो यह तकनीकी रूप से एक कार्य है।
Sjoerd

@Sjoerd मैं सहमत नहीं हूं कि printfयह एक मूल्य है। इसके आह्वान के दायरे के बाहर इसका विशिष्ट साइड इफेक्ट था: अर्थात I / O जो भी मानक आउटपुट इसके होने का अनुमान था। भले ही, स्कॉट स्पष्ट रूप से इस अंतर को स्पष्ट नहीं कर रहा था, कार्यात्मक प्रोग्रामिंग कार्यों में साइड इफेक्ट्स होने की संभावना नहीं है, और प्रश्नों का उत्तर देने में सक्षम होना चाहिए जैसे कि आपके पास वास्तविक डेटा था जो इसे लौटाता है।
एलन

4

ऊपर अच्छा विस्तृत जवाब; लघुकथा यह है कि वे सबरूटीन्स के सभी स्वादों को प्राप्त करेंगे; प्रत्येक शब्द का अर्थ प्रोग्रामिंग भाषा के संदर्भ के अनुसार अलग-अलग होगा

सामान्य तौर पर, फ़ंक्शन एक मान लौटाते हैं, लेकिन उनके पास नहीं है

विधियाँ वर्तमान में एक सामान्य OOP शब्द हैं

SQL में, संग्रहीत कार्यविधियों में आउटपुट होते हैं, लेकिन आम तौर पर केवल एक त्रुटि कोड लौटता है, जबकि उपयोगकर्ता द्वारा परिभाषित कार्यों को एक मान लौटना चाहिए (जो एक परिणाम हो सकता है)

फिर, इन शब्दों के बीच सटीक अंतर इस बात पर निर्भर करता है कि आप किससे बात कर रहे हैं!


2

80% प्रवीणता सीधे नामकरण के साथ परिचित से संबंधित है,

उत्पादकता का 95% यह पहचानने की क्षमता है कि इसका वर्णन करने के लिए इस्तेमाल की गई शर्तों के बावजूद इस समय क्या उपयोगी है

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


13
सभी आँकड़ों का 83.5% मौके पर बनाया जाता है; --P
Django Reinhardt

1
मुझे स्वीकार करना होगा, जब मैं किसी गैर-ओओ भाषा में काम कर रहा होता हूं, तो मुझे "पद्धति" शब्द के आसपास फेंकने की आवाज आती है। यह गैर-मुहावरेदार कोड में चलने के साथ भारी सहसंबद्ध लगता है।
रैचेट

C कोड का संदर्भ देते समय मैं 'Method' का उपयोग करता हूं क्योंकि कई OO प्रोग्रामर जिनके साथ मैं डील प्रक्रिया या कार्य को सुनने पर मानसिक रूप से टूट जाता हूं। मज़े के लिए, अगर मैं वास्तव में उनके साथ गड़बड़ करना चाहता हूं, तो मैं शब्दों को यादृच्छिक रूप से बदल सकता हूं। यह अच्छा नहीं है, आप घर में एक
पॉलीजिस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.