1 min read
Updated 6 days ago

JavaScript WeakMap: মেমোরি-এফিশিয়েন্ট কোডিং

Discover JavaScript WeakMap for memory-efficient coding! Learn private data storage, caching, memoization, and WebSocket management in this tutorial.

JavaScript WeakMap: মেমোরি-এফিশিয়েন্ট কোডিং
Image Caption
JavaScript WeakMap: Memory efficient coding

মেমোরি লিক মাথাব্যথার কারণ হতে পারে, বিশেষ করে বড় জাভাস্ক্রিপ্ট অ্যাপে। কিন্তু একটা টুল আছে যেটা এই সমস্যা থেকে বাঁচাতে পারে—WeakMap। এটা জাভাস্ক্রিপ্টের একটা লো-প্রোফাইল ফিচার, কিন্তু মেমোরি ম্যানেজমেন্টে এর কোনো জুড়ি নেই। আপনি যদি কোডকে ফাস্ট, ক্লিন, আর এফিশিয়েন্ট করতে চান, WeakMap হতে পারে একটা দারুণ সলিউশন। এই ব্লগে দেখবো WeakMap কী, এটা কীভাবে কাজ করে, আর কীভাবে এটা আপনার প্রজেক্টে ডিফারেন্স তৈরি করবে। চলুন, এক্সপ্লোর করি!

কেন WeakMap দরকার

ব্যাপারটা মজার, শুনুন—WeakMap ডেটা এমনভাবে স্টোর করে যে মেমোরি লিকের ঝুঁকি অনেক কমে যায়। এটা গারবেজ কালেকশনের সাথে সিঙ্ক করে, যা বড় অ্যাপে পারফরম্যান্স বাড়াতে পারে, বিশেষ করে SPA বা ব্যাকএন্ডে। DOM Element-এর মেটাডেটা স্টোর করা, প্রাইভেট ডেটা হাইড করা, বা ক্যাশিংয়ের জন্য এটা কাজের জিনিস। এটা জানলে কোডিং অনেক স্মার্ট হয়ে যায়।

WeakMap কী

WeakMap হলো জাভাস্ক্রিপ্টের একটা কালেকশন, যেখানে কী-ভ্যালু পেয়ার স্টোর করা যায়। কিন্তু এর স্পেশাল ফিচার হলো—কী শুধু অবজেক্ট হতে পারে, আর যদি সেই অবজেক্ট আর কোথাও রেফারেন্স না থাকে, WeakMap স্বয়ংক্রিয়ভাবে সেই এন্ট্রি রিমুভ করে। এটা মেমোরি লিক থেকে বাঁচায়।

দেখুন একটা সিম্পল উদাহরণ:

const weakMap = new WeakMap();
let obj = { name: "Karim" };
weakMap.set(obj, "Developer");
console.log(weakMap.get(obj)); // Developer
obj = null; // obj গারবেজ কালেক্ট হবে, WeakMap এন্ট্রি গায়েব!

এটা ES6-এর একটা ফিচার, আর মেমোরি-সেন্সিটিভ কোডিংয়ে এর ভূমিকা বড়।

WeakMap-এর বৈশিষ্ট্য

  • শুধু অবজেক্ট কী: কী অবশ্যই অবজেক্ট হবে, স্ট্রিং বা নাম্বার নয়।
  • যেকোনো ভ্যালু: ভ্যালু যা খুশি—স্ট্রিং, অবজেক্ট, ফাংশন।
  • ওয়ীক রেফারেন্স: অবজেক্ট রেফারেন্স না থাকলে গারবেজ কালেকশন এন্ট্রি ক্লিয়ার করে।
  • নন-ইটারেবল: .forEach বা .keys() নেই, ডেটা প্রাইভেসি বাড়ায়।
  • নো সাইজ: .size প্রোপার্টি নেই, এন্ট্রি কাউন্ট করা যায় না।
  • মেমোরি এফিশিয়েন্ট: বড় অ্যাপে মেমোরি সেভ করতে হেল্প করে।

WeakMap কীভাবে বানাবেন

