एक विधि और एक फ़ंक्शन के बीच अंतर क्या है?


1739

क्या कोई ओओपी संदर्भ में तरीकों बनाम कार्यों की एक सरल व्याख्या प्रदान कर सकता है?



12
जब एक संपत्ति का मूल्य एक फ़ंक्शन होता है, तो हम इसे एक विधि कहते हैं
कोडर

2
एक विधि के विपरीत क्या है? यह मेरा सवाल है। "फंक्शन" अभिभावक की अवधारणा है। विधि एक प्रकार का फ़ंक्शन है। एक प्रकार के फ़ंक्शन के लिए नाम क्या है जो एक विधि नहीं है, लेकिन इसे सीधे नाम से बुलाया जा सकता है?
अलेक्जेंडर मिल्स

यह दिलचस्प होगा कि r में तरीकों और कार्यों के बीच एक और स्पष्टीकरण को स्पष्ट किया जाए । यह दिलचस्प है क्योंकि विधि में आमतौर पर एक फ़ंक्शन होता है । यदि विधि एक ऑब्जेक्ट-निर्भर फ़ंक्शन है, तो ऑब्जेक्ट क्लास के लिए फ़ंक्शन की जाँच if(class(object)) { ... } else {stop()}वैचारिक रूप से विधि के बराबर होगी?
कोनराड

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

जवाबों:


1830

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

एक विधि कोड का एक टुकड़ा है जिसे एक नाम से पुकारा जाता है जो किसी वस्तु से जुड़ा होता है। ज्यादातर मामलों में यह दो प्रमुख अंतरों को छोड़कर एक फ़ंक्शन के समान है:

  1. एक विधि अंतर्निहित रूप से उस वस्तु को पारित करती है जिस पर इसे कहा जाता था।
  2. एक विधि उस डेटा पर काम करने में सक्षम है जो वर्ग के भीतर समाहित है (यह याद रखना कि एक वस्तु वर्ग का एक उदाहरण है - कक्षा परिभाषा है, वस्तु उस डेटा का एक उदाहरण है)।

(यह एक सरलीकृत स्पष्टीकरण है, गुंजाइश आदि के मुद्दों की अनदेखी )


249
1) के लिए, आपको C ++ में उन विधियों को भी जोड़ना चाहिए जिन्हें सदस्य फ़ंक्शन कहा जाता है। इस प्रकार, इस संदर्भ में कार्यों और विधियों के बीच अंतर C ++ में कार्यों और सदस्य कार्यों के बीच अंतर के अनुरूप है। इसके अलावा, जावा जैसी भाषाओं में केवल विधियाँ हैं। इस स्थिति में, कार्य स्थिर विधियों के अनुरूप होंगे और विधियों का अर्थ समान होगा। 2) के लिए, आपको यह जोड़ना चाहिए कि एक विधि कक्षा के भाग के रूप में घोषित निजी उदाहरण (सदस्य) डेटा पर काम करने में सक्षम है । कोई भी कोड सार्वजनिक उदाहरण डेटा तक पहुंच सकता है।
रफी खाचदौरियन

45
एक फ़ंक्शन एक गणितीय निर्माण है। मैं कहूंगा कि सभी विधियां कार्य हैं, लेकिन सभी कार्य विधियां नहीं हैं
टायलर गिलीज़

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

26
@TylerGillies और HHC, मैं मानता हूं कि यह अच्छा हो सकता है यदि "फ़ंक्शन" और "विधि" का अर्थ है कि आप उन्हें क्या चाहते थे, लेकिन आपकी परिभाषाएं उन शर्तों के कुछ बहुत ही सामान्य उपयोगों को प्रतिबिंबित नहीं करती हैं।
पॉल ड्रेपर

9
इस परिभाषा से एक स्थिर विधि को वास्तव में एक विधि नहीं माना जाएगा क्योंकि इसका किसी विशेष उदाहरण से कोई लेना-देना नहीं है?
कार्कजेनिट

961

एक विधि एक वस्तु पर है।
एक कार्य एक वस्तु से स्वतंत्र है।

जावा और C # के लिए, केवल विधियाँ हैं।
सी के लिए, केवल कार्य हैं।

C ++ और Python के लिए यह इस बात पर निर्भर करेगा कि आप कक्षा में हैं या नहीं।


39
यह C # जोड़ने का समय है।
रोजी कासिम

7
@RosdiKasim C # के लिए, केवल विधियाँ हैं। (चूँकि स्थैतिक विधियों को भी किसी वस्तु के साथ जोड़ने की आवश्यकता होती है)
लिन क्रम्बलिंग

