কলব্যাক ফাংশন কী?


684

কলব্যাক ফাংশন কী?


8
আপনি এখানে খুঁজে পেতে পারেন: স্ট্যাকওভারফ্লো . com / a / 9652434 / 3343174 কলব্যাক সম্পর্কে সেরা ব্যাখ্যা
ফখের


বিশদ ব্যাখ্যার জন্য দ্বিতীয় উত্তরের দিকে তাকান
দানাটো

কলিগব্যাকের সেরা ব্যাখ্যা যা আমি এর আগে খুঁজে পেয়েছি youtube.com/watch?v=xHneyv38Jro
সমীর সিনহা

উত্তর:


681

বিকাশকারীরা প্রায়শই বিভ্রান্ত হন কারণ অভিশপ্ত জিনিসটির নাম বলে কলব্যাক কী।

একটি কলব্যাক ফাংশন একটি ফাংশন যা হ'ল:

  • অন্য ফাংশন দ্বারা অ্যাক্সেসযোগ্য এবং
  • যদি প্রথম ফাংশনটি সম্পূর্ণ হয় তবে প্রথম ফাংশনটির পরে অনুরোধ করা হবে

কলব্যাক ফাংশন কীভাবে কাজ করে তা কল্পনা করার একটি দুর্দান্ত উপায় হ'ল এটি এমন একটি ফাংশন যা এতে ফাংশনটির " পিছনে ডাকা " হয়।

সম্ভবত আরও ভাল নাম একটি "পরে কল" ফাংশন হবে।

এই কনস্ট্রাক্টটি অ্যাসিঙ্ক্রোনাস আচরণের জন্য খুব কার্যকর যেখানে আমরা যখনই কোনও পূর্ববর্তী ইভেন্টটি সম্পন্ন করে তখনই কোনও ক্রিয়াকলাপ ঘটানো চাই।

সুডোকোড:

// A function which accepts another function as an argument
// (and will automatically invoke that function when it completes - note that there is no explicit call to callbackFunction)
funct printANumber(int number, funct callbackFunction) {
    printout("The number you provided is: " + number);
}

// a function which we will use in a driver function as a callback function
funct printFinishMessage() {
    printout("I have finished printing numbers.");
}

// Driver method
funct event() {
   printANumber(6, printFinishMessage);
}

যদি আপনি ইভেন্ট () বলে থাকেন তবে ফলাফল দিন:

The number you provided is: 6
I have finished printing numbers.

এখানে আউটপুট ক্রম গুরুত্বপূর্ণ। যেহেতু কলব্যাক ফাংশনগুলি পরে বলা হয়, "আমি প্রিন্টিং নম্বরগুলি শেষ করেছি" সর্বশেষে ছাপা হয়, প্রথমে নয়।

পয়েন্টার ভাষার সাথে তাদের ব্যবহারের কারণে কলব্যাকগুলি তথাকথিত। আপনি যদি এর মধ্যে একটিও ব্যবহার না করেন তবে 'কলব্যাক' নামটি নিয়ে শ্রম করবেন না। কেবল বুঝতে পারি যে অন্য পদ্ধতির আর্গুমেন্ট হিসাবে সরবরাহ করা কোনও পদ্ধতির বর্ণনা দেওয়ার জন্য এটি কেবল একটি নাম, যেমন যখন প্যারেন্ট পদ্ধতিটি বলা হয় (যে কোনও শর্ত, যেমন একটি বোতাম ক্লিক, টাইমার টিক ইত্যাদি) এবং তার পদ্ধতির বডিটি সম্পূর্ণ হয়, এরপরে কলব্যাক ফাংশনটি চাওয়া হয়।

কিছু ভাষা সমর্থন করে যেখানে একাধিক কলব্যাক ফাংশন আর্গুমেন্ট সমর্থিত হয় এবং প্যারেন্ট ফাংশনটি কীভাবে সম্পন্ন হয় তার উপর ভিত্তি করে কল করা হয় (অর্থাত্ প্যারেন্ট ফাংশনটি সাফল্যের সাথে শেষ হয় এমন ইভেন্টে একটি কলব্যাক বলা হয়, পিতামাত ফাংশনটি ছুড়ে দেয় এমন ইভেন্টে অন্যটিকে ডাকা হয়) নির্দিষ্ট ত্রুটি, ইত্যাদি)।


31
আপনার উদাহরণটি দুর্দান্ত তবে পরিভাষাটি "কলব্যাক" কেন তা আমি দেখতে পাচ্ছি না। অর্থজীবনে কখন "ফিরে" বলা হয়?
কোডিবাগস্টাইন

4
হ্যালো, প্রায় once its parent method completes, the function which this argument represents is then called। সুতরাং যদি ফাংশনটি অন্য কোনও ফাংশনে আর্গুমেন্ট হিসাবে পাস করা হয় তবে প্যারেন্ট ফাংশনটির রানটাইমের মাঝখানে থেকে ডাকা হয় তবে এটি কোনও ফাংশন হিসাবে parent(cb) {dostuff1(); cb(); dostuff2()}বিবেচিত হবে না callback?
সর্বোচ্চ ইয়ারি

2
@ ম্যাক্সইয়ারি: আইএমএইচও, এটি এখনও কলব্যাক হিসাবে বিবেচিত হয় here এখানে গুরুত্বপূর্ণ বিষয় হ'ল প্যারেন্ট ফান্টটিন কোনওভাবে ইনপুট ফাংশন (ওরফে কলব্যাক) ব্যবহার করতে চলেছে। এটি মাঝখানে বা শেষে বা কোনও শর্ত পূরণ করা হলে বলা যেতে পারে।
কামরান বিগডেলি

12
@ 8 বিটজুঙ্কি আপনাকে ধন্যবাদ - তবে মুদ্রণমণু ফাংশনের মধ্যে অর্থফল লাইফ পদ্ধতিটি কোথায়?
বিকেএসপুরগাঁও

2
এটি মোটেও সত্য নয়: "প্রথম ক্রিয়াটি সম্পূর্ণ হওয়ার পরে" স্বয়ংক্রিয়ভাবে আহ্বান করা হয় "। একটি কলব্যাক মোটেও কার্যকর করা হবে না, স্বয়ংক্রিয়ভাবে ছেড়ে দিন let প্রকৃতপক্ষে, পিতামাতার কাজ শেষ হওয়ার আগে কলব্যাকগুলি সম্পূর্ণ হওয়া অস্বাভাবিক নয়। লোকেরা কলব্যাকগুলি কীভাবে "পরে" সম্পাদিত হয় এমন ফাংশন হিসাবে বর্ণনা করে তা আমি খুব পছন্দ করি না। এটি তাদের সম্পর্কে যারা শিখছেন তাদের পক্ষে খুব বিভ্রান্তিকর। সোজা কথায়, কলব্যাকগুলি কেবল এমন ফাংশন যা অন্যান্য ফাংশনে আর্গুমেন্ট হিসাবে পাস হয়। সময়কাল। একটি আরও ভাল ব্যাখ্যার মধ্যে ফাংশন রেফারেন্সগুলির তুলনায় ডাব্লুওয়াই কলব্যাকগুলি ব্যাখ্যা করা অন্তর্ভুক্ত থাকবে।
জর্দান

225

অস্পষ্ট সংজ্ঞা

কলব্যাক ফাংশন হ'ল এমন একটি ফাংশন যা আপনি সেই কোড দ্বারা কল করার অনুমতি দিয়ে কোডের অন্য টুকরো সরবরাহ করেন।

কৃতিত্বের উদাহরণ

তুমি কেন এটা করতে চাও? আসুন বলি যে একটি পরিষেবা রয়েছে যা আপনাকে প্রার্থনা করতে হবে। যদি পরিষেবাটি অবিলম্বে ফিরে আসে তবে আপনি কেবল:

  1. ডাকা
  2. ফলাফলের জন্য অপেক্ষা করুন
  3. ফলাফল একবার আসার পরে চালিয়ে যান

