Functional Programming Bengali JavaScript Series ⇾ Chapter Nine (Part -1)
What is Functional Programming, Pure Function, First Class Functions, Higher Order Functions, JavaScript Closure First Look

♗ Love To Play With → JavaScript & NodeJS.
✢ Interested → Web & Backend Development.
↯ Current Stack → MERN Stack
তুমি হাটাহাটি পাপা করে অনেকটা ধুর চলে আসছো ।এতদিন ধরে চ্যাপ্টার eight পর্যন্ত প্রোগ্রামিং এর বেসিক টার্মস গুলো শিখে ফেলেছো ।শুধুমাত্র জাভাস্ক্রিপ্ট না যে কোন প্রোগ্রামিং ল্যাংগুয়েজ এর বেসিক এই গুলো ।প্রত্যেকটা প্রোগ্রামিং ল্যাঙ্গুয়েজে বিষয়গুলি বিদ্যমান ।
এই চ্যাপ্টার এ আমাদের যেসব বিষয় গুলো থাকছে তার একটা ছোট্ট লিস্ট নিচে তোমায় দেখানোর জন্য দিয়ে দিচ্ছি :
What is Functional Programming,
What is Pure Function in JavaScript,
First Class Functions in JavaScript,
Higher Order Functions in JavaScript,
JavaScript Closure First Look,
What is Callback Function in JavaScript,
Implementation of ForEach Function,
Implementation of Map Function,
Implementation of Filter Function,
Implementation of Reduce Function,
Implementation of Find and FindIndex Function,
Sort, Some and Every Function Uses,
Return a Function from Another Function What is Recursive Function,
What is Currying in JavaScript,
What is Function Composition in JavaScript
তবে মোট তিনটা part এ চ্যাপ্টার nine সাজানো হবে । part-1 এ থাকবে মোট পাঁচ টি সেকশন ।
Part-1 এ যে সকল সেকশন থাকবে :
What is Functional Programming,
What is Pure Function in JavaScript,
First Class Functions in JavaScript,
Higher Order Functions in JavaScript,
JavaScript Closure First Look,
create a folder
chapterNineinside your deep_dive_js folder and open it on vs code

068. What is Functional Programming :
প্রোগ্রামিং করা বা প্রোগ্রামিং প্রব্লেম সল্ভ অনেক ভাবেই করা যায় ।তবে কোড গুলোকে গুছিয়ে ম্যানেজ করে করে কাজ করা খুবই জরুরি এতেকরে তুমি তোমার কোড সহজে বুজতে পারবে আর অন্য ডেভেলোপাররাও ।এই কোড গুলোকে ম্যানেজ করার জন্য মোটামুটি দুইটা peradime ব্যবহার করা হয় ।
functional Programming / Peradimes
Object Oriented Programming / Peradimes
আমরা এই চ্যাপ্টার এ ফাঙ্কশনাল প্রোগ্রামিং নিয়ে আলোচনা করব ।এর আগে আমরা ফাঙ্কশন সম্পর্কে জেনেছি ।একটা ফাঙ্কশন কিছু স্পেসিফিক প্রব্লেম সল্ভ করায় ব্যবহার করা হয় ।আর ফাঙ্কশনাল প্রোগ্রামিং এর মূল কনসেপ্ট হচ্ছে সবকিছুকে ফাঙ্কশন এর মত করে চিন্তা করা ।আমরা ছোট ছোট ফাঙ্কশন এ প্রব্লেম গুলোকে ভাগ করে দিব এবং সেগুলোকে invoke করার মাধ্যমে reuse করব ।
Functional programming (also called FP) is a way of thinking about software construction by creating pure functions. It avoids concepts of shared state, and mutable data observed in Object Oriented Programming.
ফাঙ্কশনাল প্রোগ্রামিং এর তিনটা মেইন টার্মস আছে :
Pure Function
একটা ডাটা ইনপুট দিলে এবং ইনপুট চেঞ্জ না করলে সবসময়ের জন্যই আউটপুট same থাকবে ।
First Class Function
যখন একটা ফাঙ্কশন as a ভ্যালু এর মত act করবে তখনি সেটা ফার্স্ট ক্লাস ফাঙ্কশন ধরা হয় ।
Higher Order Function
যেখানে একটা ফাঙ্কশন এর আর্গুমেন্ট আকারে আর একটা ফাঙ্কশন কে দিয়ে দিতে পারি ।
আমরা প্রত্যেকটা টার্মস কে ধরে ধরে বেখ্যা করব ।
069. What is Pure Function in Javascript :
একটা ফাঙ্কশন কে pure ফাঙ্কশন হতে গেলে দুইটা শর্ত ফুলফিল করতে হবে ।
- It returns the same result if given the same arguments.
মানে একই আর্গুমেন্ট যদি বারবার provide করা হয়ে থাকে তাহলে রেজাল্ট বা আউটপুট একই থাকবে ।চেঞ্জ হবে না ।
- It does not cause any observable side effects.
এবং এই কথাটা দিয়ে বুঝায় একটা pure ফাঙ্কশন কখনোই দেখার মত side effect তৈরী করবে না ।
এখন আমরা কয় একটা উদহারণ দিয়ে দেখছি :