38
एक कक्षा में स्थिर तरीकों के बारे में कैसे? वे एक वस्तु (जावा में) से स्वतंत्र होंगे। तब एक समारोह नहीं होगा?
स्क्विज़र

12
@Squeazer इस बारे में एक सवाल है कि हाल ही में stackoverflow.com/questions/30402169/… जावा भाषा विशिष्टता ने उन्हें "वर्ग विधि" (स्थिर) और "उदाहरण विधि" के रूप में अलग किया है। तो वे अभी भी सभी तरीके हैं।
xji

13
जावा में लैम्ब्डा अभिव्यक्तियाँ हैं, जो ऐसे कार्य हैं जो विधियाँ नहीं हैं
मैक्स हेइबर

228

'मेथड' 'फंक्शन' के लिए ऑब्जेक्ट ओरिएंटेड शब्द है । यह सब बहुत कुछ है वहाँ (यानी, कोई वास्तविक अंतर)।

दुर्भाग्य से, मुझे लगता है कि यहाँ बहुत सारे उत्तर इस विचार को बनाए रखने या आगे बढ़ाने के लिए हैं कि कुछ जटिल, सार्थक अंतर है।

वास्तव में - वहाँ यह सब बहुत कुछ नहीं है, बस एक ही चीज़ के लिए अलग-अलग शब्द।

[देर से जोड़]


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


14
एक विधि एक विशेष प्रकार का फ़ंक्शन है जिसमें निहित तर्क पारित किया जाता है (वर्ग का एक उदाहरण जो विधि को परिभाषित किया गया है)। यह एक फ़ंक्शन के रूप में महत्वपूर्ण है, सख्त शब्दों में, अपनी तर्क सूची में कुछ भी उपयोग या संशोधित नहीं करना चाहिए।
ty1824

4
@ ty1824 यह हमेशा ऐसा नहीं होता है कि तरीके निहित तर्क दिए जाते हैं। पायथन में, selfतर्क स्पष्ट है। और कई भाषाओं में स्थिर तरीके हैं, जो एक उदाहरण के रूप में पारित नहीं होते हैं।
मैक्स हाइबर

1
@ म्हेइबर वे कुछ मान्य बिंदु हैं। स्वयं के संबंध में, आप सही हैं, यह स्पष्ट रूप से परिभाषित है । कुंजी यह है कि कॉल अंतर्निहित है, मूल ऑब्जेक्ट संदर्भ पर आधारित है। ऐसी भाषाएं हैं जो thisया तो ओवरराइड करने का समर्थन करती हैं self, लेकिन उन निर्माणों को आमतौर पर विधियों के बजाय कार्यों के रूप में संदर्भित किया जाता है।
ty1824

1
@ एमहाइबर जहां तक ​​स्थिर तरीकों का सवाल है - जावा ने उन्हें वर्कअराउंड के रूप में लागू किया है इसलिए एक संदर्भ की आवश्यकता के बिना फ़ंक्शन को लागू किया जा सकता है। मैं इतना कहना चाहूँगा कि 'स्थिर पद्धति' एक भ्रामक शब्द है और इसे प्रतिस्थापित किया जाना चाहिए ... एक आदर्श सैद्धांतिक दुनिया में :)
ty1824

1
@ ty1824 C ++, Scala, Python, Ruby, JavaScript, और Scala सभी में स्थिर तरीके हैं, इसलिए मुझे नहीं लगता कि यह सिर्फ एक जावा चीज़ है। मैं उन्हें पसंद नहीं करता: वे वस्तुओं का उपयोग करते हैं (राज्य के बंडलों) जैसे कि वे नाम स्थान थे।
मैक्स हेइबर

99

सामान्य तौर पर: विधियाँ ऐसे कार्य हैं जो एक वर्ग के होते हैं, फ़ंक्शंस कोड के किसी अन्य दायरे पर हो सकते हैं ताकि आप यह बता सकें कि सभी विधियाँ कार्य हैं, लेकिन सभी कार्य विधियाँ नहीं हैं:

निम्नलिखित अजगर उदाहरण लें:

class Door:
  def open(self):
    print 'hello stranger'

def knock_door:
  a_door = Door()
  Door.open(a_door)

knock_door()

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