উদাহরণস্বরূপ, ধরুন পরিষেবাটি ছিল factorialফাংশন। আপনি যখন এর মান চান 5!, আপনি অনুরোধ করবেন factorial(5), এবং নিম্নলিখিত পদক্ষেপগুলি উপস্থিত হবে:

  1. আপনার বর্তমান সম্পাদনের অবস্থানটি সংরক্ষণ করা হয়েছে (স্ট্যাকের মধ্যে, তবে এটি গুরুত্বপূর্ণ নয়)

  2. মৃত্যুদণ্ড কার্যকর করা হয়েছে factorial

  3. factorialসম্পূর্ণ হয়ে গেলে , ফলাফলটি কোথাও আপনি এটিকে পেতে পারেন

  4. মৃত্যুদন্ড কার্যকর হয়েছিল যেখানে সেখানে ছিল [1]

এখন ধরা যাক factorialসত্যিই দীর্ঘ সময় লেগেছে, কারণ আপনি এটিকে বিশাল সংখ্যক দিচ্ছেন এবং এটি কোনও কোনও সুপারকম্পিউটিং ক্লাস্টারকে অন্যত্র চালানো দরকার। ধরা যাক আপনি আপনার ফলাফলটি ফিরে আসতে 5 মিনিট সময় নেবেন বলে আশা করছেন। আপনি করতে পারেন:

  1. আপনি যখন ঘুমোবেন তখন আপনার ডিজাইনটি রাখুন এবং আপনার প্রোগ্রামটি চালান, যাতে আপনি অর্ধেক সময় পর্দার দিকে তাকান না

  2. আপনার প্রোগ্রামটি কাজ করার সময় অন্যান্য কাজ করার factorialজন্য ডিজাইন করুন

আপনি যদি দ্বিতীয় বিকল্পটি চয়ন করেন, তবে কলব্যাকগুলি আপনার পক্ষে কাজ করতে পারে।

শেষ থেকে শেষ নকশা

কলব্যাক প্যাটার্নটি কাজে লাগানোর জন্য, আপনি যা চান তা হ'ল factorialনিম্নলিখিত উপায়ে কল করতে সক্ষম হোন :

factorial(really_big_number, what_to_do_with_the_result)

দ্বিতীয় প্যারামিটারটি, what_to_do_with_the_resultএমন একটি ফাংশন যা আপনি প্রেরণ করেছিলেন factorial, এই আশায় যে factorialএটি ফিরে আসার আগে তার ফলাফলটিতে কল করবে।

হ্যাঁ, এর অর্থ এই যে factorialকলব্যাকগুলি সমর্থন করার জন্য এটি লেখা উচিত ছিল।

এখন ধরুন যে আপনি নিজের কলব্যাকটিতে একটি পরামিতি পাস করতে সক্ষম হতে চান। এখন আপনি পারবেন না, কারণ আপনি এটি কল করবেন না, factorialতাই। সুতরাং factorialআপনি আপনার পরামিতি পাস করার অনুমতি দেয় লেখা করা প্রয়োজন, এবং এটা তাদেরকে আপনার কলব্যাক হাতে তুলে যখন এটা এমন কিছুকে ডাকে,। এটি দেখতে এটির মতো দেখাবে:

factorial (number, callback, params)
{
    result = number!   // i can make up operators in my pseudocode
    callback (result, params)
}

এখন এটি factorialএই প্যাটার্নটিকে মঞ্জুরি দেয়, আপনার কলব্যাকটি এর মতো দেখতে পারে:

logIt (number, logger)
{
    logger.log(number)
}

এবং আপনার কল factorialহবে

factorial(42, logIt, logger)

যদি আপনি কিছু থেকে ফিরে আসতে চান logIt? ভাল, আপনি পারবেন না, কারণ factorialএটি মনোযোগ দিচ্ছে না।

ঠিক আছে, factorialআপনার কলব্যাক যা ফিরিয়ে দেয় কেবল তা কেন ফিরিয়ে দিতে পারে না ?

এটিকে অবরুদ্ধকরণ করা

যেহেতু মৃত্যুদন্ড কার্যকর করা শেষ হয়ে গেলে কলব্যাকের হাতে হস্তান্তর করা বোঝানো হয় factorial, তাই এটির কলকারীকে আসলে কিছুই ফিরিয়ে দেওয়া উচিত নয়। এবং আদর্শভাবে, এটি কোনওভাবে তার কাজটি অন্য থ্রেড / প্রক্রিয়া / মেশিনে চালু করবে এবং অবিলম্বে ফিরে আসবে যাতে আপনি চালিয়ে যেতে পারেন, সম্ভবত এই জাতীয় কিছু:

factorial(param_1, param_2, ...)
{
    new factorial_worker_task(param_1, param_2, ...);
    return;
}

এটি এখন একটি "অ্যাসিনক্রোনাস কল" যার অর্থ আপনি যখন এটি কল করবেন তখন তা তাত্ক্ষণিকভাবে ফিরে আসবে তবে সত্যই এখনও এটি কাজ করেন নি। সুতরাং আপনার এটি পরীক্ষা করার জন্য এবং এর ফলাফলটি শেষ হয়ে গেলে এটি অর্জন করার জন্য আপনার প্রক্রিয়াগুলির প্রয়োজন এবং আপনার প্রোগ্রামটি প্রক্রিয়াটিতে আরও জটিল হয়ে উঠেছে।

এবং factorial_worker_taskযাইহোক , এই প্যাটার্নটি ব্যবহার করে আপনার কলব্যাকটি তাত্পর্যপূর্ণভাবে চালু করতে এবং তত্ক্ষণাত্ ফিরে আসতে পারে।

তো তুমি কি কর?

উত্তরটি কলব্যাক প্যাটার্নের মধ্যে থাকা। আপনি যখনই লিখতে চান

a = f()
g(a)

এবং fঅবিচ্ছিন্নভাবে ডাকা হবে, আপনি পরিবর্তে লিখতে হবে

f(g)

gকলব্যাক হিসাবে পাস করা হয় যেখানে ।

এটি আপনার প্রোগ্রামের প্রবাহ-টপোলজিকে মূলত পরিবর্তন করে এবং কিছুটা অভ্যস্ত হয়ে যায়।

আপনার প্রোগ্রামিংয়ের ভাষা আপনাকে ফ্লাই-এ ফাংশন তৈরির একটি উপায় দিয়ে আপনাকে অনেক সহায়তা করতে পারে। উপরের কোডটিতে তাত্ক্ষণিকভাবে, ফাংশনটি gছোট হিসাবে হতে পারে print (2*a+1)। যদি আপনার ভাষার প্রয়োজন হয় যে আপনি একে সম্পূর্ণ অপ্রয়োজনীয় নাম এবং স্বাক্ষর সহ একটি পৃথক ফাংশন হিসাবে সংজ্ঞায়িত করেন, তবে আপনি যদি এই প্যাটার্নটি অনেক বেশি ব্যবহার করেন তবে আপনার জীবনটি অপ্রীতিকর হতে চলেছে।

অন্যদিকে, যদি আপনার ভাষা আপনাকে ল্যাম্বডাস তৈরি করতে দেয় তবে আপনি আরও ভাল অবস্থানে আছেন। তারপরে আপনি এমন কিছু লেখা শেষ করবেন

f( func(a) { print(2*a+1); })

যা এত সুন্দর।

কলব্যাক কীভাবে পাস করবেন

