Closure একটি ফাংশন এবং তার লেক্সিকাল স্কোপের সংমিশ্রণ, যা ফাংশনটি যখন কল করা হয় তখন তার চারপাশের ভেরিয়েবল এবং মান অ্যাক্সেস করতে পারে। CoffeeScript-এ closures-এর ব্যবহার JavaScript-এর মতোই, কিন্তু কোডটি অনেক সহজ এবং সংক্ষিপ্ত হয়ে থাকে। এখানে CoffeeScript-এ closures ব্যবহার করার উপায় এবং উদাহরণ তুলে ধরা হলো।
Closure কী?
Closure এমন একটি ফাংশন যা তার নিজের লেক্সিকাল স্কোপ (outer function scope) থেকে ভেরিয়েবল এবং মানগুলোকে স্মৃতি রাখে, এমনকি যখন তার বাইরের ফাংশনটি এক্সিকিউট করা হয়ে যায়।
JavaScript-এ closures সাধারণত ফাংশন ডিক্লারেশন এবং ফাংশন রিটার্ন করার সময় ব্যবহৃত হয়। CoffeeScript-এ এটি আরও সহজ এবং সংক্ষিপ্ত হয়।
CoffeeScript-এ Closure উদাহরণ
উদাহরণ ১: সহজ Closure
makeCounter = ->
count = 0
increment = ->
count += 1
return count
increment
counter = makeCounter()
console.log counter() # 1
console.log counter() # 2
console.log counter() # 3
ব্যাখ্যা:
- এখানে
makeCounterএকটি ফাংশন যা অন্য একটি ফাংশনincrementরিটার্ন করে। incrementফাংশনটিcountভেরিয়েবলটিকে অ্যাক্সেস করতে পারে, যাmakeCounterফাংশনের স্কোপের মধ্যে রয়েছে।counterএকটি closure, কারণ এটিincrementফাংশনটি রিটার্ন করেছে এবং তার বাইরেরcountভেরিয়েবলটিকে স্মৃতি রেখেছে।- যতবার
counter()কল করা হয়,countভেরিয়েবলটি বাড়ানো হয়, যা একটি closure হওয়ার ফলস্বরূপ।
JavaScript-এ কম্পাইল হওয়া কোড:
var counter, increment, makeCounter;
makeCounter = function() {
var count;
count = 0;
increment = function() {
count += 1;
return count;
};
return increment;
};
counter = makeCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
Closure এর সুবিধা
- ডেটা ইনক্যাপসুলেশন: Closure-এ বাইরের ফাংশনের ভেরিয়েবল গুলো শুধুমাত্র ভিতরের ফাংশনের মাধ্যমে অ্যাক্সেস করা যায়, যা ডেটা ইনক্যাপসুলেশন নিশ্চিত করে।
- স্টেটফুল ফাংশন: Closure এর মাধ্যমে আপনি একটি ফাংশন তৈরি করতে পারেন যা স্টেট ধারণ করে। উদাহরণস্বরূপ, কাউন্টার ফাংশন বা মেমোইজেশন।
- ফাংশন রিটার্নিং: Closure ব্যবহার করে আপনি একটি ফাংশন রিটার্ন করতে পারেন যা তার আউটারে থাকা ভেরিয়েবলকে অ্যাক্সেস করতে পারে।
CoffeeScript-এ আরেকটি Closure উদাহরণ
উদাহরণ ২: মেমোইজেশন (Memoization)
memoize = (fn) ->
cache = {}
(x) ->
return cache[x] if cache[x]
result = fn(x)
cache[x] = result
result
expensiveFunction = (x) ->
console.log "Calculating..."
x * 2
cachedFunction = memoize(expensiveFunction)
console.log cachedFunction(5) # "Calculating..." 10
console.log cachedFunction(5) # 10 (no "Calculating..." printed)
ব্যাখ্যা:
memoizeএকটি closure যা একটি ফাংশনfnগ্রহণ করে এবং সেই ফাংশনটির আউটপুট ক্যাশে করে রাখে।- প্রথমবার
cachedFunction(5)কল করলে এটি "Calculating..." প্রিন্ট করবে এবং ফলাফল ক্যাশে রেখে দিবে। - পরবর্তীতে
cachedFunction(5)কল করার সময় ক্যাশ থেকে মানটি সরাসরি রিটার্ন হবে, ফলে "Calculating..." আর প্রিন্ট হবে না।
JavaScript-এ কম্পাইল হওয়া কোড:
var cachedFunction, expensiveFunction, memoize;
memoize = function(fn) {
var cache;
cache = {};
return function(x) {
if (cache[x]) {
return cache[x];
}
var result;
result = fn(x);
cache[x] = result;
return result;
};
};
expensiveFunction = function(x) {
console.log("Calculating...");
return x * 2;
};
cachedFunction = memoize(expensiveFunction);
console.log(cachedFunction(5)); // "Calculating..." 10
console.log(cachedFunction(5)); // 10 (no "Calculating..." printed)
Closure এর অন্যান্য ব্যবহার
- স্টেটফুল ফাংশন তৈরি করা: যেমন কাউন্টার ফাংশন, যেখানে ভেরিয়েবলটি প্রতিবার ফাংশন কলের সাথে বাড়ানো হয়।
- ডেটা এনক্যাপসুলেশন: ক্লোজারের মাধ্যমে আপনি বাইরের কোড থেকে ডেটা গোপন রাখতে পারেন।
- কার্বন কপি তৈরি করা: যেখানে একাধিক ফাংশন একে অপরের উপর নির্ভর করে এবং বিভিন্ন প্যারামিটার বা পরিস্থিতিতে পুনঃব্যবহার করা যায়।
সারাংশ
CoffeeScript-এ closures ব্যবহার করা JavaScript এর মতোই সহজ এবং কার্যকরী। এটি স্টেটফুল ফাংশন তৈরি করতে সহায়ক, যেমন কাউন্টার বা মেমোইজেশন, এবং ডেটা এনক্যাপসুলেশন নিশ্চিত করে। closures CoffeeScript-এ কোডের পুনঃব্যবহারযোগ্যতা এবং কার্যকারিতা বাড়াতে সাহায্য করে।
Read more