जैसा कि आप देख सकते हैं कि आप किसी फ़ंक्शन को कहीं भी कॉल कर सकते हैं, लेकिन यदि आप किसी विधि को कॉल करना चाहते हैं या तो आपको उसी प्रकार का एक नया ऑब्जेक्ट पास करना होगा जिस तरह से विधि घोषित की जाती है (Class.method (ऑब्जेक्ट)) या आपको आमंत्रित करना होगा ऑब्जेक्ट के अंदर विधि (ऑब्जेक्ट। मेथोड ()), कम से कम अजगर में।

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


2
यह उत्तर --- अधिकतर इसका पहला वाक्य --- अब तक का सबसे संक्षिप्त और प्रश्न का समग्र उत्तर है।
yourcomputergenius

61

याद रखने का सरल तरीका:

  • F unction → F ree (फ्री का मतलब किसी वस्तु या वर्ग से नहीं है)
  • एम इथोड → एम एमबर (किसी वस्तु या वर्ग का सदस्य)

चूंकि आमतौर पर विनिमेय है, इसलिए आपको एक एमनोमोनिक की आवश्यकता क्यों है?
Sapphire_Brick

44

एक कार्य और विधि के बीच मुख्य अंतर की एक सामान्य परिभाषा :

कार्य कक्षाओं के बाहर परिभाषित किए जाते हैं, जबकि विधियाँ कक्षाओं के अंदर और भाग के रूप में परिभाषित की जाती हैं।


30

अगर आपको लगता है कि यहाँ पढ़ना "OO तरीकों से मेरा परिचय" है

ऑब्जेक्ट ओरिएंटेड प्रतिमान के पीछे का विचार यह है कि सॉफ़्टवेयर "धमकी" के लिए है .. अच्छी तरह से "वस्तुओं" से बना है। वास्तविक दुनिया में वस्तुओं में गुण होते हैं, उदाहरण के लिए यदि आपके पास एक कर्मचारी है, तो कर्मचारी का एक नाम, एक कर्मचारी आईडी, एक पद, वह एक विभाग आदि से संबंधित है।

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

employe whatAreYouDoing.

वह "whatAreYouDoing" एक "संदेश" है जो ऑब्जेक्ट को भेजा जाता है। ऑब्जेक्ट जानता है कि उस प्रश्न का उत्तर कैसे दिया जाए, यह कहा जाता है कि प्रश्न को हल करने के लिए एक "विधि" है।

तो, जिस तरह से वस्तुओं को अपने व्यवहार को उजागर करना है, उसे विधियां कहा जाता है। इस प्रकार तरीके कलाकृतियों को कुछ करना "है"।

अन्य संभावित तरीके हैं

employee whatIsYourName
employee whatIsYourDepartmentsName

आदि।

दूसरे हाथ में कार्य करने का तरीका एक प्रोग्रामिंग भाषा है जिसमें कुछ डेटा की गणना की जाती है, उदाहरण के लिए आपके पास फ़ंक्शन ऐडवैल्यूज़ (8, 8) हो सकता है जो 16 देता है

// pseudo-code
function addValues( int x, int y )  return x + y 
// call it 
result = addValues( 8,8 )
print result // output is 16...

चूंकि पहले लोकप्रिय प्रोग्रामिंग लैंग्वेज (जैसे कि फोरट्रान, सी, पास्कल) ने ओओ प्रतिमान को कवर नहीं किया था, वे केवल इन कलाकृतियों को "फ़ंक्शन" कहते हैं।

उदाहरण के लिए C में पिछला फ़ंक्शन होगा:

int addValues( int x, int y ) 
{
   return x + y;
}

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

public static int addValues( int x, int y ) {
    return x + y;
}

जाना पहचाना? ऐसा इसलिए है क्योंकि जावा की जड़ें C ++ और C ++ पर C हैं।

अंत में यह सिर्फ एक अवधारणा है, कार्यान्वयन में वे समान दिख सकते हैं, लेकिन OO प्रलेखन में इन्हें विधि कहा जाता है।

यहाँ जावा में पहले के कर्मचारी वस्तु का एक उदाहरण दिया गया है।

public class Employee {

    Department department;
    String name;

    public String whatsYourName(){
        return this.name;
    }
    public String whatsYourDeparmentsName(){
         return this.department.name();
    }
    public String whatAreYouDoing(){
        return "nothing";
    } 
    // Ignore the following, only set here for completness
    public Employee( String name ) {
        this.name = name;
    }

}

// Usage sample.
Employee employee = new Employee( "John" ); // Creates an employee called John

// If I want to display what is this employee doing I could use its methods.
// to know it.
String name = employee.whatIsYourName():
String doingWhat = employee.whatAreYouDoint();