আপনি কিভাবে কলব্যাক ফাংশনটি পাস করবেন factorial? ভাল, আপনি এটি বিভিন্ন উপায়ে করতে পারেন।

  1. যদি ডাকা ফাংশন একই প্রক্রিয়াতে চলতে থাকে তবে আপনি কোনও ফাংশন পয়েন্টারটি পাস করতে পারেন

  2. অথবা হতে পারে আপনি fn name --> fn ptrআপনার প্রোগ্রামের একটি অভিধান বজায় রাখতে চান , সেক্ষেত্রে আপনি নামটি পাস করতে পারেন

  3. সম্ভবত আপনার ভাষা আপনাকে স্থানে ফাংশনটি সংজ্ঞায়িত করতে দেয়, ল্যাম্বডা হিসাবে সম্ভব! অভ্যন্তরীণভাবে এটি কোনও ধরণের অবজেক্ট তৈরি করছে এবং একটি পয়েন্টারটি অতিক্রম করছে, তবে আপনাকে এটি সম্পর্কে চিন্তা করতে হবে না।

  4. সম্ভবত আপনি যে ফাংশনটি কল করছেন এটি সম্পূর্ণ আলাদা মেশিনে চলছে এবং আপনি HTTP এর মতো একটি নেটওয়ার্ক প্রোটোকল ব্যবহার করে এটি কল করছেন। আপনি আপনার কলব্যাকটি একটি HTTP- কলযোগ্য ফাংশন হিসাবে প্রকাশ করতে এবং এর URL টি পাস করতে পারেন।

আপনি ধারণা পেতে।

কলব্যাকের সাম্প্রতিক উত্থান

এই ওয়েব যুগে আমরা প্রবেশ করেছি, যে পরিষেবাগুলি আমরা প্রার্থনা করি সেগুলি প্রায়শই নেটওয়ার্কের ওপরে থাকে। আমাদের প্রায়শই এই পরিষেবাগুলির উপর কোনও নিয়ন্ত্রণ থাকে না যেমন আমরা সেগুলি লিখি না, আমরা তাদের রক্ষণ করি না, আমরা নিশ্চিত করতে পারি না যে তারা শেষ বা তারা কীভাবে পারফর্ম করছে।

তবে আমরা এই পরিষেবাগুলির প্রতিক্রিয়া অপেক্ষা করার সময় আমাদের প্রোগ্রামগুলি ব্লক হওয়ার আশা করতে পারি না। এটি সম্পর্কে সচেতন থাকাকালীন, পরিষেবা সরবরাহকারীরা প্রায়শই কলব্যাক প্যাটার্ন ব্যবহার করে এপিআইগুলি ডিজাইন করেন।

জাভাস্ক্রিপ্ট কলব্যাকগুলি খুব সুন্দরভাবে সমর্থন করে যেমন ল্যাম্বডাস এবং ক্লোজার সহ। এবং জাভাস্ক্রিপ্ট ওয়ার্ল্ডে প্রচুর ক্রিয়াকলাপ রয়েছে, উভয়ই ব্রাউজারে এবং সার্ভারে। এমনকি জাভাস্ক্রিপ্ট প্ল্যাটফর্মগুলি মোবাইলের জন্য তৈরি করা হচ্ছে।

আমরা যখন এগিয়ে যাব, আমাদের আরও অনেকগুলি অ্যাসিক্রোনাস কোড লিখব, যার জন্য এই বোঝাপড়াটি প্রয়োজনীয় হবে।


1
একটি ধারণা খুব সুন্দরভাবে ব্যাখ্যা করা হয়েছে ..! :)
পীযুষগয়াল

দুর্দান্ত ব্যাখ্যা, +1।
লিঙ্গামূর্তি সিএস

1
এটি অন্য সকলের মধ্যে সেরা উত্তর। দয়া করে এটি upvote।
অভিষেক নলিন

3
নিখুঁতভাবে ব্যাখ্যা করা হয়েছে এবং সমস্ত কিছু ব্যাখ্যা করা হয়েছে। আমি আবার এটি upvote করতে চান।
যোগেশ যাদব

হ্যাঁ আমি বুঝতে পারি কীভাবে জাভাস্ক্রিপ্ট এবং রুবিতে লাম্বাস কাজ করে। এবং জাভা 8 তবে জাভা পুরাতন সংস্করণগুলি ল্যাম্বাস এবং পরিবর্তে ক্লাস ব্যবহার করত না এবং আমি জানতে চাই যে এই জাতীয় কলব্যাক কীভাবে কাজ করে। এখনও অন্য একটি উচ্চতর উত্তর।
ডোনাটো

97

মনে রাখবেন কলব্যাক এক শব্দ।

উইকিপিডিয়া কলব্যাক পৃষ্ঠাটি এটি খুব ভালভাবে ব্যাখ্যা করেছে।

উইকিপিডিয়া পৃষ্ঠা থেকে উদ্ধৃতি:

কম্পিউটার প্রোগ্রামিংয়ে, একটি কলব্যাক হল এক্সিকিউটেবল কোড, বা এক্সিকিউটেবল কোডের একটি অংশ, যা অন্য কোডের আর্গুমেন্ট হিসাবে পাস হয় to এটি একটি নিম্ন-স্তরের সফ্টওয়্যার স্তরটিকে উচ্চ স্তরের স্তরে সংজ্ঞায়িত একটি সাবরুটিন (বা ফাংশন) কল করতে অনুমতি দেয়।


14
উত্তর উপস্থাপন করার জন্য দুর্দান্ত উপায়।
চথুরাঙ্গ চন্দ্রশেখর

1
এবং এটি উত্তরকেও অন্যভাবে নিয়ে যায়। বিশেষ্য "কলব্যাক" হ'ল যাকে "ফিরে" বলা হয়েছে, একইভাবে শটডাউনের মধ্য দিয়ে যাওয়া কিছুটি বন্ধ হয়ে গেছে এবং লগ ইন করতে ব্যবহৃত কিছু হ'ল লগইন।
বেনামে

22
এটি একটি মন্তব্য হতে পারে - মূলত এটি উইকিপিডিয়ায় একটি লিঙ্ক
কোডিবাগস্টাইন

উইকিপিডিয়া আসলে তার প্রচুর পরিমাণে দুর্দান্ত কিছু দুর্দান্ত স্ট্রিং পেয়েছে। আমার সবসময় মনে হয়েছিল "কলব্যাক" শব্দটি এই শব্দটির সাহায্যে সবচেয়ে ভাল ব্যাখ্যা করা হয়েছিল, "আমি আবার ফিরে যাব ..."
টমাস

Javascriptissexy.com/… এ দুর্দান্ত ব্যাখ্যা; যা আমি এখানে পুনরায় পোস্ট করব; একটি কলব্যাক ফাংশন এমন একটি ফাংশন যা প্যারামিটার হিসাবে অন্য ফাংশনে প্রেরণ করা হয় এবং কলব্যাক ফাংশনটিকে অন্য ফাংশনের ভিতরে ডাকা বা কার্যকর করা হয়। // নোট করুন যে ক্লিক পদ্ধতির প্যারামিটারে থাকা আইটেমটি একটি ভেরিয়েবল নয়, একটি ফাংশন // // আইটেমটি একটি কলব্যাক ফাংশন $ ("# বিটিএন_1") click );}); আপনি পূর্ববর্তী উদাহরণে দেখুন, আমরা এটি কার্যকর করার জন্য ক্লিক পদ্ধতিতে পরামিতি হিসাবে একটি ফাংশনটি পাস করি -
মার্কোজেেন

46

সাধারণ ব্যক্তির প্রতিক্রিয়া হ'ল এটি এমন একটি ফাংশন যা আপনার দ্বারা নয় বরং ব্যবহারকারী বা ব্রাউজার দ্বারা কোনও নির্দিষ্ট ইভেন্টের পরে বা কোনও কোড প্রক্রিয়া করার পরে ডাকা হয়।


42

একটি কলব্যাক ফাংশন এমন একটি যা নির্দিষ্ট শর্ত পূরণ করার পরে কল করা উচিত। অবিলম্বে কল করার পরিবর্তে, কলব্যাক ফাংশনটি ভবিষ্যতে একটি নির্দিষ্ট সময়ে কল করা হয়।

