Pure Function In JavaScript

11/2/2019 • ☕️ 3 min readJavaScriptPure FunctionFunctional programming

Pure Function কি?

কোনো funtion Pure Function হওয়ার জন্যে simple 2 টা rule আছে।

1. Same input এর জন্যে সব সময় same output পাওয়া যাবে।
2. কোনো side effect থাকবে না। 

একটা code করে দেখা যাক।

const add = (a,b) => a + b;
add(1,2); // 3

এইখানে add function টা একটা pure function, যেকোনো 2 টা argument নিয়ে ওই argument এর জন্যে same result দিবে।

আর একটা কোড দেখি,

let user = {
	firstName: "Michael",
	lastName: "Jackson",
	gender: "M"
}

function getFullName(user) {
	return `${user.firstName} ${user.lastName}`;
}
console.log(getFullName(user)); // Michael Jackson 

এইখানে getFullName একটা pure function, কারণ getFullName state mutate করছে না।

Impure Function কি?

1. Database create/update করা। 
2. http call করা। 
3. file system change করা। 
4. state mutate করা।
etc
Math.random();

Math.random() একটা impure function কারণ এইটা সব সময় একটা different output return করে।

তাহলে console.log কি pure function ঐটা তো যেকোনো input এর জন্যে undefined return করে।

না। console.log pure function না কারণ এর side effect আছে, log করার জন্যে console.log অন্য কোনো share environment use করছে।

const add = function (a,b){
	console.log("added");	return a + b;
} 

add(1,2); // 3

যদি ও আমরা same input এর জন্যে same output পাচ্ছি, এবং console.log আমাদের code এর জন্যে harfull না তার পর ও এইটা pure function না।

let user = {
	firstName: "Michael",
	lastName: "Jackson",
	gender: "M"
}

function getFullName(user) {
	user.firstName = user.gender === "M" ? `Mr. ${user.firstName}`: `Mrs. ${user.firstName}`;
	return `${user.firstName} ${user.lastName}`;
}
console.log(getFullName(user)); // Mr. Michael Jackson 

এইখানে getFullName একটা impure function, কারণ getFullName state mutate করছে।

Pure vs Impure

Impure function external state mutate করে।

let cart = {
	items: [{
		name: "X",
		price: 10,
		quantity: 1
	}]
}

function addItem(cart){
	let newCart = {...cart}
	newCart.items.push({
		name: "Y",
		price: 5,
		quantity: 2
	});
	return newCart;
}
console.log(cart); // {items: Array(1)}
let newCart = addItem(cart); // changing state
console.log(cart); // {items: Array(2)}console.log(newCart); // {items: Array(2)}

Pure function external state mutate করে না। আমরা উপরের function টা একটু chnage করে function টা কে pure function তৈরী করতে পারি।

let cart = {
	items: [{
		name: "X",
		price: 10,
		quantity: 1
	}]
}

function deepClone(value){
  return JSON.parse(JSON.stringify(value));
}

function addItem(cart){
	let newCart = deepClone(cart);
	newCart.items.push({
		name: "Y",
		price: 5,
		quantity: 2
	});
	return newCart;
}
console.log(cart); // {items: Array(1)}
let newCart = addItem(cart); // changing state
console.log(cart); // {items: Array(1)}console.log(newCart); // {items: Array(2)}

এইখানে, pure function টা cart chnage না করে cart এর একটা copy তৈরী করে সেটা কে change করে পাঠাচ্ছে। এর কারণে orginal cart এর data chnage হচ্ছে না। আপনি যদি react, redux use করে থাকেন তাহলে pure function এর ব্যবহার দেখবেন।

Pure function সহজে predict করা যায়, এর জন্যে test করতে সুবিধা হয়। Pure function state management আরো সহজ করে।