// Print the info to the console.

 System.out.printf("Employee %s is doing: %s", name, doingWhat );

Output:
Employee John is doing nothing.

तब अंतर, "डोमेन" पर होता है जहां इसे लागू किया जाता है।

AppleScript में "नेचुरल लैंग्वेज" का विचार है, जो कि कुछ बिंदु पर OO के पास था। उदाहरण के लिए स्मालटाक। मुझे आशा है कि यह पढ़ने के बाद आपके लिए ऑब्जेक्ट में तरीकों को समझना उचित हो सकता है।

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


3
वाहवाही! कैसे वस्तुओं के लिए आदेश हैं पर शानदार प्रदर्शनी। यह ओओ को समझने के लिए महत्वपूर्ण है और इस जवाब में आपके द्वारा प्रदर्शित बयानबाजी की कमी है कि आज उद्योग में ओओ का दुरुपयोग क्यों होता है। बहुत बढ़िया पोस्ट।
moffdub

18

OO की दुनिया में, दोनों को आमतौर पर एक ही चीज़ के लिए उपयोग किया जाता है।

शुद्ध गणित और सीएस के दृष्टिकोण से, एक फ़ंक्शन हमेशा एक ही परिणाम लौटाएगा जब एक ही तर्क (एफ (x, y) = (x + y)) के साथ कहा जाता है। दूसरी ओर एक विधि, आमतौर पर एक वर्ग की आवृत्ति से जुड़ी होती है। फिर भी, अधिकांश आधुनिक OO भाषाएँ अब अधिकांश भाग के लिए "फ़ंक्शन" शब्द का उपयोग नहीं करती हैं। कई स्थैतिक विधियां काफी हद तक कार्य की तरह हो सकती हैं, क्योंकि उनमें आमतौर पर कोई राज्य नहीं होता है (हमेशा सच नहीं होता है)।


17

मान लीजिए कि एक फ़ंक्शन कोड का एक ब्लॉक है (आमतौर पर अपने स्वयं के दायरे के साथ, और कभी-कभी अपने स्वयं के बंद होने के साथ) जो कुछ तर्क प्राप्त कर सकता है और परिणाम भी वापस कर सकता है।

एक विधि एक फ़ंक्शन है जो किसी ऑब्जेक्ट के स्वामित्व में है (कुछ ऑब्जेक्ट ओरिएंटेड सिस्टम में, यह कहना सही है कि यह एक वर्ग के स्वामित्व में है)। एक वस्तु / वर्ग द्वारा "स्वामित्व" होने का मतलब है कि आप वस्तु / वर्ग के माध्यम से विधि का उल्लेख करते हैं; उदाहरण के लिए, जावा में यदि आप एक विधि "ओपन" () "ऑब्जेक्ट द्वारा स्वामित्व" दरवाजे को लागू करना चाहते हैं, तो आपको "door.open ()" लिखने की आवश्यकता है।

आमतौर पर विधियाँ वस्तु / वर्ग के भीतर उनके व्यवहार का वर्णन करते हुए कुछ अतिरिक्त विशेषताएँ भी प्राप्त करती हैं, उदाहरण के लिए: दृश्यता (एन्कैप्सुलेशन की ऑब्जेक्ट ओरिएंटेड अवधारणा से संबंधित) जो उन वस्तुओं (या कक्षाओं) से परिभाषित होती है, जिनसे विधि को लागू किया जा सकता है।

कई ऑब्जेक्ट ओरिएंटेड भाषाओं में, सभी "फ़ंक्शंस" किसी न किसी ऑब्जेक्ट (या वर्ग) के होते हैं और इसलिए इन भाषाओं में ऐसे फ़ंक्शंस नहीं होते हैं जो विधियाँ नहीं हैं।


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

15

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

http://en.wikipedia.org/wiki/Method_(computer_science)


13

एक फ़ंक्शन एक गणितीय अवधारणा है। उदाहरण के लिए:

f(x,y) = sin(x) + cos(y)

यह कहता है कि फ़ंक्शन f () दूसरे पैरामीटर के कोसाइन में जोड़े गए पहले पैरामीटर का पाप लौटाएगा। यह सिर्फ गणित है। जैसा कि होता है पाप () और कॉस () भी कार्य हैं। एक फ़ंक्शन के पास एक और संपत्ति है: सभी फ़ंक्शन एक ही मापदंडों के साथ कॉल करते हैं, उसी परिणाम को वापस करना चाहिए।

