2.13 পিওর ফাংশন (Pure Function)

 

জাভাস্ক্রিপ্টে ফাংশন হল প্রথম শ্রেণীর নাগরিক। জাভাস্ক্রিপ্টে শুধু কোন ফাংশনই তৈরি করা যায় তাই নয়, ফাংশনটিকে Modify করতে পারা যায়, একটি ফাংশনকে অন্য একটি ফাংশনের প্যারামিটার হিসেবে পাঠানো যায় এমনকি ফাংশনকে অন্য কোন ফাংশন থেকে returnও করতে পারা যায়। শুধু তাই নয়, আমরা কোন ভেরিয়েবলের মধ্যে কোন ফাংশনকে Assign-ও করতে পারি। মূল কথা হল, ফাংশন ব্যাতিত জাভাস্ক্রিপ্টে কাজের উপযোগী কোন কোড লিখা প্রায় অসম্ভব। আজকের আলোচনাতে আমরা জাভাস্ক্রিপ্টের পিউর ফাংশন (Pure Function) নিয়ে আলোচনা করব। তাহলে চলুন শুরু করা যাক।

জাভাস্ক্রিপ্টে সকল Pure ফাংশনই ফাংশন কিন্তু সকল ফাংশনই Pure ফাংশন নয়। তাহলে Pure ফাংশন আসলে কি? আসলে Pure ফাংশন হল একটি Deterministic ফাংশন যার মানে হল যদি ওই ফাংশনে একই ইনপুটের জন্য সর্বদা একই আউটপুট থাকবে। একটি Pure ফাংশনের অবশ্যই নিচের বৈশিষ্ট্যগুলো থাকতে হবে।

  • সর্বদা নিজের আর্গুমেন্টের উপর নির্ভর করবে।
  • ফাংশনটি নিজের Scope এর বাইরে কোন ভারিয়েবলের মান পরিবর্তন করবে না।
  • ফাংশনটি কোন side effects তৈরি করবে না।

নিচের কোডটি লক্ষ্য করুন।

let val1 = 6;
let val2 = 4;
function pure() {
   return val1 * val2;
}
pure();

 

উপরের ফাংশনটি একটি Impure ফাংশন। কারণ এই ফাংশনটি তার নিজের Scoper এর বাহিরে গিয়ে val1 এবং val2 কে ব্যবহার করছে। যদি কোন কারণে val1 বা val2 ভ্যালু পরিবর্তন হয় তবে ফাংশনটি কখনো একই ইনপুটের জন্য একই আউটপুট return করবে না। তাহলে এই ফাংশনটিকে কি করে পিওর করা যায়। একটু চিন্তা করে দেখুন তো ।

function pure() {
let val1 = 6;
let val2 = 4;
   return val1 * val2;
}
pure();

এখন কোডটি একটি পিওর ফাংশন।

চলুন আরও একটি উদাহরন দেখা যাক।

function pure(arg) {
   let val = 100;
   return val * arg;
}
pure(2);

উপরের কোডটি সম্পূর্ণ একটি পিওর ফাংশন। কারণ এইখানে ফাংশনটি তার আর্গুমেন্ট এবং ফাংশন Scoop এর মধ্যে ভারিয়েবল val এর উপর নির্ভরশীল।

নিচের কোডটি লক্ষ্য করুন;

const impureAssoc = (key, value, object) => {
   object[key] = value;
};
const person = {
   name:'Bobo',
};
const result = impureAssoc('shoeSize', 400, person);
console.log({
   person,
   result,
});

 

বলুন তো এখানে impureAssoc ফাংশনটি পিওর কিনা? একটু চিন্তা করুন।

ঠিক বলেছেন, এটি একটি Impure ফাংশন। কারন এই ফাংশনটির Side Effect রয়েছে। এখানে person অবজেক্টটিকে impureAssoc ফাংশনটি চিরতরে পরিবর্তন করে দিয়েছে। অর্থাৎ impureAssoc ফাংশনটির জন্য আমাদের ফাংশনের বাহিরে কোড পরিবর্তন হয়েছে। তাই এটি অবশই একটি Impure ফাংশন।
তাহলে এটিকে পিওর করব কি করে। একটু চেষ্টা করে দেখুন তারপর নিচের সমাধানটি দেখুন।

const pureAssoc = (key, value, object) => ({
   ...object,
   [key]:value,
});
const person = {
   name:'Bobo',
};
const result = pureAssoc('shoeSize', 400, person);
console.log({
   person,
   result,
});

এখন person অবজেক্টটি শুধুমাত্র ফাংশনটির ভিতর পরিবর্তন হবে যার কোন Effect ফাংশনটির বাহিরে পরবে না।

আশা করি এখন থেকে পিওর ফাংশন বুঝতে আর কোন সমস্যা হবে না।

 
উদাহরন
  • This is a pure function
function add (x){
  return x + 2
}
  • এই ফাংশন টি পিউর ফাংশন না কারণ একই ইনপুট দিয়ে বিভিন্ন সময়ে ফাংশন কল করলে বিভিন্ন আউটপুট পাওয়া যায়।
function getDate() {
  return new Date().toDateString();
}
  • এটি একটি পিউর ফাংশন। এইটি তার আউটপুট রিটার্ন করা ছাড়া কিছুই করে না। কই ইনপুট দিয়ে কল করলে এটি সর্বদা একই আউটপুট ফেরত দিবে।
function toHex(n) {
  let hex = n.toString(16);
  return hex.padStart(2, '0');
}
  • A function is pure if its output depends on nothing but its inputs, it does nothing except return its output, and it always returns the same output if called with the same input.
function rgbToHex(R, G, B) {
  return '#' + [toHex(R), toHex(G), toHex(B)].join('');
}

 

এসো নিজে করি
  • এই ফাংশনটিকে পিউর ফাংশনে রূপান্তর করুন।
var y = 2
function adder (x){
  return x + y
}
  • এই ফাংশনটিকে পিউর ফাংশনে রূপান্তর করুন।
function setColor(R, G, B) {
  const hex = rgbToHex(R, G, B);
  const colorMe = document.getElementById('color-me');
  colorMe.setAttribute('style', 'color: ' + hex);
}