WeakMap তৈরি করা খুবই সোজা। শুধু new WeakMap() লিখুন। এখানে একটা কুইক উদাহরণ:

const weakMap = new WeakMap();
const key = { id: 1 };
weakMap.set(key, "Test");
console.log(weakMap.get(key)); // Test

কী অবজেক্ট হলে ভ্যালু যেকোনো কিছু হতে পারে। সিম্পল, তাই না?

WeakMap-এর মেথডস

WeakMap-এ চারটা মেথড আছে, সবই স্ট্রেইটফরোয়ার্ড:

delete(key): কী-ভ্যালু ডিলিট করে।

weakMap.delete(key);

has(key): কী আছে কিনা চেক করে।

console.log(weakMap.has(key)); // true

get(key): কী দিয়ে ভ্যালু ফিরিয়ে দেয়।

console.log(weakMap.get(key)); // New Data

set(key, value): কী-ভ্যালু স্টোর করে।

weakMap.set(key, "New Data");

এই মেথডগুলো দিয়ে WeakMap-এর সব কিছু ম্যানেজ করা যায়।

কোথায় ইউজ করবেন

এটা দারুণ কারণ WeakMap রিয়েল প্রবলেম সলভ করে। এখানে চারটা প্র্যাকটিকাল ইউজ কেস, ফ্রন্টএন্ড থেকে ব্যাকএন্ড পর্যন্ত দেখানো হল:

১. প্রাইভেট ডেটা স্টোরেজ

ক্লাসে প্রাইভেট ডেটা রাখতে WeakMap ইউজ করা যায়, যাতে বাইরে থেকে কেউ অ্যাক্সেস করতে না পারে। এটা লাইব্রেরি ডেভেলপমেন্টে কাজে লাগে:

const privateData = new WeakMap();
class User {
  constructor(name) {
    privateData.set(this, { name });
  }
  getName() {
    return privateData.get(this).name;
  }
}
const user = new User("রাহিম");
console.log(user.getName()); // রাহিম
console.log(privateData.get(user)); // undefined (বাইরে থেকে অ্যাক্সেস নেই)

এটা ডেটা প্রাইভেসি নিশ্চিত করে।

২. ক্যাশিং মেকানিজম

হেভি কম্পিউটেশনের রেজাল্ট ক্যাশ করতে WeakMap ইউজ করা যায়। অবজেক্ট রিমুভ হলে ক্যাশ ক্লিয়ার হয়:

const cache = new WeakMap();
function computeExpensiveValue(obj) {
  if (cache.has(obj)) {
    return cache.get(obj);
  }
  console.log("কম্পিউটিং...");
  const result = obj.value * obj.value;
  cache.set(obj, result);
  return result;
}
let obj = { value: 5 };
console.log(computeExpensiveValue(obj)); // কম্পিউটিং... 25
console.log(computeExpensiveValue(obj)); // 25 (ক্যাশ থেকে)
obj = null; // obj গারবেজ কালেক্ট হলে ক্যাশ ক্লিয়ার

এটা পারফরম্যান্স অপটিমাইজেশনে কাজে লাগে।

৩. মেমোইজেশন

ফাংশনের রেজাল্ট মেমোইজ করতে WeakMap ব্যবহার করা যায়, বিশেষ করে যখন অবজেক্ট আর্গুমেন্ট থাকে। এটা ফাংশন কল রিপিট না করে সময় বাঁচায়:

const memoized = new WeakMap();
function memoize(fn) {
  return function (obj) {
    if (memoized.has(obj)) {
      return memoized.get(obj);
    }
    const result = fn(obj);
    memoized.set(obj, result);
    return result;
  };
}
const compute = memoize((obj) => {
  console.log("প্রসেসিং...");
  return obj.data.toUpperCase();
});
let dataObj = { data: "hello" };
console.log(compute(dataObj)); // প্রসেসিং... HELLO
console.log(compute(dataObj)); // HELLO (মেমোইজড)
dataObj = null; // obj গারবেজ কালেক্ট হলে মেমোইজড ডেটা ক্লিয়ার