दूसरी ओर, एक विधि, एक फ़ंक्शन है जो ऑब्जेक्ट-ओरिएंटेड भाषा में ऑब्जेक्ट से संबंधित है। इसका एक निहित पैरामीटर है: जिस वस्तु पर कार्रवाई की जा रही है (और यह राज्य है)।

इसलिए, यदि आपके पास एक विधि G (x) के साथ ऑब्जेक्ट Z है, तो आप निम्नलिखित देख सकते हैं:

Z.g(x) = sin(x) + cos(Z.y)

इस स्थिति में, पैरामीटर x को पास किया जाता है, फ़ंक्शन उदाहरण में पहले जैसा। हालाँकि, cos () का मान एक ऐसा मान है जो ऑब्जेक्ट Z Z के अंदर रहता है और इसके (Zy) के अंदर रहने वाले डेटा Z के g () विधि के लिए निहित पैरामीटर हैं।


13

फ़ंक्शन या एक विधि कोड का एक नाम दिया जाने योग्य टुकड़ा है जो कुछ संचालन करता है और वैकल्पिक रूप से एक मान लौटाता है।

में सी भाषा के शब्द समारोह प्रयोग किया जाता है। जावा और सी # लोग इसे एक विधि कहेंगे (और इस मामले में एक फ़ंक्शन एक वर्ग / वस्तु के भीतर परिभाषित किया गया है)।

एक सी ++ प्रोग्रामर यह एक समारोह या कभी कभी विधि (कॉल कर सकते हैं अगर वे प्रक्रियात्मक शैली c ++ कोड लिख रहे हैं या सी की वस्तु उन्मुख तरह से कर रहे हैं ++, यह भी एक C / C ++ केवल प्रोग्रामर संभावना यह एक समारोह कहेंगे शब्द 'विधि' है, क्योंकि पर निर्भर करता है कम अक्सर C / C ++ साहित्य में उपयोग किया जाता है)।

आप किसी फंक्शन का उपयोग करते हैं, जैसे कि उसका नाम है,

result = mySum(num1, num2);


आप किसी वस्तु को पहले उसकी वस्तु को संदर्भित करके कहते हैं, जैसे,

result = MyCalc.mySum(num1,num2);

13

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

में 'सी' , शब्द "समारोह" का मतलब है एक कार्यक्रम दिनचर्या

में जावा , शब्द "समारोह" किसी भी विशेष अर्थ नहीं है। जबकि "विधि" का अर्थ उन दिनचर्याओं में से एक है जो एक वर्ग के कार्यान्वयन का निर्माण करता है।

में सी # कि के रूप में अनुवाद होगा:

public void DoSomething() {} // method
public int DoSomethingAndReturnMeANumber(){} // function

लेकिन वास्तव में, मैं फिर से पुनरावृति करता हूं कि 2 अवधारणाओं में वास्तव में कोई अंतर नहीं है। यदि आप जावा के बारे में अनौपचारिक चर्चा में "फ़ंक्शन" शब्द का उपयोग करते हैं, तो लोग आपको "विधि" मानेंगे और आगे बढ़ाएंगे। जावा के बारे में उचित दस्तावेजों या प्रस्तुतियों में इसका उपयोग न करें, या आप मूर्खतापूर्ण दिखेंगे।


दरअसल, आपके उदाहरण में दोनों हैं method... या मैं इसे कॉल करूंगा procedureऔर function
यौषा अलायबौ

9

फ़ंक्शन तर्क का एक सेट है जिसका उपयोग डेटा में हेरफेर करने के लिए किया जा सकता है।

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


8

क्लास के उदाहरण पर क्लास एक्ट के तरीके, ऑब्जेक्ट कहलाते हैं।

class Example
{
   public int data = 0; // Each instance of Example holds its internal data. This is a "field", or "member variable".

   public void UpdateData() // .. and manipulates it (This is a method by the way)
   {
      data = data + 1;
   }

   public void PrintData() // This is also a method
   {
      Console.WriteLine(data);
   }
}

class Program
{
   public static void Main()
   {
       Example exampleObject1 = new Example();
       Example exampleObject2 = new Example();

       exampleObject1.UpdateData();
       exampleObject1.UpdateData();

       exampleObject2.UpdateData();

       exampleObject1.PrintData(); // Prints "2"
       exampleObject2.PrintData(); // Prints "1"
   }
}

8

