2010-12-01 13 views
22

मैं एक प्रोग्रामिंग नोब हूं और कॉलबैक विधियों के पीछे अवधारणा को समझ में नहीं आया। विकी में इसके बारे में पढ़ने की कोशिश की और यह मेरे सिर पर चला गया। क्या कोई इसे सरल शब्दों में समझा सकता है?कॉलबैक विधियां क्या हैं?

उत्तर

19

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

एक तुच्छ उदाहरण, पायथन में:

void call_something_three_times(what_to_call, what_to_pass_it): 
    for i in xrange(3): what_to_call(what_to_pass_it) 

# Write "Hi mom" three times, using a callback. 
call_something_three_times(sys.stdout.write, "Hi mom\n") 

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

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

5

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

आपको कॉलबैक फ़ंक्शंस का उपयोग क्यों करना चाहिए?

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

+0

के लिए पंजीकृत होता है, सभी भाषाओं में फ़ंक्शन पॉइंटर्स नहीं होते हैं। –

+3

@Ignacio: कॉलबैक के लिए अनुमति देने वाली कोई भी भाषा किसी रूप में फ़ंक्शन पॉइंटर होगी। यह एक इंटरफ़ेस या वर्चुअल, ओवरलोडेड, ओवररोड (या जो भी भाषा डिजाइनर इसे कॉल करना चाहता था) की नींव के पीछे छुपाया जा सकता है, लेकिन लाइन के साथ कहीं भी "कूद" या "कॉल" कमांड होगा जो इसे लेता है असेंबली में कड़ी-कोडित की बजाय राम में एक चर से गंतव्य (यह वीएम "असेंबली" कोड या सीपीयू असेंबली कोड हो)। –

1

सामान्य रूप से आप एक पैरामीटर के रूप में एक फ़ंक्शन की आपूर्ति करते हैं जिसे कुछ होने पर बुलाया जाता है। एक समारोह है कि दो पैरामीटर, शून्य * और लंबे समय लेता है और किसी पूर्णांक रिटर्न अर्थ

int (callback *)(void *, long); 

:

सी कोड में आप कुछ है कि इस तरह दिखता है पारित करेंगे।

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

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

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

उदाहरण के लिए, आपके पास एक एपीआई हो सकती है जो वस्तुओं को उत्पन्न करती है और फिर उत्पन्न होने पर "कॉल-बैक" होती है।

0

कॉल बैक का मतलब है कि आप कोड को पैरामीटर के रूप में पास करते हैं। उदाहरण के लिए, एक बटन की कल्पना है, जब दबाया ज्यादा एक संवाद चलता है कि:

Button testBtn; 
testBtn.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onCLick() { 
    JOptionPane.showDialog(testBtn, "Test button pressed"); 
    } 
} 

यहाँ हम बटन क्या निष्पादित करने के लिए, जब यह क्लिक किया जाएगा बताओ। इसलिए, फ्रेमवर्क पास कोड को निष्पादित करेगा, जब यह क्लिक को हटा देता है।

void processEvent(Event e) { 
    if (e.type == Event.CLICK) { 
    e.getComponent().getOnClickListener().onClick(); 
    } 
} 

तो, कुछ बुनियादी कोड वापस श्रोता कॉल जब उचित घटना होता है: ढांचे के अंदर कुछ कोड की तरह देखते हैं।

पीएस: यहां छद्म कोड, बस विचार का वर्णन करें।

10

विकी का कहना है:

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

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

संबंधित मुद्दे