সাধারণত এটি ব্যবহার করা হয় যখন কোনও কাজ শুরু করা হয় যা অবিচ্ছিন্নভাবে শেষ হবে (যেমন কলিং ফাংশন ফিরে আসার পরে কিছুক্ষণ শেষ হবে)।

উদাহরণস্বরূপ, ওয়েবপৃষ্ঠার অনুরোধ করার জন্য একটি ফাংশনটির কলব্যাক ফাংশন সরবরাহ করার জন্য তার কলারের প্রয়োজন হতে পারে যা ওয়েবপৃষ্ঠাটি ডাউনলোড শেষ হয়ে গেলে ডাকা হবে।


আপনার প্রথম বাক্যে, আপনি বলছেন "...when a condition is met"কিন্তু আমি ভেবেছিলাম কলেন্টব্যাকগুলি কল করা হয় যখন প্যারেন্ট ফাংশন সম্পাদন শেষ করে এবং শর্তের উপর নির্ভর করে না (?) Are
ওজনগওয়া জুড ওচালিফু

'নির্দিষ্ট শর্ত' এর অর্থ কেবল এলোমেলো না হয়ে সাধারণ কারণে তাদের ডাকা হয়। পিতা বা মাতা / স্রষ্টা এখনও কার্যকর করা অবস্থায় কলব্যাক কল করা যেতে পারে - যদি প্রোগ্রামার এটি আশা না করে তবে এটি একটি রেসের শর্তের দিকে নিয়ে যেতে পারে।
টমাস ব্র্যাট

ঠিক আছে। স্পষ্টতার জন্য ধন্যবাদ
ওজনুগা জুড ওচালিফু

34

টেলিফোন সিস্টেমের ক্ষেত্রে কলব্যাকগুলি খুব সহজেই বর্ণিত হয়। একটি ফাংশন কলটি টেলিফোনে কাউকে কল করা, তাকে প্রশ্ন জিজ্ঞাসা করা, উত্তর পাওয়া এবং ঝুলিয়ে রাখার অনুরূপ; কলব্যাক যুক্ত করা উপমাটিকে পরিবর্তন করে যাতে তার কাছে একটি প্রশ্ন জিজ্ঞাসার পরে আপনি তাকে নিজের নাম এবং নম্বরও দিন যাতে সে আপনাকে উত্তর দিয়ে ফিরে আসতে পারে।

- পল জাকুবিক, "সি ++ এ কলব্যাক বাস্তবায়ন"


1
সুতরাং আমার নাম এবং নম্বর একটি ফাংশন?
Koray Tugay

না, এটি সাদৃশ্য হবে যদি "কলব্যাক" এর পরিবর্তে যা হয় তার জন্য একটি ভাল নাম ছিল: আপনি টেলিফোন অপারেটরকে কল করতে বলেছেন। শেষ।
ঘেরসন

33

আমি বিশ্বাস করি যে এই "কলব্যাক" জার্গনটি ভুল জায়গায় অনেক জায়গায় ব্যবহৃত হয়েছে। আমার সংজ্ঞাটি এমন কিছু হবে:

কলব্যাক ফাংশন এমন একটি ফাংশন যা আপনি কারও কাছে পৌঁছে দেন এবং তাদের এটিকে কোনও সময়ে কল করতে দিন let

আমি মনে করি লোকেরা কেবল উইকির সংজ্ঞাটির প্রথম বাক্যটি পড়ে:

একটি কলব্যাক এক্সিকিউটেবল কোড, বা এক্সিকিউটেবল কোডের একটি অংশ, যা অন্য কোডের আর্গুমেন্ট হিসাবে পাস হয় to

আমি প্রচুর এপিআই নিয়ে কাজ করছি, বিভিন্ন খারাপ উদাহরণ দেখুন। অনেক লোক একটি ফাংশন পয়েন্টার (এক্সিকিউটেবল কোডের একটি রেফারেন্স) বা বেনামে ফাংশনগুলি (এক্সিকিউটেবল কোডের টুকরা) "কলব্যাক" এর নাম রাখেন, যদি তারা কেবলমাত্র ফাংশন হয় তবে এর জন্য আপনার আর একটি নাম প্রয়োজন কেন?

আসলে উইকির সংজ্ঞায় কেবল দ্বিতীয় বাক্যটি একটি কলব্যাক ফাংশন এবং একটি সাধারণ ফাংশনের মধ্যে পার্থক্য প্রকাশ করে:

এটি একটি নিম্ন-স্তরের সফ্টওয়্যার স্তরটিকে উচ্চ স্তরের স্তরে সংজ্ঞায়িত একটি সাবরুটিন (বা ফাংশন) কল করতে অনুমতি দেয়।

সুতরাং পার্থক্যটি হ'ল আপনি কে ফাংশনটি পাস করতে যাচ্ছেন এবং কীভাবে আপনার ফাংশনে পাস হয়েছে তাকে ডাকা হবে। যদি আপনি কেবল কোনও ফাংশন সংজ্ঞায়িত করেন এবং এটি অন্য ফাংশনে পাস করেন এবং সরাসরি সেই ফাংশন বডিটিতে কল করেন তবে এটিকে কলব্যাক বলবেন না। সংজ্ঞাটি বলে যে আপনার কার্যক্রমে উত্তীর্ণ হ'ল "নিম্ন-স্তরের" ফাংশন দ্বারা ডাকা হবে।

আমি আশা করি মানুষ এই শব্দটি অস্পষ্ট প্রসঙ্গে ব্যবহার বন্ধ করতে পারে, এটি লোককে আরও খারাপ বুঝতে আরও সাহায্য করতে পারে না।


2
আপনার উত্তরটি বোঝা যায় ... তবে এটি চিত্রিত করতে আমার সমস্যা হচ্ছে। আপনি কি একটি উদাহরণ দিতে পারেন?
কোডি বাগস্টিন

3
@ জেন ওয়াং :: সর্বশেষে আপনি লিখেছেন "সংজ্ঞাটি বলেছে যে আপনার কার্যক্রমে পাস হয়েছে" নিম্ন-স্তরের "ফাংশন দ্বারা ডাকা হবে" " আপনি কি দয়া করে নীচের স্তরের কার্যকারিতা নির্দেশ করে তা ব্যাখ্যা করতে পারেন? আপনি উদাহরণ দিলে এটি আরও ভাল।
ভিকু

একটি উদাহরণটি চমৎকার হত
ইউসুফ আজাদ

1
আমি মনে করি ক্লাসিকাল ফাংশন কল এবং কল-ব্যাক শৈলীর মধ্যে পার্থক্য নির্ভরশীল দিকের লিঙ্ক: যদি মডিউল এ নির্ভর করে ("ব্যবহার করে") মডিউল বি, এ বি এর একটি ফাংশন কল করে, এটি কলব্যাক নয়। যদি A তার বিটির সাথে একটি বিধি রেফারেন্স দেয়, তবে বি এ এর ​​একটি ফাংশন কল করে, এটি একটি কলব্যাক: কলটি মডিউল নির্ভরতার সাথে তুলনা করে পিছনে চলে যায়।
XouDo

30

আসুন এটি সহজ রাখা যাক। কল ব্যাক ফাংশন কী?

উদাহরণ ও উপমা অনুসারে y

আমার একটা সেক্রেটারি আছে। প্রতিদিন আমি তাকে জিজ্ঞাসা করি: (i) ফার্মের বহির্গমন মেলটি পোস্ট অফিসে ছেড়ে দাও এবং সে কাজটি করার পরে : (ii) আমি এই স্টিকি নোটগুলির জন্য তার পক্ষে যে কোনও কাজ লিখেছি ।

এখন, স্টিকি নোটটির কাজটি কী? কাজটি দিনে দিনে পরিবর্তিত হয়।

ধরুন এই বিশেষ দিনে, আমার কিছু ডকুমেন্ট মুদ্রণ করা দরকার। তাই আমি এটি স্টিকি নোটে লিখি এবং আমি তার ডেস্কে এটি পোস্ট করার জন্য বহির্গামী মেল সহ পিন করি।