ऑब्जेक्ट पास्कल या C ++ जैसी OO भाषाओं में, एक "विधि" एक वस्तु से जुड़ा एक फ़ंक्शन है। इसलिए, उदाहरण के लिए, "डॉग" ऑब्जेक्ट में "छाल" फ़ंक्शन हो सकता है और इसे "विधि" माना जाएगा। इसके विपरीत, "स्ट्रलेन" फ़ंक्शन अकेले खड़ा है (यह एक तर्क के रूप में प्रदान की गई स्ट्रिंग की लंबाई प्रदान करता है)। यह केवल एक "फ़ंक्शन" है। जावास्क्रिप्ट तकनीकी रूप से ऑब्जेक्ट ओरिएंटेड है लेकिन सी-++, सी # या पास्कल जैसी पूर्ण विकसित भाषा की तुलना में कई सीमाओं का सामना करता है। बहरहाल, भेद अभी भी पकड़ना चाहिए।

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

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


8

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

# perfectly normal function
def hello(greetee):
  print "Hello", greetee

# generalise a bit (still a function though)
def greet(greeting, greetee):
  print greeting, greetee

# hide the greeting behind a layer of abstraction (still a function!)
def greet_with_greeter(greeter, greetee):
  print greeter.greeting, greetee

# very simple class we can pass to greet_with_greeter
class Greeter(object):
  def __init__(self, greeting):
    self.greeting = greeting

  # while we're at it, here's a method that uses self.greeting...
  def greet(self, greetee):
    print self.greeting, greetee

# save an object of class Greeter for later
hello_greeter = Greeter("Hello")

# now all of the following print the same message
hello("World")
greet("Hello", "World")
greet_with_greeter(hello_greeter, "World")
hello_greeter.greet("World")

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

Greeter.greet(hello_greeter, "World")

इसलिए मैंने एक विधि को प्रभावी रूप से एक फ़ंक्शन में बदल दिया है। क्या मैं किसी फ़ंक्शन को विधि में बदल सकता हूं? ठीक है, जैसा कि पायथन आपको परिभाषित करने के बाद कक्षाओं में गड़बड़ी करने देता है, आइए कोशिश करते हैं:

Greeter.greet2 = greet_with_greeter
hello_greeter.greet2("World")

हां, फ़ंक्शन greet_with_greeterको अब विधि के रूप में भी जाना जाता है greet2। यह एक विधि और फ़ंक्शन के बीच एकमात्र वास्तविक अंतर दिखाता है: जब आप "कॉल करके एक ऑब्जेक्ट" पर एक विधि को कॉल करते हैं object.method(args), तो भाषा जादुई रूप से बदल जाती है method(object, args)

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


7

मेरे लिए: यदि मैं सहमत हूं तो एक विधि और एक फ़ंक्शन का कार्य समान है:

  • कोई फ़ंक्शन मान लौटा सकता है
  • मापदंडों की उम्मीद कर सकते हैं

कोड के किसी भी टुकड़े की तरह आपके पास आपके द्वारा रखी गई वस्तुएं हो सकती हैं और आपके पास एक वस्तु हो सकती है जो परिणामस्वरूप आती ​​है। ऐसा करने के दौरान वे किसी वस्तु की स्थिति को बदल सकते हैं, लेकिन यह मेरे लिए उनके बुनियादी कामकाज को नहीं बदलेगा।

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

new Employer().calculateSum( 8, 8 );

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

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


5

आइए अधिक जटिल जवाब नहीं देना चाहिए। तरीके और कार्य एक ही चीज हैं। जब आप किसी कक्षा के बाहर होते हैं, तो आप किसी फ़ंक्शन को एक फ़ंक्शन कहते हैं, और जब आप किसी क्लास के अंदर लिखा जाता है, तो आप फ़ंक्शन को एक विधि कहते हैं।


4

मेरी समझ से एक विधि कोई भी ऑपरेशन है जिसे एक वर्ग पर किया जा सकता है। यह प्रोग्रामिंग में प्रयुक्त एक सामान्य शब्द है।

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

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


4

पहले आदेश सन्निकटन के लिए, एक विधि (C ++ शैली में OO) सदस्य फ़ंक्शन के लिए एक और शब्द है, जो कि एक फ़ंक्शन है जो एक वर्ग का हिस्सा है।

C / C ++ जैसी भाषाओं में आपके पास फ़ंक्शन हो सकते हैं जो किसी वर्ग के सदस्य नहीं हैं; आप किसी फ़ंक्शन को क्लास विधि से संबद्ध नहीं कहते हैं।


4

समारोह मुख्य रूप से प्रक्रिया उन्मुख प्रोग्रामिंग से संबंधित अवधारणा है जहां एक फ़ंक्शन एक इकाई है जो डेटा को संसाधित कर सकता है और आपके मूल्य को वापस कर सकता है

