কলব্যাক ফাংশন কী?
কলব্যাক ফাংশন কী?
উত্তর:
বিকাশকারীরা প্রায়শই বিভ্রান্ত হন কারণ অভিশপ্ত জিনিসটির নাম বলে কলব্যাক কী।
একটি কলব্যাক ফাংশন একটি ফাংশন যা হ'ল:
কলব্যাক ফাংশন কীভাবে কাজ করে তা কল্পনা করার একটি দুর্দান্ত উপায় হ'ল এটি এমন একটি ফাংশন যা এতে ফাংশনটির " পিছনে ডাকা " হয়।
সম্ভবত আরও ভাল নাম একটি "পরে কল" ফাংশন হবে।
এই কনস্ট্রাক্টটি অ্যাসিঙ্ক্রোনাস আচরণের জন্য খুব কার্যকর যেখানে আমরা যখনই কোনও পূর্ববর্তী ইভেন্টটি সম্পন্ন করে তখনই কোনও ক্রিয়াকলাপ ঘটানো চাই।
সুডোকোড:
// 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.
এখানে আউটপুট ক্রম গুরুত্বপূর্ণ। যেহেতু কলব্যাক ফাংশনগুলি পরে বলা হয়, "আমি প্রিন্টিং নম্বরগুলি শেষ করেছি" সর্বশেষে ছাপা হয়, প্রথমে নয়।
পয়েন্টার ভাষার সাথে তাদের ব্যবহারের কারণে কলব্যাকগুলি তথাকথিত। আপনি যদি এর মধ্যে একটিও ব্যবহার না করেন তবে 'কলব্যাক' নামটি নিয়ে শ্রম করবেন না। কেবল বুঝতে পারি যে অন্য পদ্ধতির আর্গুমেন্ট হিসাবে সরবরাহ করা কোনও পদ্ধতির বর্ণনা দেওয়ার জন্য এটি কেবল একটি নাম, যেমন যখন প্যারেন্ট পদ্ধতিটি বলা হয় (যে কোনও শর্ত, যেমন একটি বোতাম ক্লিক, টাইমার টিক ইত্যাদি) এবং তার পদ্ধতির বডিটি সম্পূর্ণ হয়, এরপরে কলব্যাক ফাংশনটি চাওয়া হয়।
কিছু ভাষা সমর্থন করে যেখানে একাধিক কলব্যাক ফাংশন আর্গুমেন্ট সমর্থিত হয় এবং প্যারেন্ট ফাংশনটি কীভাবে সম্পন্ন হয় তার উপর ভিত্তি করে কল করা হয় (অর্থাত্ প্যারেন্ট ফাংশনটি সাফল্যের সাথে শেষ হয় এমন ইভেন্টে একটি কলব্যাক বলা হয়, পিতামাত ফাংশনটি ছুড়ে দেয় এমন ইভেন্টে অন্যটিকে ডাকা হয়) নির্দিষ্ট ত্রুটি, ইত্যাদি)।
once its parent method completes, the function which this argument represents is then called
। সুতরাং যদি ফাংশনটি অন্য কোনও ফাংশনে আর্গুমেন্ট হিসাবে পাস করা হয় তবে প্যারেন্ট ফাংশনটির রানটাইমের মাঝখানে থেকে ডাকা হয় তবে এটি কোনও ফাংশন হিসাবে parent(cb) {dostuff1(); cb(); dostuff2()}
বিবেচিত হবে না callback
?
কলব্যাক ফাংশন হ'ল এমন একটি ফাংশন যা আপনি সেই কোড দ্বারা কল করার অনুমতি দিয়ে কোডের অন্য টুকরো সরবরাহ করেন।
তুমি কেন এটা করতে চাও? আসুন বলি যে একটি পরিষেবা রয়েছে যা আপনাকে প্রার্থনা করতে হবে। যদি পরিষেবাটি অবিলম্বে ফিরে আসে তবে আপনি কেবল:
উদাহরণস্বরূপ, ধরুন পরিষেবাটি ছিল factorial
ফাংশন। আপনি যখন এর মান চান 5!
, আপনি অনুরোধ করবেন factorial(5)
, এবং নিম্নলিখিত পদক্ষেপগুলি উপস্থিত হবে:
আপনার বর্তমান সম্পাদনের অবস্থানটি সংরক্ষণ করা হয়েছে (স্ট্যাকের মধ্যে, তবে এটি গুরুত্বপূর্ণ নয়)
মৃত্যুদণ্ড কার্যকর করা হয়েছে factorial
factorial
সম্পূর্ণ হয়ে গেলে , ফলাফলটি কোথাও আপনি এটিকে পেতে পারেন
মৃত্যুদন্ড কার্যকর হয়েছিল যেখানে সেখানে ছিল [1]
এখন ধরা যাক factorial
সত্যিই দীর্ঘ সময় লেগেছে, কারণ আপনি এটিকে বিশাল সংখ্যক দিচ্ছেন এবং এটি কোনও কোনও সুপারকম্পিউটিং ক্লাস্টারকে অন্যত্র চালানো দরকার। ধরা যাক আপনি আপনার ফলাফলটি ফিরে আসতে 5 মিনিট সময় নেবেন বলে আশা করছেন। আপনি করতে পারেন:
আপনি যখন ঘুমোবেন তখন আপনার ডিজাইনটি রাখুন এবং আপনার প্রোগ্রামটি চালান, যাতে আপনি অর্ধেক সময় পর্দার দিকে তাকান না
আপনার প্রোগ্রামটি কাজ করার সময় অন্যান্য কাজ করার 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
? ভাল, আপনি এটি বিভিন্ন উপায়ে করতে পারেন।
যদি ডাকা ফাংশন একই প্রক্রিয়াতে চলতে থাকে তবে আপনি কোনও ফাংশন পয়েন্টারটি পাস করতে পারেন
অথবা হতে পারে আপনি fn name --> fn ptr
আপনার প্রোগ্রামের একটি অভিধান বজায় রাখতে চান , সেক্ষেত্রে আপনি নামটি পাস করতে পারেন
সম্ভবত আপনার ভাষা আপনাকে স্থানে ফাংশনটি সংজ্ঞায়িত করতে দেয়, ল্যাম্বডা হিসাবে সম্ভব! অভ্যন্তরীণভাবে এটি কোনও ধরণের অবজেক্ট তৈরি করছে এবং একটি পয়েন্টারটি অতিক্রম করছে, তবে আপনাকে এটি সম্পর্কে চিন্তা করতে হবে না।
সম্ভবত আপনি যে ফাংশনটি কল করছেন এটি সম্পূর্ণ আলাদা মেশিনে চলছে এবং আপনি HTTP এর মতো একটি নেটওয়ার্ক প্রোটোকল ব্যবহার করে এটি কল করছেন। আপনি আপনার কলব্যাকটি একটি HTTP- কলযোগ্য ফাংশন হিসাবে প্রকাশ করতে এবং এর URL টি পাস করতে পারেন।
আপনি ধারণা পেতে।
এই ওয়েব যুগে আমরা প্রবেশ করেছি, যে পরিষেবাগুলি আমরা প্রার্থনা করি সেগুলি প্রায়শই নেটওয়ার্কের ওপরে থাকে। আমাদের প্রায়শই এই পরিষেবাগুলির উপর কোনও নিয়ন্ত্রণ থাকে না যেমন আমরা সেগুলি লিখি না, আমরা তাদের রক্ষণ করি না, আমরা নিশ্চিত করতে পারি না যে তারা শেষ বা তারা কীভাবে পারফর্ম করছে।
তবে আমরা এই পরিষেবাগুলির প্রতিক্রিয়া অপেক্ষা করার সময় আমাদের প্রোগ্রামগুলি ব্লক হওয়ার আশা করতে পারি না। এটি সম্পর্কে সচেতন থাকাকালীন, পরিষেবা সরবরাহকারীরা প্রায়শই কলব্যাক প্যাটার্ন ব্যবহার করে এপিআইগুলি ডিজাইন করেন।
জাভাস্ক্রিপ্ট কলব্যাকগুলি খুব সুন্দরভাবে সমর্থন করে যেমন ল্যাম্বডাস এবং ক্লোজার সহ। এবং জাভাস্ক্রিপ্ট ওয়ার্ল্ডে প্রচুর ক্রিয়াকলাপ রয়েছে, উভয়ই ব্রাউজারে এবং সার্ভারে। এমনকি জাভাস্ক্রিপ্ট প্ল্যাটফর্মগুলি মোবাইলের জন্য তৈরি করা হচ্ছে।
আমরা যখন এগিয়ে যাব, আমাদের আরও অনেকগুলি অ্যাসিক্রোনাস কোড লিখব, যার জন্য এই বোঝাপড়াটি প্রয়োজনীয় হবে।
মনে রাখবেন কলব্যাক এক শব্দ।
উইকিপিডিয়া কলব্যাক পৃষ্ঠাটি এটি খুব ভালভাবে ব্যাখ্যা করেছে।
উইকিপিডিয়া পৃষ্ঠা থেকে উদ্ধৃতি:
কম্পিউটার প্রোগ্রামিংয়ে, একটি কলব্যাক হল এক্সিকিউটেবল কোড, বা এক্সিকিউটেবল কোডের একটি অংশ, যা অন্য কোডের আর্গুমেন্ট হিসাবে পাস হয় to এটি একটি নিম্ন-স্তরের সফ্টওয়্যার স্তরটিকে উচ্চ স্তরের স্তরে সংজ্ঞায়িত একটি সাবরুটিন (বা ফাংশন) কল করতে অনুমতি দেয়।
একটি কলব্যাক ফাংশন এমন একটি যা নির্দিষ্ট শর্ত পূরণ করার পরে কল করা উচিত। অবিলম্বে কল করার পরিবর্তে, কলব্যাক ফাংশনটি ভবিষ্যতে একটি নির্দিষ্ট সময়ে কল করা হয়।
সাধারণত এটি ব্যবহার করা হয় যখন কোনও কাজ শুরু করা হয় যা অবিচ্ছিন্নভাবে শেষ হবে (যেমন কলিং ফাংশন ফিরে আসার পরে কিছুক্ষণ শেষ হবে)।
উদাহরণস্বরূপ, ওয়েবপৃষ্ঠার অনুরোধ করার জন্য একটি ফাংশনটির কলব্যাক ফাংশন সরবরাহ করার জন্য তার কলারের প্রয়োজন হতে পারে যা ওয়েবপৃষ্ঠাটি ডাউনলোড শেষ হয়ে গেলে ডাকা হবে।
"...when a condition is met"
কিন্তু আমি ভেবেছিলাম কলেন্টব্যাকগুলি কল করা হয় যখন প্যারেন্ট ফাংশন সম্পাদন শেষ করে এবং শর্তের উপর নির্ভর করে না (?) Are
টেলিফোন সিস্টেমের ক্ষেত্রে কলব্যাকগুলি খুব সহজেই বর্ণিত হয়। একটি ফাংশন কলটি টেলিফোনে কাউকে কল করা, তাকে প্রশ্ন জিজ্ঞাসা করা, উত্তর পাওয়া এবং ঝুলিয়ে রাখার অনুরূপ; কলব্যাক যুক্ত করা উপমাটিকে পরিবর্তন করে যাতে তার কাছে একটি প্রশ্ন জিজ্ঞাসার পরে আপনি তাকে নিজের নাম এবং নম্বরও দিন যাতে সে আপনাকে উত্তর দিয়ে ফিরে আসতে পারে।
- পল জাকুবিক, "সি ++ এ কলব্যাক বাস্তবায়ন"
আমি বিশ্বাস করি যে এই "কলব্যাক" জার্গনটি ভুল জায়গায় অনেক জায়গায় ব্যবহৃত হয়েছে। আমার সংজ্ঞাটি এমন কিছু হবে:
কলব্যাক ফাংশন এমন একটি ফাংশন যা আপনি কারও কাছে পৌঁছে দেন এবং তাদের এটিকে কোনও সময়ে কল করতে দিন let
আমি মনে করি লোকেরা কেবল উইকির সংজ্ঞাটির প্রথম বাক্যটি পড়ে:
একটি কলব্যাক এক্সিকিউটেবল কোড, বা এক্সিকিউটেবল কোডের একটি অংশ, যা অন্য কোডের আর্গুমেন্ট হিসাবে পাস হয় to
আমি প্রচুর এপিআই নিয়ে কাজ করছি, বিভিন্ন খারাপ উদাহরণ দেখুন। অনেক লোক একটি ফাংশন পয়েন্টার (এক্সিকিউটেবল কোডের একটি রেফারেন্স) বা বেনামে ফাংশনগুলি (এক্সিকিউটেবল কোডের টুকরা) "কলব্যাক" এর নাম রাখেন, যদি তারা কেবলমাত্র ফাংশন হয় তবে এর জন্য আপনার আর একটি নাম প্রয়োজন কেন?
আসলে উইকির সংজ্ঞায় কেবল দ্বিতীয় বাক্যটি একটি কলব্যাক ফাংশন এবং একটি সাধারণ ফাংশনের মধ্যে পার্থক্য প্রকাশ করে:
এটি একটি নিম্ন-স্তরের সফ্টওয়্যার স্তরটিকে উচ্চ স্তরের স্তরে সংজ্ঞায়িত একটি সাবরুটিন (বা ফাংশন) কল করতে অনুমতি দেয়।
সুতরাং পার্থক্যটি হ'ল আপনি কে ফাংশনটি পাস করতে যাচ্ছেন এবং কীভাবে আপনার ফাংশনে পাস হয়েছে তাকে ডাকা হবে। যদি আপনি কেবল কোনও ফাংশন সংজ্ঞায়িত করেন এবং এটি অন্য ফাংশনে পাস করেন এবং সরাসরি সেই ফাংশন বডিটিতে কল করেন তবে এটিকে কলব্যাক বলবেন না। সংজ্ঞাটি বলে যে আপনার কার্যক্রমে উত্তীর্ণ হ'ল "নিম্ন-স্তরের" ফাংশন দ্বারা ডাকা হবে।
আমি আশা করি মানুষ এই শব্দটি অস্পষ্ট প্রসঙ্গে ব্যবহার বন্ধ করতে পারে, এটি লোককে আরও খারাপ বুঝতে আরও সাহায্য করতে পারে না।
আসুন এটি সহজ রাখা যাক। কল ব্যাক ফাংশন কী?
উদাহরণ ও উপমা অনুসারে y
আমার একটা সেক্রেটারি আছে। প্রতিদিন আমি তাকে জিজ্ঞাসা করি: (i) ফার্মের বহির্গমন মেলটি পোস্ট অফিসে ছেড়ে দাও এবং সে কাজটি করার পরে : (ii) আমি এই স্টিকি নোটগুলির জন্য তার পক্ষে যে কোনও কাজ লিখেছি ।
এখন, স্টিকি নোটটির কাজটি কী? কাজটি দিনে দিনে পরিবর্তিত হয়।
ধরুন এই বিশেষ দিনে, আমার কিছু ডকুমেন্ট মুদ্রণ করা দরকার। তাই আমি এটি স্টিকি নোটে লিখি এবং আমি তার ডেস্কে এটি পোস্ট করার জন্য বহির্গামী মেল সহ পিন করি।
সংক্ষেপে:
কল ব্যাক ফাংশনটি হ'ল দ্বিতীয় কাজ: সেই দস্তাবেজগুলি মুদ্রণ করে। কারণ মেলটি ফেলে দেওয়ার পরে এটি করা হয়ে গেছে, এবং ডকুমেন্টটি মুদ্রণ করতে বলার জন্য যে স্টিকি নোটটি পোস্ট করা উচিত ছিল তার সাথে তাকে দেওয়া হয়।
আসুন এখন এটিকে প্রোগ্রামিং শব্দভাণ্ডারের সাথে যুক্ত করুন
এতটুকুই। বেশি কিছু না. আমি আশা করি এটি আপনার জন্য এটি পরিষ্কার হয়ে গেছে - এবং যদি না হয় তবে একটি মন্তব্য পোস্ট করুন এবং আমি পরিষ্কার করার জন্য যথাসাধ্য চেষ্টা করব।
এটি পদ্ধতির শেষে কলব্যাকগুলি রিটার্ন স্টেটমেন্টের মতো শোনায়।
আমি নিশ্চিত নই যে এগুলি কি।
আমি মনে করি কলব্যাকস আসলে একটি ফাংশনে কল, অন্য ফাংশনটির আহ্বান এবং সম্পূর্ণ হওয়ার ফলস্বরূপ।
আমি আরও মনে করি কলব্যাকস বোঝানো মূল উত্সাহকে সম্বোধন করে এক ধরণের "আরে! আপনি যে জিনিসটির জন্য জিজ্ঞাসা করেছিলেন? আমি তা করে ফেলেছি - কেবল ভেবেছিলাম আমি আপনাকে জানাব - আপনার কাছে ফিরে আসব"।
কলব্যাক কী ?
একটি কি কলব্যাক ফাংশন ?
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
এসওএ-তে, কলব্যাকটি প্লাগিন মডিউলগুলি ধারক / পরিবেশ থেকে পরিষেবাগুলি অ্যাক্সেস করার অনুমতি দেয়।
সাদৃশ্য: কলব্যাক্স। অ্যাসিঙ্ক্রোনাস। কলব্যাকের জন্য অ-অবরুদ্ধ
রিয়েল জীবনের উদাহরণ
কল আফটার মূ .় নাম, কলব্যাকের চেয়ে ভাল নাম হবে । যখন বা কোনও শর্তের মধ্যে শর্তটি পূরণ হয়, তখন অন্য কোনও ফাংশনকে কল করুন , ফাংশনের পরে কল করুন , এটি আর্গুমেন্ট হিসাবে প্রাপ্ত।
কোনও ফাংশনের মধ্যে একটি অভ্যন্তরীণ ফাংশনটিকে হার্ড-কোড করার পরিবর্তে, একটি ইতিমধ্যে লিখিত কলটি ফাংশনের পরে আর্গুমেন্ট হিসাবে গ্রহণ করার জন্য একটি ফাংশন লিখে । কল করার পর বলা পেতে পারে রাষ্ট্র পরিবর্তনের উপর ভিত্তিতে ফাংশন যুক্তি গ্রহণ করতে কোড দ্বারা সনাক্ত হয়েছে।
কলব্যাক ফাংশন হ'ল একটি ফাংশন যা আপনি একটি বিদ্যমান ফাংশন / পদ্ধতিতে নির্দিষ্ট করেছেন, কোনও ক্রিয়া শেষ হওয়ার পরে ডাকা হতে হবে, অতিরিক্ত প্রক্রিয়াজাতকরণ ইত্যাদি প্রয়োজন etc.
জাভাস্ক্রিপ্টে বা আরও বিশেষত jQuery এ উদাহরণস্বরূপ, অ্যানিমেশন শেষ হয়ে গেলে আপনি কল করার জন্য কলব্যাক আর্গুমেন্ট নির্দিষ্ট করতে পারেন।
পিএইচপি-তে, preg_replace_callback()
ফাংশনটি আপনাকে এমন একটি ফাংশন সরবরাহ করতে দেয় যা নিয়মিত অভিব্যক্তি মিলে গেলে ডাকা হবে,
ছবিটি দেখুন :)
প্রধান প্রোগ্রাম কলব্যাক ফাংশন নাম সহ লাইব্রেরি ফাংশন (যা সিস্টেম স্তরের ফাংশনও হতে পারে) কল করে। এই কলব্যাক ফাংশনটি একাধিক উপায়ে প্রয়োগ করা যেতে পারে। মূল প্রোগ্রামটি প্রয়োজন অনুযায়ী একটি কলব্যাক চয়ন করে।
শেষ অবধি, লাইব্রেরির ফাংশন কার্যকর করার সময় কলব্যাক ফাংশন কল করে।
ধরুন আমাদের একটি ফাংশন রয়েছে 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)` ...
এটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ে পলিমারফিজম অর্জনে ব্যবহৃত একটি ধারণা
“কম্পিউটার প্রোগ্রামিংয়ে, কলব্যাক হল এক্সিকিউটেবল কোড, বা এক্সিকিউটেবল কোডের একটি অংশ, যা অন্য কোডের পক্ষে আর্গুমেন্ট হিসাবে পাস হয়। এটি একটি নিম্ন-স্তরের সফ্টওয়্যার স্তরকে উচ্চ স্তরের স্তরে সংজ্ঞায়িত সাবরুটিন (বা ফাংশন) কল করতে অনুমতি দেয় ”" - উইকিপিডিয়া
ফাংশন পয়েন্টার ব্যবহার করে সি তে কলব্যাক
সি তে, ফাংশন পয়েন্টার ব্যবহার করে কলব্যাক প্রয়োগ করা হয়। ফাংশন পয়েন্টার - নাম হিসাবে বোঝা যায় একটি ফাংশনের পয়েন্টার।
উদাহরণস্বরূপ, 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);
}
}
উপরের কোড থেকে আপনি দেখতে পাচ্ছেন যে, আমাদের একটি ইভেন্ট বলে একটি ইন্টারফেস রয়েছে যা মূলত আমাদের অ্যাপ্লিকেশনটির জন্য ঘটতে পারে এমন সমস্ত ইভেন্টের তালিকা করে। উইজেট শ্রেণি বাটন, চেকবাক্সের মতো সমস্ত ইউআই উপাদানগুলির জন্য বেস শ্রেণি। এই ইউআই উপাদানগুলি হ'ল অবজেক্টগুলি যা ফ্রেমওয়ার্ক কোড থেকে প্রকৃতপক্ষে ইভেন্টগুলি গ্রহণ করে। উইজেট শ্রেণি ইভেন্টস ইন্টারফেস প্রয়োগ করে এবং এটিতে দুটি ক্লিক করা ইন্টারফেস রয়েছে যেমন অনক্লিকএভেন্টলিস্টনার এবং অনলং ক্লিকএভেন্টলিস্টনার
এই দুটি ইন্টারফেস বাটন বা চেকবাক্সের মতো উইজেট প্রাপ্ত ইউআই উপাদান যেমন ঘটতে পারে তা শোনার জন্য দায়ী। সুতরাং আমরা যদি জাভা ইন্টারফেস ব্যবহার করে পূর্ববর্তী কলব্যাক উদাহরণের সাথে এই উদাহরণটি তুলনা করি তবে এই দুটি ইন্টারফেস কলব্যাক ইন্টারফেস হিসাবে কাজ করে। সুতরাং উচ্চ স্তরের কোড (এখানে ক্রিয়াকলাপ) এই দুটি ইন্টারফেস প্রয়োগ করে। এবং যখনই কোনও উইজেটের সাথে কোনও ইভেন্ট ঘটে তখন উচ্চ স্তরের কোড (বা উচ্চতর স্তরের কোডে প্রয়োগ করা এই ইন্টারফেসগুলির পদ্ধতি, যা এখানে ক্রিয়াকলাপ) বলা হবে।
এখন আমি কলব্যাক এবং ইভেন্টলিস্টার ধাঁচের মধ্যে মূল পার্থক্যটি আলোচনা করব। যেমনটি আমরা উল্লেখ করেছি যে কলব্যাক ব্যবহার করে, কলি কেবলমাত্র একটিমাত্র কলারকে অবহিত করতে পারে। তবে ইভেন্টলিস্টনার প্যাটার্নের ক্ষেত্রে, অ্যাপ্লিকেশনটির অন্য কোনও অংশ বা শ্রেণি বাটন বা চেকবক্সে ঘটতে পারে এমন ইভেন্টের জন্য নিবন্ধন করতে পারে। এই ধরণের শ্রেণির উদাহরণ হ'ল অন্যান্যক্লাস। আপনি যদি অন্যান্য ক্লাসের কোডটি দেখতে পান তবে আপনি দেখতে পাবেন যে এটি ক্রিয়াকলাপে সংজ্ঞায়িত বোতামে প্রদর্শিত হতে পারে ক্লিকইভেন্টের শ্রোতা হিসাবে নিজেকে নিবন্ধিত করেছে। মজার অংশটি হ'ল, ক্রিয়াকলাপ (কলার) ছাড়াও, বাটনটিতে ক্লিক ইভেন্ট যখনই ঘটে তখন এই অন্যান্য ক্লাসটিও অবহিত করা হবে।
কলব্যাক ফাংশন এমন একটি ফাংশন যা আপনি নির্দিষ্ট ফাংশন বা অবজেক্টে (রেফারেন্স বা পয়েন্টার হিসাবে) পাস করেন। এই ফাংশন বা অবজেক্টটি এই ফাংশনটিকে যেকোন সময় পরে পুনরায় কল করবে, সম্ভবত একাধিক বার, যে কোনও ধরণের উদ্দেশ্যে:
...
সুতরাং অন্য ফাংশন বা টাস্কের শেষে কল করা একটি ফাংশন হিসাবে কলব্যাকের বর্ণনা দেওয়া অত্যধিক সরল করা হচ্ছে (এমনকি এটি সাধারণ ব্যবহারের ক্ষেত্রেও হয়)।
একটি কলব্যাক হ'ল একটি ফাংশনটিকে অন্য ফাংশনে প্যারামিটার হিসাবে পাস করার একটি ধারণা এবং প্রক্রিয়াটি শেষ হয়ে গেলে এইটিকে অনুরোধ করা হয়।
যদি আপনি উপরের দুর্দান্ত উত্তরগুলির মাধ্যমে কলব্যাকের ধারণাটি পান তবে আমি আপনাকে পরামর্শ দিচ্ছি যে এটির ধারণাটির পটভূমিটি আপনার উচিত।
"কী তাদের (কম্পিউটার বিজ্ঞানী) কলব্যাক বিকাশ করেছে?" আপনি কোনও সমস্যা শিখতে পারেন যা ব্লক করছে ((বিশেষত ইউআই অবরুদ্ধ করা) এবং কলব্যাকই এর একমাত্র সমাধান নয়। আরও অনেকগুলি সমাধান রয়েছে (উদা: থ্রেড, ফিউচার, প্রতিশ্রুতি ...)।
একটি গুরুত্বপূর্ণ ব্যবহারের ক্ষেত্র হ'ল আপনি নিজের ফাংশনটির একটিটিকে হ্যান্ডেল হিসাবে (যেমন একটি কলব্যাক) নিবন্ধন করুন এবং তারপরে কোনও কাজ বা প্রক্রিয়াজাতকরণের জন্য কোনও বার্তা পাঠান / কোনও ফাংশন কল করুন। প্রসেসিং শেষ হওয়ার পরে, কথিত ফাংশনটি আমাদের নিবন্ধিত ফাংশনটিকে কল করবে (অর্থাত্ এখন কল ব্যাক শেষ হয়ে গেছে), সুতরাং আমাদের প্রক্রিয়াটি সম্পন্ন হওয়ার ইঙ্গিত দেয়।
এই উইকিপিডিয়া লিঙ্কটি গ্রাফিকভাবে বেশ ভালভাবে ব্যাখ্যা করেছে।
একটি কলব্যাক ফাংশন, উচ্চতর অর্ডার ফাংশন হিসাবে পরিচিত, এমন একটি ফাংশন যা প্যারামিটার হিসাবে অন্য ফাংশনে প্রেরণ করা হয় এবং কলব্যাক ফাংশনটিকে প্যারেন্ট ফাংশনের অভ্যন্তরে বলা হয় (বা সম্পাদিত)।
$("#button_1").click(function() {
alert("button 1 Clicked");
});
এখানে আমরা ক্লিক পদ্ধতিতে প্যারামিটার হিসাবে একটি ফাংশন পাস করেছি। এবং ক্লিকের পদ্ধতিটি আমরা এটিতে যে কলব্যাক ফাংশনটি দিয়েছিল তা কল করবে (বা সম্পাদন করবে)।
কলব্যাক ফাংশন একটি ফাংশন যা আর্গুমেন্ট হিসাবে অন্য ফাংশনে চলে গেছে।
function test_function(){
alert("Hello world");
}
setTimeout(test_function, 2000);
দ্রষ্টব্য: উপরের উদাহরণে set_Timeout ফাংশনটির জন্য আর্গুমেন্ট হিসাবে ব্যবহৃত টেস্ট_ফাংশন।