এটা কম্প্লেক্স ফাংশন অপটিমাইজ করতে হেল্প করে।

৪. ব্যাকএন্ড সার্ভার: ওয়েবসকেট ক্লায়েন্ট ম্যানেজমেন্ট

Node.js সার্ভারে ওয়েবসকেট ক্লায়েন্টের মেটাডেটা ট্র্যাক করতে WeakMap ইউজ করা যায়। ক্লায়েন্ট ডিসকানেক্ট হলে মেটাডেটা ক্লিয়ার হয়:

const wsMetadata = new WeakMap();
function trackClient(ws) {
  wsMetadata.set(ws, { userId: `user_${Math.random()}`, connectedAt: Date.now() });
  ws.on("close", () => {
    console.log(`ক্লায়েন্ট ডিসকানেক্ট: ${wsMetadata.get(ws).userId}`);
  });
}
const ws = new WebSocket("ws://example.com");
trackClient(ws);
// ws ক্লোজ হলে মেটাডেটা গারবেজ কালেক্ট হবে

এটা ব্যাকএন্ডে মেমোরি-এফিশিয়েন্ট ক্লায়েন্ট ম্যানেজমেন্টে কাজে লাগে।

Map-এর সাথে তুলনা

WeakMap আর Map কখন ইউজ করবেন? এই টেবিলে সব ক্লিয়ার:

ফিচার

Map

WeakMap

কী টাইপ

যেকোনো (স্ট্রিং, নাম্বার, অবজেক্ট)

শুধু অবজেক্ট

গারবেজ কালেকশন

কী ধরে রাখে, কালেক্ট হয় না

কী কালেক্ট হলে এন্ট্রি রিমুভ হয়

ইটারেবল

হ্যাঁ (.forEach, .keys())

না

সাইজ

.size দিয়ে চেক করা যায়

সাইজ চেক করা যায় না

ইউজ কেস

জেনারেল স্টোরেজ, লুপিং

প্রাইভেট ডেটা, ক্যাশিং, মেমোইজেশন

WeakMap কখন?

  • কী অবজেক্ট হলে আর মেমোরি লিক এড়াতে হলে (যেমন, প্রাইভেট ডেটা, ওয়েবসকেট মেটাডেটা)।
  • ইটারেশন বা সাইজ দরকার না হলে।

Map কখন?

  • কী স্ট্রিং বা নাম্বার হলে বা লুপ করতে হলে।
  • ডেটা পার্সিস্টেন্ট থাকা লাগলে।

কিছু টিপস

WeakMap ইউজ করার সময় এই পয়েন্টগুলো মাথায় রাখুন:

  • অবজেক্ট কী মাস্ট: স্ট্রিং বা নাম্বার কী হলে Map বা অবজেক্ট ইউজ করুن।
  • ইটারেশন নেই: লুপ দরকার হলে Map-এর দিকে যান।
  • টেস্ট করুন: বড় অ্যাপে মেমোরি লিক চেক করুন, WeakMap কাজ করছে কিনা কনফার্ম করতে।
  • সিম্পল রাখুন: WeakMap প্রাইভেট ডেটা, ক্যাশিং, বা মেমোইজেশনে বেস্ট, জটিল লজিক এড়ান।
  • অলটারনেটিভ দেখুন: WeakMap ফিট না করলে Map বা Set চেক করুন।

শেষ কথা

WeakMap একটা পাওয়ারফুল টুল যেটা কোডকে মেমোরি-ফ্রেন্ডলি করে। প্রাইভেট ডেটা স্টোরেজ থেকে ব্যাকএন্ড ওয়েবসকেট ম্যানেজমেন্ট—এর ইউজ কেস অনেক। এই ব্লগ পড়ে আশা করি WeakMap নিয়ে এক্সপেরিমেন্ট করতে ইচ্ছুক হবেন। JavaScript Proxy সম্পর্কে জানতে জাভাস্ক্রিপ্ট Proxy ব্লগটি পড়ে দেখতে পারেন।

কী ভাবছেন? WeakMap কি আপনার কোডিংকে লেভেল আপ করবে?