विधि ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग की अवधारणा है जहां एक विधि एक वर्ग का सदस्य है जो ज्यादातर वर्ग के सदस्यों पर प्रसंस्करण करता है।


3

IMHO लोग बस प्रोग्रामर के बीच आसान संचार के लिए नए शब्द का आविष्कार करना चाहते थे जब वे वस्तुओं के अंदर कार्यों को संदर्भित करना चाहते थे।

यदि आप ऐसी विधियाँ कह रहे हैं जिनका अर्थ है कि आप कक्षा के अंदर कार्य करते हैं। यदि आप ऐसे कार्य कह रहे हैं, जिसका अर्थ है कि आप कक्षा के बाहर केवल कार्य करते हैं।

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

फ़ंक्शन एक कोड है जिसे एक भूमिका निभानी है ( एक फंक्शन ) है। विधि एक विधि है समस्या को हल करने की है।

यह वही काम करता है। यह एक ही बात है। यदि आप सुपर सटीक होना चाहते हैं और सम्मेलन के साथ-साथ आप वस्तुओं के अंदर के कार्यों के रूप में तरीकों को बुला सकते हैं।


2

मैं एक विशेषज्ञ नहीं हूं, लेकिन यह वही है जो मैं जानता हूं:

  1. समारोह सी भाषा शब्द है, यह कोड के एक टुकड़े को संदर्भित करता है और फ़ंक्शन नाम इस फ़ंक्शन का उपयोग करने के लिए पहचानकर्ता होगा।

  2. विधि OO शब्द है, आम तौर पर यह फ़ंक्शन पैरामीटर में एक पॉइंटर होता है। आप सी जैसे कोड के इस टुकड़े को लागू नहीं कर सकते, आपको इसे लागू करने के लिए ऑब्जेक्ट का उपयोग करने की आवश्यकता है।

  3. आह्वान के तरीके भी अलग हैं। यहाँ कोड के इस टुकड़े का पता खोजने के लिए अर्थ लागू करें। सी / सी ++, लिंकिंग समय का पता लगाने के लिए फ़ंक्शन प्रतीक का उपयोग करेगा।

  4. ओब्जेक्टिव-सी अलग है। पता खोजने के लिए डेटा संरचना का उपयोग करने के लिए C फ़ंक्शन का अर्थ लागू करें। इसका मतलब है कि सब कुछ रन टाइम पर जाना जाता है।


2

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

एक विधि एक फ़ंक्शन है जिसमें एक निर्धारित रिसीवर है, ओओपी शब्दों में, एक विधि एक ऑब्जेक्ट की आवृत्ति पर एक फ़ंक्शन है।


2

तरीकों और कार्यों के बीच अंतर

Microsoft पर इस दस्तावेज़ को पढ़ने से

निष्पादन योग्य कोड वाले सदस्यों को सामूहिक रूप से एक वर्ग के फ़ंक्शन सदस्यों के रूप में जाना जाता है। पूर्ववर्ती अनुभाग विधियों का वर्णन करता है, जो प्राथमिक प्रकार के फ़ंक्शन सदस्य हैं। यह खंड सी # द्वारा समर्थित फ़ंक्शन सदस्यों के अन्य प्रकारों का वर्णन करता है: निर्माणकर्ता, गुण, अनुक्रमणिका, ईवेंट, ऑपरेटर, और अंतिम रूप।

तो तरीके कार्यों का सबसेट हैं। प्रत्येक विधि एक फ़ंक्शन है लेकिन प्रत्येक फ़ंक्शन एक विधि नहीं है, उदाहरण के लिए, constructorएक विधि के रूप में नहीं कहा जा सकता है , लेकिन यह एक फ़ंक्शन है।


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

2

फ़ंक्शन - कोड के एक स्वतंत्र टुकड़े में एक फ़ंक्शन जिसमें कुछ तर्क शामिल हैं और स्वतंत्र रूप से बुलाया जाना चाहिए और वर्ग के बाहर परिभाषित किया गया है।

विधि - एक विधि कोड का एक स्वतंत्र टुकड़ा है जिसे किसी वस्तु के संदर्भ में कहा जाता है और इसे कक्षा के अंदर परिभाषित किया जाता है।