function sqr(n) {
return n * n;
}
console.log(sqr(2));
console.log(sqr(2));
console.log(sqr(2));
console.log(sqr(2));
আমরা একটা ফাঙ্কশন নিয়েছি sqr নাম ,যেটা পেরামিটার আকারে n নিচ্ছে এবং রিটার্ন করছে n *n । এখন আমরা invoke এর সময় আর্গুমেন্ট ২ দিয়ে দিয়েছি যেটা সব সময় ৪ ই আউটপুট দিবে ।প্রথম শর্ত পূরণ করছে ।
দ্বিতীয় যে শর্তটা ছিল অবশ্যই একটা pure ফাঙ্কশন এর দেখার মোত side effect থাকবে না ।আমাদের n কিন্তু কোন side effect করছে না কোন ভ্যালু চেঞ্জ করছে না ও সবসময় একই রেজাল্ট দিচ্ছে ।যেহেতু দুইটা শর্তই sqr ফাঙ্কশন টি পূরণ করছে তাই এটাকেই আমরা pure ফাঙ্কশন বলব ।
side effect আর ভেঙে বলার চেষ্টা করছি ।আগে দেখি সাইট ইফেক্ট হলে কি হত ।

var x = 20;
function sideEffect() {
x = 30;
return x;
}
sideEffect()
console.log(x);
একটা ভেরিয়েবল নিয়েছি x নাম যেটা x এর ভ্যালু ২০ রাখছে । এর পরে sideEffect নামে একটা ফাঙ্কশন লিখছি যেখানে x এর ভ্যালু ৩০ reassign করেছি এবং রিটার্ন করেছি ।
ফাঙ্কশন এর বাইরে প্রথমে কনসোললগ করেছি ভ্যারিয়েবল x এর মান যেটা আউটপুট ২০ দিচ্ছে । কিন্ত যখনি sideEffect কে invoke করছি x এর ভ্যালু দিচ্ছে ৩০ । এইযে x এর ভ্যালু চেঞ্জ করল ফাঙ্কশন এটাই সাইড ইফেক্ট ।আর তাই কখনোই sideEffect pure function হবে না ।
আশাকরছি বুজতে পেরেছ ।
070. First Class Functions in JavaScript :
একটা ফাঙ্কশন first class ফাঙ্কশন হতে গেলে মোটামুটি ৬ টা শর্ত তাকে fulfill করতে হবে ।
শর্ত গুলি নিচে দিচ্ছি ও ব্যাখ্যা করছি :
A function can be stored in a veriable.
আমরা ফাঙ্কশন একটা ভেরিএবলে স্টোর করতে পারি এবং ব্যবহার করতে পারি ।
function add(a, b) { return a + b; } var sum = add; console.log(sum(2, 4));
A function can be Stored in an array
আমরা একটা array এর মধ্যে ফাঙ্কশন কে রাখতে পারি ।
var arr = []; arr.push(add); console.log(arr[0](6, 8));
A function can be Stored in an object
একটা ফাঙ্কশন অবজেক্ট এর মধ্যে স্টোর হতে পারবে ।
var obj = { sum: add, }; console.log(obj.sum(4, 9));
We can create function as Need আমরা যেখানে খুশি সেখানে anynimus ফাঙ্কশন বা কলব্যাক ফাঙ্কশন ব্যবহার করতে পারি । যেমন ধর setTimeout ফাঙ্কশন এর মধ্যে ।
setTimeout(function () { console.log("We Can create function Any where"); }, 100);
We can Pass Function as an Arguments
আমরা আর্গুমেন্ট আকারে ফাঙ্কশন কে pass করে দিতে পারব ।
We can return function from Another Function
আমরা একটা ফাঙ্কশন কে অন্য একটা ফাঙ্কশন থেকে রিটার্ন করতে পারব ।
last এর দুইটা টার্ম higher অর্ডার ফাঙ্কশন এ রয়েছে তাই সেখানেই আলোচনা করছি ।
071. Higher Order Functions in Javascript :
আমরা এর উপরের সেকশন এ ২টা পয়েন্ট স্কিপ করেছিলাম
We can Pass Function as an Arguments
আমরা আর্গুমেন্ট আকারে ফাঙ্কশন কে pass করে দিতে পারব ।
We can return function from Another Function
আমরা একটা ফাঙ্কশন কে অন্য একটা ফাঙ্কশন থেকে রিটার্ন করতে পারব ।
এই দুইটা শর্ত পূরণ করলে তাকে আমরা higher অর্ডার ফাঙ্কশন বলব ।
আমরা একটা উদহারণ দিয়ে দেখার চেষ্টা করি :
function add(a, b) {
return a + b;
}
function manipulate(a, b, func) {
var c = a + b;
var d = a - b;
function multiply() {
var m = func(a, b);
return c * d * m;
}
return multiply;
}
var mult = manipulate(2, 4, add);
console.log(mult());