সংক্ষেপে:

  1. প্রথমত, তাকে মেইলটি ছাড়তে হবে এবং
  2. এটি সম্পন্ন হওয়ার সাথে সাথেই তার কিছু নথি মুদ্রণ করা দরকার।

কল ব্যাক ফাংশনটি হ'ল দ্বিতীয় কাজ: সেই দস্তাবেজগুলি মুদ্রণ করে। কারণ মেলটি ফেলে দেওয়ার পরে এটি করা হয়ে গেছে, এবং ডকুমেন্টটি মুদ্রণ করতে বলার জন্য যে স্টিকি নোটটি পোস্ট করা উচিত ছিল তার সাথে তাকে দেওয়া হয়।

আসুন এখন এটিকে প্রোগ্রামিং শব্দভাণ্ডারের সাথে যুক্ত করুন

  • এই ক্ষেত্রে পদ্ধতির নাম: ড্রপঅফমেল M
  • এবং কল ব্যাক ফাংশনটি হ'ল: প্রিন্টঅফড ডকুমেন্টস। প্রিন্টঅফড ডকুমেন্টস হ'ল কল ব্যাক ফাংশন কারণ আমরা সচিবকে এটি করতে চাই, কেবল ড্রপঅফমেল চালানোর পরে run
  • সুতরাং আমি ড্রপঅফমেল পদ্ধতিতে "আর্গুমেন্ট" হিসাবে প্রিন্টফিল ডকুমেন্টগুলি "পাস করব" এটি একটি গুরুত্বপূর্ণ বিষয়।

এতটুকুই। বেশি কিছু না. আমি আশা করি এটি আপনার জন্য এটি পরিষ্কার হয়ে গেছে - এবং যদি না হয় তবে একটি মন্তব্য পোস্ট করুন এবং আমি পরিষ্কার করার জন্য যথাসাধ্য চেষ্টা করব।


18

এটি পদ্ধতির শেষে কলব্যাকগুলি রিটার্ন স্টেটমেন্টের মতো শোনায়।

আমি নিশ্চিত নই যে এগুলি কি।

আমি মনে করি কলব্যাকস আসলে একটি ফাংশনে কল, অন্য ফাংশনটির আহ্বান এবং সম্পূর্ণ হওয়ার ফলস্বরূপ।

আমি আরও মনে করি কলব্যাকস বোঝানো মূল উত্সাহকে সম্বোধন করে এক ধরণের "আরে! আপনি যে জিনিসটির জন্য জিজ্ঞাসা করেছিলেন? আমি তা করে ফেলেছি - কেবল ভেবেছিলাম আমি আপনাকে জানাব - আপনার কাছে ফিরে আসব"।


1
কলব্যাক্স বনাম রিটার্নের বিবৃতি জিজ্ঞাসা করার জন্য +1। আমি এটির দ্বারা ধরা পড়তাম এবং আমি যে স্নাতকদের সাথে কাজ করি তাদেরও তাই করি।
8bitjunkie

2
ভাল উত্তর - অন্যান্য উত্তরগুলির তুলনায় আমাকে এটি বুঝতে সহায়তা করেছে!
অ্যাডাম

18

কলব্যাক কী ?

  • সাধারণভাবে, একজন টেলিফোন কলটি পেয়েছিল যে কেউ পেয়েছেন made
  • কম্পিউটিংয়ে, একটি কলব্যাক এক্সিকিউটেবল কোডের একটি অংশ যা অন্য কোডের আর্গুমেন্ট হিসাবে পাস হয়। যখন ফাংশনটি এর কাজটি (বা যখন কোনও ইভেন্ট ঘটে) এর সাথে সম্পন্ন হয় তখন এটি আপনার কলব্যাককে কল করে (এটি আপনাকে আবার কল করে - সুতরাং নামটি) ফাংশন।

একটি কি কলব্যাক ফাংশন ?

  • কলব্যাক ফাংশন হ'ল একজন সার্ভেন্টের মতো, যিনি কোনও কাজ শেষ করার পরে তার মাস্টারে "ফিরে" যান।
  • একটি কলব্যাক ফাংশন একটি ফাংশন যে অন্য ফাংশন প্রেরণ করা হয় (এই অন্যান্য ফাংশন কল দিন হয় otherFunctionএকটি প্যারামিটার হিসাবে), এবং কলব্যাক ফাংশন বলা হয় (অথবা মৃত্যুদন্ড কার্যকর) ভিতরে otherFunction
    function action(x, y, callback) {
        return callback(x, y);
    }

    function multiplication(x, y) {
        return x * y;
    }

    function addition(x, y) {
        return x + y;
    }

    alert(action(10, 10, multiplication)); // output: 100

    alert(action(10, 10, addition)); // output: 20

এসওএ-তে, কলব্যাকটি প্লাগিন মডিউলগুলি ধারক / পরিবেশ থেকে পরিষেবাগুলি অ্যাক্সেস করার অনুমতি দেয়।

সাদৃশ্য: কলব্যাক্স। অ্যাসিঙ্ক্রোনাস। কলব্যাকের জন্য অ-অবরুদ্ধ
রিয়েল জীবনের উদাহরণ


একটি কলব্যাক ফাংশন নিজেই কোনও উচ্চ-অর্ডার ফাংশন নয়। এটি একটি উচ্চ-আদেশ ক্রিয়াকলাপে পাস করা হয়েছে।
ড্যানিও

17

কল আফটার মূ .় নাম, কলব্যাকের চেয়ে ভাল নাম হবে । যখন বা কোনও শর্তের মধ্যে শর্তটি পূরণ হয়, তখন অন্য কোনও ফাংশনকে কল করুন , ফাংশনের পরে কল করুন , এটি আর্গুমেন্ট হিসাবে প্রাপ্ত।

কোনও ফাংশনের মধ্যে একটি অভ্যন্তরীণ ফাংশনটিকে হার্ড-কোড করার পরিবর্তে, একটি ইতিমধ্যে লিখিত কলটি ফাংশনের পরে আর্গুমেন্ট হিসাবে গ্রহণ করার জন্য একটি ফাংশন লিখে । কল করার পর বলা পেতে পারে রাষ্ট্র পরিবর্তনের উপর ভিত্তিতে ফাংশন যুক্তি গ্রহণ করতে কোড দ্বারা সনাক্ত হয়েছে।


এটি একটি মহান ধারণা। এটি চেষ্টা করার এবং ব্যাখ্যা করার জন্য আমি "পিছনে ডাকলাম" এর পক্ষে গিয়েছিলাম। আমি মার্টিন ফওলারের মতো কাউকে তার সেমিনাল ব্লগে এর জন্য একটি নতুন শব্দ হিসাবে "কল পরে" জনপ্রিয় করতে দেখলাম।
বিটজুঙ্কি

15

কলব্যাক ফাংশন হ'ল একটি ফাংশন যা আপনি একটি বিদ্যমান ফাংশন / পদ্ধতিতে নির্দিষ্ট করেছেন, কোনও ক্রিয়া শেষ হওয়ার পরে ডাকা হতে হবে, অতিরিক্ত প্রক্রিয়াজাতকরণ ইত্যাদি প্রয়োজন etc.

জাভাস্ক্রিপ্টে বা আরও বিশেষত jQuery এ উদাহরণস্বরূপ, অ্যানিমেশন শেষ হয়ে গেলে আপনি কল করার জন্য কলব্যাক আর্গুমেন্ট নির্দিষ্ট করতে পারেন।

পিএইচপি-তে, preg_replace_callback()ফাংশনটি আপনাকে এমন একটি ফাংশন সরবরাহ করতে দেয় যা নিয়মিত অভিব্যক্তি মিলে গেলে ডাকা হবে,


10

ছবিটি দেখুন :)এটা এভাবে কাজ করে

