ফার্স্ট ক্লাস ও হাইয়ার অর্ডার ফাংশন ইন জাভাস্ক্রিপ্ট
আমরা ফাংশন জিনিসটা খায় নাকি পিন্দে তা তো জানি নাকি ? ফাংশন হচ্ছে পুনরায় ব্যবহারযোগ্য কোড ব্লক যা একটি নির্দিষ্ট কাজ করে থাকে । তাহলে ফার্স্ট ক্লাস ও হাইয়ার অর্ডার ফাংশন কি ?
চিল মামা, ভয় পাওয়ার কোনো কারণ নাই । আজকে আমি জাভাস্ক্রিপ্ট এর ফার্স্ট ক্লাস ফাংশন এবং হায়ার অর্ডার ফাংশন নিয়ে কথা বলবো । সেই সাথে জাভাস্ক্রিপ্টের বিল্ট-ইন (filter) মেথডের কাজ দেখবো এবং আমরা নিজেরাও কাস্টম (filter) মেথড বানাবো । তাই, এই আরটিকেলটি পড়ার সময় আপনার প্রেজেন্ট কে কিছুক্ষণের জন্য এক্স বানায়ে ফেলেন যাতে বিরক্ত না করে, কি আজব!
ফার্স্ট ক্লাস ফাংশন কি বা কাকে বলা হয় বা চিনবো কেমনে ?
যখন কোনো ফাংশন কে অন্য আরেকটা ফাংশনের আরগুমেন্ট হিসেবে পাস করা হয় বা এক ফাংশন থেকে আরেকটা ফাংশন রিটার্ন করা হয় অথবা কোনো ফাংশন কে ভ্যারিয়েবল, অবজেক্ট বা অ্যারে হিসেবে স্টোর করা হয় তখনই তাকে মূলত ফার্স্ট ক্লাস ফাংশন বলা হয় ।
আমরা কিন্তু জেনে ফেললাম যে ফার্স্ট ক্লাস ফাংশন কি বা কাকে বলা হয় তাই না ? এখন একটু আপনার স্মৃতির পাতায় টোকা মারেন তো, উপরের সঙ্গা দেখে কি মনে হয় ? অবশ্যই, আপনি আগে এইসব ব্যাবহার করেছেন কিন্তু জানতেন নাহ যে এইগুলো ফার্স্ট ক্লাস ফাংশন । কোনো ব্যাপার না এখন তো জানলেন, কি মজা !
তাহলে কোনো ফাংশন ফার্স্ট ক্লাস হবে যদি নিচের বৈশিষ্ট্য গুলো থাকে :
১। কোনো ফাংশন যদি ভ্যারিয়েবল, অবজেক্ট বা অ্যারেতে স্টোর করা থাকে ।
২। কোনো ফাংশন কে যদি অন্য আরেকটা ফাংশনের আরগুমেন্ট হিসেবে পাস করা হয় ।
৩। এবং এক ফাংশন থেকে যদি আরেকটা ফাংশন রিটার্ন করা হয় ।
তাহলে আর কথা না বাড়িয়ে চলুন দেখা যাক ।
১। ফাংশন স্টোরিং :-
আগেই বলেছি যে, ফাংশন তিন ভাবে স্টোর করা থাকতে পারে ভ্যারিয়েবল, অবজেক্ট এবং অ্যারে ।
ভ্যারিয়েবলে স্টোর :-
const sum = function(a,b){
console.log("Sum :", a+b);
}
sum(10,10)
// output= Sum : 20
উপরে, একটি ফাংশন নিয়েছি যা sum নামে একটা ভ্যারিয়েবলে স্টোর করা হয়েছে । আমরা এখন ফাংশনটিকে ফার্স্ট ক্লাস ফাংশন বলতে পারি কারণঃ এটি ভ্যারিয়েবলে স্টোর করা হয়েছে ।
অবজেক্টে স্টোরিং :-
// function
const sum = function(a,b){
console.log("Sum : ", a+b);
}
// object
const obj = {
add:sum
}
obj.add(10,10)
// output= Sum : 20
অ্যারেতে স্টোরিং :-
// function
const sum = function(a,b){
console.log("Sum : ", a+b);
}
// array
const numbers = [1,4,sum,5];
const summetion = numbers[2](10,10);
// output= Sum : 20
এখন কোনো ফাংশন যদি ভ্যারিয়েবল, অবজেক্ট বা অ্যারেতে স্টোর করা থাকে তাহলে সেইটা নিঃসন্দেহে ফার্স্ট ক্লাস ফাংশন হিসেবে ধরতে পারেন।চলুন এখন ২ নাম্বার শর্তে যাওয়া যাক।
২। ফাংশনকে আর্গুমেন্ট হিসেবে পাস করা :-
function greetings(name, callback){
callback(name);
}
const greeting = greetings('Shakil Babu', function(name){
console.log("Hello", name);
})
// output: Hello Shakil Babu
আমরা greetings নামে ফাংশন নিয়েছি যার আরগুমেন্ট ২ টা একটা name নামে যেইটা পাস করেছি স্ট্রিং আকারে আরেকটা callback নামে নিয়েছি যেটা পাস করার সময় একটা ফাংশন হিসেবে পাস করা হয়েছে । তাহলে এইটাও ফার্স্ট ক্লাস ফাংশন বলতে পারি ।
৩। ফাংশন থেকে ফাংশন রিটার্ন করা :-
function luckyNumber (name){
return function(a,b){
console.log(`Hello ${name}, your lucky number is = ${a*b}`);
}
}
const result = luckyNumber('Shakil Babu')(10,10);
// output: Hello Shakil Babu, your lucky number is = 100
এখন কিন্তু আমাদের ফার্স্ট ক্লাস ফাংশন কি, কাকে বলে বা কোন গুলো তা চিনতে আর অসুবিধা হবে নাহ। কারণ, আমরা জানি একটা ফাংশনে কি কি বৈশিষ্ট্য থাকলে তাকে ফার্স্ট ক্লাস ফাংশন বলে।
ফার্স্ট ক্লাস ফাংশনের সুবিধা কি ?
আমরা কিন্তু ফাংশনকে বিভিন্নভাবে স্টোর বা ব্যাবহার করতে পারতেছি এইটাও একটা সুবিধা । সবচেয়ে বড় সুবিধা হলো ফার্স্ট ক্লাস এর কন্সেপ্ট আমরা হায়ার অর্ডার ফাংশনে ইউজ করতে পারি যা ফাংশনাল প্রোগ্রামিং এ খুবই গুরুত্বপূর্ণ ।
হায়ার অর্ডার ফাংশন (Higher Order Function) কি ?
কোনো ফাংশন কে যদি অন্য আরেকটা ফাংশনের আরগুমেন্ট হিসেবে পাস করা হয় বা এক ফাংশন থেকে যদি আরেকটা ফাংশন রিটার্ন করা হয় তাহলে তাকে হায়ার অর্ডার ফাংশন বলে ।
দেখছেন ? ফার্স্ট ক্লাস ফাংশনের ২ আর ৩ নাম্বার বৈশিষ্ট্য কেই কিন্তু হায়ার অর্ডার ফাংশন বলা হয় । তাহলে হায়ার অর্ডার ফাংশন কিন্তু আসলে ফার্স্ট ক্লাস ফাংশনেরই আইডিয়া । যা ফাংশনাল প্রোগ্রামিং এর জন্য অনেক গুরুত্বপূর্ণ ।
এখন চলুন জাভাস্ক্রিপ্ট এর কিছু বিল্ট-ইন হাইয়ার অর্ডার ফাংশন দেখা যাক :-
১। map
২। filter
৩। find
৪। reduce
৫। findIndex
ইত্যাদি ইত্যাদি ।জাভাস্ক্রিপ্টে বিল্ট-ইন অনেক হাইয়ার অর্ডার ফাংশন আছে যেগুলো আসলে আলাদা আলাদা করে আলোচনা করতে হবে। তারপরেও চলুন (filter) ফাংশন নিয়ে আলোচনা করা যাক । শেষে নিজেরা কিভাবে একটা কাস্টম (filter) ফাংশন বানাতে পারি তাও দেখব ।
filter এর ব্যাবহার :-
জাভাস্ক্রিপ্টে বহুল ইউসড বিল্ট-ইন হাইয়ার অর্ডার ফাংশনের মধ্যে filter একটি । চলুন ছোট্ট করে (filter) মেথড এর ব্যাবহার জানা যাক । এর কাজ হচ্ছে একটা অ্যারেকে ইটারেট করা অর্থাৎ, সবগুলা আইটেম নিয়ে সেগুলার উপরে স্পেসেফিক কোনো ফাংশন অ্যাপ্লাই করা ।
ধরি, আমাদের কাছে numbers নামে একটা অ্যারে আছে এখন এই অ্যারে থেকে ৫ এর বড় নাম্বারগুলো কে বের করতে চাইতেছি । প্রথমে আমরা (filter) মেথড ছাড়া নাম্বারগুলো বের করি :-
const numbers = [1,2,20,30,4];
let filteredNumbers = [];
for (let i = 0; i < numbers.length; i++) {
if(numbers[i] > 5){
filteredNumbers.push(numbers[i]);
}
}
console.log(filteredNumbers);
// output: [20, 30]
আমরা আউটপুট হিসেবে 20,30 পেয়েছি যা 5 এর থেকে বড়।
এখন (filter) মেথড সাথে ES6 সিনট্যাক্স ব্যাবহার করে দেখি :-
const numbers = [1,2,20,30,4];
const result = numbers.filter(item => item > 5)
console.log(result);
// output: [20, 30]
সেইম আইটপুট । দেখেছেন কতো সহজে আর শর্টকাটে কাজটা করলাম। এইটাই হইলো হাইয়ার অর্ডার ফাংশনের ম্যাজিক । যেহেতু, বলেছি এই মেথড গুলো নিয়ে বিস্তারিত আলোচনা করবো তাই আর আলোচনা করলাম নাহ ।এখন চলেন দেখি আমরা কিভাবে নিজেরা কাস্টম (filter) মেথড বানাতে পারি ।
নিজেদের তৈরি কাস্টম (filter) মেথড :-
Array.prototype.myFilter = function(callback) {
let result = [];
for (let i = 0; i < this.length; i++) {
if(callback(this[i], i , this)){
result.push(this[i]);
}
}
return result;
}
আমরা myFilter নামে নিজেদের কাস্টম (filter) মেথড বানাইলাম । যা জাভাস্ক্রিপ্টের বিল্ট-ইন (filter) মেথডের মতোই কাজ করবে । বিশ্বাস না হইলে চলুন আমরা আগের const numbers = [1,2,20,30,4];
এই অ্যারে থেকে 5 এর থেকে বড় নাম্বারগুলো বের করি ।
const numbers = [1,2,20,30,4];
const result = numbers.myFilter((item) => item > 5);
console.log(result);
// output: [20, 30]
দেখছেন সেইম রেজাল্ট কিন্তু । আশা করি আমি যা যা বলেছি তা আপনারাও বুঝেছেন ।
ভালো থাকবেন এবং রাখবেন । ধন্যবাদ সবাইকে ।