আমরা প্রথমেই একটা ফাঙ্কশন ক্রিটে করছি add নামে যেটা পেরামিটার আকারে a এবং b নিচ্ছে এবং রিটার্ন করে ।এবারে এই add ফাঙ্কশন আমরা আর একটা ফাঙ্কশন এ pass করতে পারব ।
নতুন একটা ফাঙ্কশন create করছি menipulate নামে যেটা পেরামিটার আকারে নিবে a ,b এবং func নামে একটা ফাঙ্কশন এক্সপেক্ট করছি । এবারে কাজ হচ্ছে a এবং b প্রথমে যোগ করব তারপরে বিয়োগ করব সেটাকে c এবং d নামে ভ্যারিয়েবল এ ষ্টোর করে ।এর পরে আমরা একটা multiply ফাঙ্কশন বানাব যেটা আমরা রিটার্ন করতে চাই । আমরা func নামে যে পেরামিটার pass করেছিলাম সেটা মূলত বাইরের add ফাঙ্কশন তাই প্রথমেই multiply ফাঙ্কশন এর মধ্যে m ভ্যারিয়েবল এ রেখে দিচ্ছি । multiply itself রিটার্ন করে c ,d ,m এর গুন্ ।সবশেষে menipulate ফাঙ্কশন রিটার্ন করে multiply ফাঙ্কশন কে ।
এভাবে যদি আমরা menipulate কে mult ভ্যারিয়েবল এ assign করি এবং manipulate(2, 4, add) মানে আর্গুমেন্ট আকারে a এর জন্য ২ b এর জন্য ৪ ও func এর জন্য add ফাঙ্কশন pass করি তবে সঠিক আউটপুট পাব ।
এটাই মূলত higher order ফাঙ্কশন যেখানে একটা ফাঙ্কশন এর পেরামিটার হিসেবে পাস করতে পারি ফাঙ্কশন এবং ফাঙ্কশন থেকে ফাঙ্কশন রিটার্ন করতে পারি ।
072. Javascript Closure First Look :
যদি কোন scope এ বাইরের কোন স্কোপ থেকে ডাটা আসে পেরামিটার ছাড়া সেটাকেই আমরা closure বলব ।
আমরা জানি এক একটা ফাঙ্কশন এক একটা স্কোপ তৈরী করে ।
আমরা closure দেখার জন্য ব্রাউসার কনসোল ব্যবহার করেছি ।
function a() {
var x = 10;
return function () {
console.log(x);
};
}
var abc = a();
console.dir(abc);
প্রথমে ফাঙ্কশন a নিয়েছি যার স্কোপ বা বডি তে x এর মান ১০। আর a ফাঙ্কশন রিটার্ন করে একটা anynimus ফাঙ্কশন ।এই anynimus ফাঙ্কশন নিজের একটা স্কোপ আছে যার মধ্যে পেরামিটার ছাড়াই x ভ্যারিয়েবল কনসোল লগ করছে ।এটাই মূলত closure ।

আশাকরি বুজতে পেরেছ ।
এর পরে ফাঙ্কশনাল প্রোগ্রামিং এর ২ part আসবে আরো ৫টি সেকশন নিয়ে ।