প্রধান প্রোগ্রাম কলব্যাক ফাংশন নাম সহ লাইব্রেরি ফাংশন (যা সিস্টেম স্তরের ফাংশনও হতে পারে) কল করে। এই কলব্যাক ফাংশনটি একাধিক উপায়ে প্রয়োগ করা যেতে পারে। মূল প্রোগ্রামটি প্রয়োজন অনুযায়ী একটি কলব্যাক চয়ন করে।

শেষ অবধি, লাইব্রেরির ফাংশন কার্যকর করার সময় কলব্যাক ফাংশন কল করে।


7
আপনি কি এই বিষয়ে একটি পাঠ্য ব্যাখ্যা যুক্ত করতে আপত্তি করবেন ? চিত্রটি যদি অদৃশ্য হয়ে যায় তবে এই উত্তরটি সমস্ত প্রসঙ্গ হারাবে।
টিম পোস্ট

অন্যান্য লোকদের পাঠ্য এটি সর্বোত্তমভাবে ব্যাখ্যা করে। আমি যে জিনিসটির কেবলমাত্র অভাব অনুভব করেছি তা হ'ল চিত্রটি :)

আমি এখানে দেখেছি দীর্ঘ বাঁকানো বিবরণগুলির মধ্যে এটি একটি যা আমাকে যেতে বাধ্য করেছে "আহহহহ, এখন আমি এর ব্যবহার দেখতে পাচ্ছি।" একটি upvote আছে।
ডিবোসকো

7

এই প্রশ্নের সহজ উত্তর হ'ল কলব্যাক ফাংশন এমন একটি ফাংশন যা ফাংশন পয়েন্টারের মাধ্যমে ডাকা হয়। আপনি যদি কোনও ফাংশনের পয়েন্টার (ঠিকানা) অন্যের কাছে আর্গুমেন্ট হিসাবে পাস করেন, যখন সেই পয়েন্টারটি ফাংশনটি কল করতে ব্যবহৃত হয় যখন এটি নির্দেশ করে যে বলা হয় যে ফিরে কল হয়েছে


6

ধরুন আমাদের একটি ফাংশন রয়েছে sort(int *arraytobesorted,void (*algorithmchosen)(void))যেখানে এটি কোনও ফাংশন পয়েন্টারটিকে তার আর্গুমেন্ট হিসাবে গ্রহণ করতে পারে যা sort()এর বাস্তবায়নের কোনও পর্যায়ে ব্যবহার করা যেতে পারে । তারপরে, এখানে যে কোডটি ফাংশন পয়েন্টার দ্বারা সম্বোধন করা algorithmchosenহচ্ছে তাকে কলব্যাক ফাংশন বলা হয় ।

এবং দেখুন সুবিধাটি হ'ল আমরা যে কোনও অ্যালগরিদম পছন্দ করতে পারি:

  1.    algorithmchosen = bubblesort
  2.    algorithmchosen = heapsort
  3.    algorithmchosen = mergesort   ...

যা ছিল, প্রোটোটাইপ দিয়ে প্রয়োগ করা হয়েছে:

  1.   `void bubblesort(void)`
  2.   `void heapsort(void)`
  3.   `void mergesort(void)`   ...

এটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ে পলিমারফিজম অর্জনে ব্যবহৃত একটি ধারণা


Javascriptissexy.com/… এ দুর্দান্ত ব্যাখ্যা; যা আমি এখানে পুনরায় পোস্ট করব; একটি কলব্যাক ফাংশন এমন একটি ফাংশন যা প্যারামিটার হিসাবে অন্য ফাংশনে প্রেরণ করা হয় এবং কলব্যাক ফাংশনটিকে অন্য ফাংশনের ভিতরে ডাকা বা কার্যকর করা হয়। // নোট করুন যে ক্লিক পদ্ধতির প্যারামিটারে থাকা আইটেমটি একটি ভেরিয়েবল নয়, একটি ফাংশন // // আইটেমটি একটি কলব্যাক ফাংশন $ ("# বিটিএন_1") click );}); পূর্ববর্তী উদাহরণে আপনি যেমন দেখতে পান, আমরা এটি কার্যকর করার জন্য ক্লিক পদ্ধতিতে পরামিতি হিসাবে একটি ফাংশনটি পাস করি -
মার্কোজেেন

4

“কম্পিউটার প্রোগ্রামিংয়ে, কলব্যাক হল এক্সিকিউটেবল কোড, বা এক্সিকিউটেবল কোডের একটি অংশ, যা অন্য কোডের পক্ষে আর্গুমেন্ট হিসাবে পাস হয়। এটি একটি নিম্ন-স্তরের সফ্টওয়্যার স্তরকে উচ্চ স্তরের স্তরে সংজ্ঞায়িত সাবরুটিন (বা ফাংশন) কল করতে অনুমতি দেয় ”" - উইকিপিডিয়া

ফাংশন পয়েন্টার ব্যবহার করে সি তে কলব্যাক

সি তে, ফাংশন পয়েন্টার ব্যবহার করে কলব্যাক প্রয়োগ করা হয়। ফাংশন পয়েন্টার - নাম হিসাবে বোঝা যায় একটি ফাংশনের পয়েন্টার।

উদাহরণস্বরূপ, int (* ptrFunc) ();

এখানে, ptrFunc একটি ফাংশনটির জন্য একটি পয়েন্টার যা কোনও আর্গুমেন্ট নেয় না এবং পূর্ণসংখ্যা ফেরত দেয়। প্রথম বন্ধনী রাখতে ভুলবেন না, অন্যথায় সংকলকটি ধরে নেবে যে পিটিআরফুঙ্ক একটি সাধারণ ফাংশন নাম, যা কিছুই নেয় না এবং একটি পূর্ণসংখ্যার দিকে একটি পয়েন্টার দেয়।

ফাংশন পয়েন্টারটি প্রদর্শনের জন্য এখানে কিছু কোড রয়েছে।

#include<stdio.h>
int func(int, int);
int main(void)
{
    int result1,result2;
    /* declaring a pointer to a function which takes
       two int arguments and returns an integer as result */
    int (*ptrFunc)(int,int);

    /* assigning ptrFunc to func's address */                    
    ptrFunc=func;

    /* calling func() through explicit dereference */
    result1 = (*ptrFunc)(10,20);

    /* calling func() through implicit dereference */        
    result2 = ptrFunc(10,20);            
    printf("result1 = %d result2 = %d\n",result1,result2);
    return 0;
}

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

এখন আসুন ফাংশন পয়েন্টার ব্যবহার করে সি-তে কলব্যাকের ধারণাটি বোঝার চেষ্টা করি।

সম্পূর্ণ প্রোগ্রামটিতে তিনটি ফাইল রয়েছে: কলব্যাক.সি., রেজি_ক্যালব্যাক.হ এবং Reg_callback.c।

/* callback.c */
#include<stdio.h>
#include"reg_callback.h"

/* callback function definition goes here */
void my_callback(void)
{
    printf("inside my_callback\n");
}

int main(void)
{
    /* initialize function pointer to
    my_callback */
    callback ptr_my_callback=my_callback;                        
    printf("This is a program demonstrating function callback\n");
    /* register our callback function */
    register_callback(ptr_my_callback);                          
    printf("back inside main program\n");
    return 0;
}

/* reg_callback.h */
typedef void (*callback)(void);
void register_callback(callback ptr_reg_callback);


/* reg_callback.c */
#include<stdio.h>
#include"reg_callback.h"

/* registration goes here */
void register_callback(callback ptr_reg_callback)
{
    printf("inside register_callback\n");
    /* calling our callback function my_callback */
    (*ptr_reg_callback)();                               
}

আমরা যদি এই প্রোগ্রামটি চালাই তবে আউটপুট হবে