आप किसी स्थिर वर्ग में कोड का एक टुकड़ा क्या कहते हैं, वह भी स्थिर है, यह एक विधि या एक फ़ंक्शन है? किसी कक्षा के किसी स्थिर कार्य / विधि को उस वर्ग की एक वस्तु की आवश्यकता नहीं होती है, जिसे उसमें घोषित किया जाता है।
वोल्फगैंग रोथ

1

जावास्क्रिप्ट उदाहरणों का उपयोग करते हुए विधि बनाम फ़ंक्शन के लिए कुछ स्पष्टीकरण यहां दिए गए हैं:

test(20, 50); फंक्शन डिफाइन होता है और कुछ स्टेप्स को चलाने के लिए या कुछ वापस करने के लिए उपयोग किया जाता है जिसे कहीं स्टोर / उपयोग किया जा सकता है।

आप कोड का पुन: उपयोग कर सकते हैं: कोड को एक बार परिभाषित करें और इसे कई बार उपयोग करें।

आप विभिन्न परिणामों का उत्पादन करने के लिए विभिन्न तर्कों के साथ एक ही कोड का कई बार उपयोग कर सकते हैं।

var x = myFunction(4, 3);   // Function is called, return value will end up in x

function myFunction(a, b) {
    return a * b;          // Function returns the product of a and b
}

var test = something.test(); यहां परीक्षण () कुछ ऑब्जेक्ट या कस्टम की एक विधि हो सकती है जो इनबिल्ट ऑब्जेक्ट के लिए एक प्रोटोटाइप को परिभाषित करता है, यहां अधिक स्पष्टीकरण दिया गया है:

जावास्क्रिप्ट विधियाँ वे क्रियाएँ हैं जो वस्तुओं पर की जा सकती हैं।

एक जावास्क्रिप्ट विधि एक संपत्ति है जिसमें फ़ंक्शन परिभाषा होती है।

जावास्क्रिप्ट में तार के लिए निर्मित संपत्ति / विधि:

var message = "Hello world!";
var x = message.toUpperCase();
//Output: HELLO WORLD!

कस्टम उदाहरण:

function person(firstName, lastName, age, eyeColor) {
    this.firstName = firstName;  
    this.lastName = lastName;
    this.age = age;
    this.eyeColor = eyeColor;
    this.changeName = function (name) {
        this.lastName = name;
    };
}

something.changeName("SomeName"); //This will change 'something' objject's name to 'SomeName'

आप उदाहरण के लिए स्ट्रिंग, सरणी, आदि के लिए गुणों को परिभाषित कर सकते हैं

String.prototype.distance = function (char) {
    var index = this.indexOf(char);

    if (index === -1) {
        console.log(char + " does not appear in " + this);
    } else {
        console.log(char + " is " + (this.length - index) + " characters from the end of the string!");
    }
};

var something = "ThisIsSomeString"

// now use distance like this, run and check console log

something.distance("m");

कुछ संदर्भ: जावास्क्रिप्ट वस्तु विधि , कार्य , प्रोटोटाइप पर अधिक जानकारी


कृपया कई प्रश्नों के समान उत्तर न दें। एक अच्छा उत्तर पोस्ट करें, फिर डुप्लिकेट के रूप में अन्य प्रश्नों को बंद करने के लिए वोट / ध्वज दें। यदि प्रश्न डुप्लिकेट नहीं है, तो प्रश्न के अपने उत्तरों को दर्जी करें।
पॉल राउब

प्रतिक्रिया के लिए धन्यवाद, मैंने अन्य उत्तर दर्जी नहीं किया, मैंने उस एवर को हटा दिया। :-)
लहार शाह

1

टी एल; डॉ

फ़ंक्शन को चलाने के लिए कोड का एक टुकड़ा है।
एक विधि एक वस्तु के अंदर एक समारोह है।

एक समारोह का उदाहरण:


function sum(){
  console.log("sum")l
}

एक विधि का उदाहरण:

const obj = {
a:1,
b:2,
sum(){
  }
}

इसलिए हम कहते हैं कि किसी फ़ंक्शन के अंदर "यह" कीवर्ड तब तक बहुत उपयोगी नहीं है जब तक कि हम उसे कॉल, अप्लाई या बाइंड के साथ उपयोग नहीं करते हैं .. क्योंकि कॉल, अप्लाई, बाइंड उस फंक्शन को ऑब्जेक्ट के अंदर विधि के रूप में कहेंगे ==> मूल रूप से यह कार्य को विधि में परिवर्तित करता है


1

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

# function
def putSqr(a)
   puts a ** 2
end


class Math2
   # method
   def putSqr(a)
      puts a ** 2
   end
end

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

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