এটি মূল প্রোগ্রামের ভিতরে আমার_ক্যালব্যাকের অভ্যন্তরে রেজিস্টার_ক্যালব্যাকের ভিতরে ফাংশন কলব্যাক প্রদর্শনকারী একটি প্রোগ্রাম

উচ্চতর স্তর ফাংশনটি একটি সাধারণ কল হিসাবে নিম্ন স্তরের ফাংশনকে কল করে এবং কলব্যাক প্রক্রিয়াটি নিম্ন স্তরের ফাংশনটিকে একটি পয়েন্টারের মাধ্যমে কলব্যাক ফাংশনে কল করতে উচ্চতর স্তর ফাংশনটিকে কল করতে দেয়।

জাভাতে ইন্টারফেস ব্যবহার করে কলব্যাক

জাভাতে ফাংশন পয়েন্টারের ধারণা নেই এটি এখানে তার ইন্টারফেস মেকানিজমের মাধ্যমে কলব্যাক প্রক্রিয়া প্রয়োগ করে এখানে ফাংশন পয়েন্টারের পরিবর্তে, আমরা একটি ইন্টারফেসের এমন একটি পদ্ধতি ঘোষণা করি যা কলি তার কাজ শেষ করে ডাকলে ডাকা হবে called

আমি এটি একটি উদাহরণের মাধ্যমে প্রদর্শন করতে পারি:

কলব্যাক ইন্টারফেস

public interface Callback
{
    public void notify(Result result);
}

কলার বা উচ্চ স্তরের শ্রেণি

public Class Caller implements Callback
{
Callee ce = new Callee(this); //pass self to the callee

//Other functionality
//Call the Asynctask
ce.doAsynctask();

public void notify(Result result){
//Got the result after the callee has finished the task
//Can do whatever i want with the result
}
}

Callee বা নিম্ন স্তর ফাংশন

public Class Callee {
Callback cb;
Callee(Callback cb){
this.cb = cb;
}

doAsynctask(){
//do the long running task
//get the result
cb.notify(result);//after the task is completed, notify the caller
}
}

ইভেন্টলিস্টনার প্যাটার্ন ব্যবহার করে কলব্যাক

  • তালিকাবদ্ধ

এই নিদর্শনটি 0 থেকে n পর্যবেক্ষক / শ্রোতার একটি নির্দিষ্ট কাজ শেষ হয়ে গেছে এমন সংখ্যার অবহিত করার জন্য ব্যবহৃত হয়

  • তালিকাবদ্ধ

কলব্যাক মেকানিজম এবং ইভেন্টলাইজনার / পর্যবেক্ষক ব্যবস্থার মধ্যে পার্থক্য হ'ল কলব্যাকের ক্ষেত্রে, কলি একক কলারকে অবহিত করে, যেখানে ইভেন্টলাইজার / অবজার্ভারে, কলি সেই ইভেন্টে আগ্রহী যে কাউকে অবহিত করতে পারে (বিজ্ঞপ্তিটি অন্য কোনও অংশে যেতে পারে) অ্যাপ্লিকেশন যা কাজটি ট্রিগার করে না)

আমি এটি একটি উদাহরণের মাধ্যমে ব্যাখ্যা করি।

ইভেন্ট ইন্টারফেস

public interface Events {

public void clickEvent();
public void longClickEvent();
}

ক্লাস উইজেট

package com.som_itsolutions.training.java.exampleeventlistener;

import java.util.ArrayList;
import java.util.Iterator;

public class Widget implements Events{

    ArrayList<OnClickEventListener> mClickEventListener = new ArrayList<OnClickEventListener>(); 
    ArrayList<OnLongClickEventListener> mLongClickEventListener = new ArrayList<OnLongClickEventListener>();

    @Override
    public void clickEvent() {
        // TODO Auto-generated method stub
        Iterator<OnClickEventListener> it = mClickEventListener.iterator();
                while(it.hasNext()){
                    OnClickEventListener li = it.next();
                    li.onClick(this);
                }   
    }
    @Override
    public void longClickEvent() {
        // TODO Auto-generated method stub
        Iterator<OnLongClickEventListener> it = mLongClickEventListener.iterator();
        while(it.hasNext()){
            OnLongClickEventListener li = it.next();
            li.onLongClick(this);
        }

    }

    public interface OnClickEventListener
    {
        public void onClick (Widget source);
    }

    public interface OnLongClickEventListener
    {
        public void onLongClick (Widget source);
    }

    public void setOnClickEventListner(OnClickEventListener li){
        mClickEventListener.add(li);
    }
    public void setOnLongClickEventListner(OnLongClickEventListener li){
        mLongClickEventListener.add(li);
    }
}

ক্লাস বাটন

public class Button extends Widget{
private String mButtonText;
public Button (){
} 
public String getButtonText() {
return mButtonText;
}
public void setButtonText(String buttonText) {
this.mButtonText = buttonText;
}
}

ক্লাস চেকবক্স

public class CheckBox extends Widget{
private boolean checked;
public CheckBox() {
checked = false;
}
public boolean isChecked(){
return (checked == true);
}
public void setCheck(boolean checked){
this.checked = checked;
}
}

ক্রিয়াকলাপ ক্লাস

প্যাকেজ com.som_itsolutions.training.java.exampleeventlistener;

public class Activity implements Widget.OnClickEventListener
{
    public Button mButton;
    public CheckBox mCheckBox;
    private static Activity mActivityHandler;
    public static Activity getActivityHandle(){
        return mActivityHandler;
    }
    public Activity ()
    {
        mActivityHandler = this;
        mButton = new Button();
        mButton.setOnClickEventListner(this);
        mCheckBox = new CheckBox();
        mCheckBox.setOnClickEventListner(this);
        } 
    public void onClick (Widget source)
    {
        if(source == mButton){
            mButton.setButtonText("Thank you for clicking me...");
            System.out.println(((Button) mButton).getButtonText());
        }
        if(source == mCheckBox){
            if(mCheckBox.isChecked()==false){
                mCheckBox.setCheck(true);
                System.out.println("The checkbox is checked...");
            }
            else{
                mCheckBox.setCheck(false);
                System.out.println("The checkbox is not checked...");
            }       
        }
    }
    public void doSomeWork(Widget source){
        source.clickEvent();
    }   
}

অন্যান্য ক্লাস

public class OtherClass implements Widget.OnClickEventListener{
Button mButton;
public OtherClass(){
mButton = Activity.getActivityHandle().mButton;
mButton.setOnClickEventListner(this);//interested in the click event                        //of the button
}
@Override
public void onClick(Widget source) {
if(source == mButton){
System.out.println("Other Class has also received the event notification...");
}
}

মেইন ক্লাস

public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Activity a = new Activity();
OtherClass o = new OtherClass();
a.doSomeWork(a.mButton);
a.doSomeWork(a.mCheckBox);
}
}

উপরের কোড থেকে আপনি দেখতে পাচ্ছেন যে, আমাদের একটি ইভেন্ট বলে একটি ইন্টারফেস রয়েছে যা মূলত আমাদের অ্যাপ্লিকেশনটির জন্য ঘটতে পারে এমন সমস্ত ইভেন্টের তালিকা করে। উইজেট শ্রেণি বাটন, চেকবাক্সের মতো সমস্ত ইউআই উপাদানগুলির জন্য বেস শ্রেণি। এই ইউআই উপাদানগুলি হ'ল অবজেক্টগুলি যা ফ্রেমওয়ার্ক কোড থেকে প্রকৃতপক্ষে ইভেন্টগুলি গ্রহণ করে। উইজেট শ্রেণি ইভেন্টস ইন্টারফেস প্রয়োগ করে এবং এটিতে দুটি ক্লিক করা ইন্টারফেস রয়েছে যেমন অনক্লিকএভেন্টলিস্টনার এবং অনলং ক্লিকএভেন্টলিস্টনার

এই দুটি ইন্টারফেস বাটন বা চেকবাক্সের মতো উইজেট প্রাপ্ত ইউআই উপাদান যেমন ঘটতে পারে তা শোনার জন্য দায়ী। সুতরাং আমরা যদি জাভা ইন্টারফেস ব্যবহার করে পূর্ববর্তী কলব্যাক উদাহরণের সাথে এই উদাহরণটি তুলনা করি তবে এই দুটি ইন্টারফেস কলব্যাক ইন্টারফেস হিসাবে কাজ করে। সুতরাং উচ্চ স্তরের কোড (এখানে ক্রিয়াকলাপ) এই দুটি ইন্টারফেস প্রয়োগ করে। এবং যখনই কোনও উইজেটের সাথে কোনও ইভেন্ট ঘটে তখন উচ্চ স্তরের কোড (বা উচ্চতর স্তরের কোডে প্রয়োগ করা এই ইন্টারফেসগুলির পদ্ধতি, যা এখানে ক্রিয়াকলাপ) বলা হবে।

এখন আমি কলব্যাক এবং ইভেন্টলিস্টার ধাঁচের মধ্যে মূল পার্থক্যটি আলোচনা করব। যেমনটি আমরা উল্লেখ করেছি যে কলব্যাক ব্যবহার করে, কলি কেবলমাত্র একটিমাত্র কলারকে অবহিত করতে পারে। তবে ইভেন্টলিস্টনার প্যাটার্নের ক্ষেত্রে, অ্যাপ্লিকেশনটির অন্য কোনও অংশ বা শ্রেণি বাটন বা চেকবক্সে ঘটতে পারে এমন ইভেন্টের জন্য নিবন্ধন করতে পারে। এই ধরণের শ্রেণির উদাহরণ হ'ল অন্যান্যক্লাস। আপনি যদি অন্যান্য ক্লাসের কোডটি দেখতে পান তবে আপনি দেখতে পাবেন যে এটি ক্রিয়াকলাপে সংজ্ঞায়িত বোতামে প্রদর্শিত হতে পারে ক্লিকইভেন্টের শ্রোতা হিসাবে নিজেকে নিবন্ধিত করেছে। মজার অংশটি হ'ল, ক্রিয়াকলাপ (কলার) ছাড়াও, বাটনটিতে ক্লিক ইভেন্ট যখনই ঘটে তখন এই অন্যান্য ক্লাসটিও অবহিত করা হবে।


শুধুমাত্র উত্তর লিঙ্ক এড়ানো দয়া করে । উত্তর যে "সবে আরো একটি বহিস্থিত সাইটের একটি লিঙ্ক চেয়ে" হয় মুছে ফেলা হতে পারে
কোয়েন্টিন

3

কলব্যাক ফাংশন এমন একটি ফাংশন যা আপনি নির্দিষ্ট ফাংশন বা অবজেক্টে (রেফারেন্স বা পয়েন্টার হিসাবে) পাস করেন। এই ফাংশন বা অবজেক্টটি এই ফাংশনটিকে যেকোন সময় পরে পুনরায় কল করবে, সম্ভবত একাধিক বার, যে কোনও ধরণের উদ্দেশ্যে:

  • কোনও কাজের সমাপ্তি অবহিত করা
  • দুটি আইটেমের মধ্যে তুলনা করার অনুরোধ করা (যেমন সি কিউসোর্ট () এর মতো)
  • একটি প্রক্রিয়া অগ্রগতি রিপোর্ট
  • ইভেন্টগুলি অবহিত
  • একটি বস্তুর তাত্পর্য প্রেরণ
  • একটি অঞ্চলের চিত্রকলার প্রতিনিধিত্ব করা

...

সুতরাং অন্য ফাংশন বা টাস্কের শেষে কল করা একটি ফাংশন হিসাবে কলব্যাকের বর্ণনা দেওয়া অত্যধিক সরল করা হচ্ছে (এমনকি এটি সাধারণ ব্যবহারের ক্ষেত্রেও হয়)।


2

একটি কলব্যাক হ'ল একটি ফাংশনটিকে অন্য ফাংশনে প্যারামিটার হিসাবে পাস করার একটি ধারণা এবং প্রক্রিয়াটি শেষ হয়ে গেলে এইটিকে অনুরোধ করা হয়।

যদি আপনি উপরের দুর্দান্ত উত্তরগুলির মাধ্যমে কলব্যাকের ধারণাটি পান তবে আমি আপনাকে পরামর্শ দিচ্ছি যে এটির ধারণাটির পটভূমিটি আপনার উচিত।

"কী তাদের (কম্পিউটার বিজ্ঞানী) কলব্যাক বিকাশ করেছে?" আপনি কোনও সমস্যা শিখতে পারেন যা ব্লক করছে ((বিশেষত ইউআই অবরুদ্ধ করা) এবং কলব্যাকই এর একমাত্র সমাধান নয়। আরও অনেকগুলি সমাধান রয়েছে (উদা: থ্রেড, ফিউচার, প্রতিশ্রুতি ...)।


1

একটি গুরুত্বপূর্ণ ব্যবহারের ক্ষেত্র হ'ল আপনি নিজের ফাংশনটির একটিটিকে হ্যান্ডেল হিসাবে (যেমন একটি কলব্যাক) নিবন্ধন করুন এবং তারপরে কোনও কাজ বা প্রক্রিয়াজাতকরণের জন্য কোনও বার্তা পাঠান / কোনও ফাংশন কল করুন। প্রসেসিং শেষ হওয়ার পরে, কথিত ফাংশনটি আমাদের নিবন্ধিত ফাংশনটিকে কল করবে (অর্থাত্ এখন কল ব্যাক শেষ হয়ে গেছে), সুতরাং আমাদের প্রক্রিয়াটি সম্পন্ন হওয়ার ইঙ্গিত দেয়।
এই উইকিপিডিয়া লিঙ্কটি গ্রাফিকভাবে বেশ ভালভাবে ব্যাখ্যা করেছে।


1

একটি কলব্যাক ফাংশন, উচ্চতর অর্ডার ফাংশন হিসাবে পরিচিত, এমন একটি ফাংশন যা প্যারামিটার হিসাবে অন্য ফাংশনে প্রেরণ করা হয় এবং কলব্যাক ফাংশনটিকে প্যারেন্ট ফাংশনের অভ্যন্তরে বলা হয় (বা সম্পাদিত)।

$("#button_1").click(function() {
  alert("button 1 Clicked");
});

এখানে আমরা ক্লিক পদ্ধতিতে প্যারামিটার হিসাবে একটি ফাংশন পাস করেছি। এবং ক্লিকের পদ্ধতিটি আমরা এটিতে যে কলব্যাক ফাংশনটি দিয়েছিল তা কল করবে (বা সম্পাদন করবে)।


1
একটি কলব্যাক ফাংশন নিজেই কোনও উচ্চ-অর্ডার ফাংশন নয়। এটি একটি উচ্চ-আদেশ ক্রিয়াকলাপে পাস করা হয়েছে।
ড্যানিও

1

কলব্যাক ফাংশন একটি ফাংশন যা আর্গুমেন্ট হিসাবে অন্য ফাংশনে চলে গেছে।

function test_function(){       
 alert("Hello world");  
} 

setTimeout(test_function, 2000);

দ্রষ্টব্য: উপরের উদাহরণে set_Timeout ফাংশনটির জন্য আর্গুমেন্ট হিসাবে ব্যবহৃত টেস্ট_ফাংশন।


1
স্ট্যাক ওভারফ্লোতে স্বাগতম! কোনও প্রশ্নের উত্তর দেওয়ার আগে সর্বদা বিদ্যমান উত্তরগুলি পড়ুন। এই উত্তর ইতিমধ্যে সরবরাহ করা হয়েছে। উত্তরটি পুনরাবৃত্তি করার পরিবর্তে বিদ্যমান উত্তরে ভোট দিন। ভাল উত্তর লেখার জন্য কিছু গাইডলাইন এখানে পাওয়া যাবে
ডিফারঙ্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.