1 min read
Updated 6 days ago

জাভাস্ক্রিপ্টে Proxy: হিডেন জেম যা আপনার কোডিংকে বদলে দিতে পারে

JavaScript Proxy হলো একটি পাওয়ারফুল ফিচার যা অবজেক্টের বিহেভিয়ার কাস্টমাইজ করতে দেয়। এই ব্লগে আপনি জানতে পারবেন Proxy কী, কীভাবে কাজ করে এবং কীভাবে ডেটা ভ্যালিডেশন, ডিবাগিং, মেমোইজেশন সহ নানা ক্ষেত্রে এটি ব্যবহৃত হয় — সব কিছু সহজ বাংলায়।

জাভাস্ক্রিপ্টে Proxy: হিডেন জেম যা আপনার কোডিংকে বদলে দিতে পারে
Image Caption
JavaScript Proxy: The Power of Controlling Objects

জাভাস্ক্রিপ্টের জগতে এমন অনেক ফিচার আছে, যেগুলো কম আলোচিত হলেও ডেভেলপমেন্টকে অনেক বেশি পাওয়ারফুল করে। এর মধ্যে একটি হলো Proxy—একটি অ্যাডভান্সড টুল, যা অবজেক্টের বিহেভিয়ার কাস্টমাইজ করতে অসাধারণ সুযোগ দেয়। আপনি যদি আপনার কোডকে আরো ডায়নামিক এবং কন্ট্রোল্ড করতে চান, তাহলে Proxy আপনার জন্য গেম-চেঞ্জার হতে পারে। এই ব্লগে আমরা জানবো Proxy কী, কীভাবে কাজ করে এবং কেন এটি ডেভেলপারদের জন্য ইম্পর্ট্যান্ট। চলুন, শুরু করা যাক!

JavaScript Proxy কী?

সিম্পলি বলতে গেলে, Proxy হলো জাভাস্ক্রিপ্টের একটা ফিচার, যেটা আপনাকে একটা অবজেক্টের উপর "মিডলম্যান" হিসেবে কাজ করার সুযোগ দেয়। মানে, কেউ যখন সেই অবজেক্টের কোনো প্রোপার্টি অ্যাক্সেস, মডিফাই বা ফাংশন কল করে, আপনি মাঝখানে এসে সেই অপারেশন কাস্টমাইজ করতে পারেন। এটা যেন একটা সুপার পাওয়ার, যা আপনার কোডকে আরো ফ্লেক্সিবল করে!

Proxy ES6-এর সাথে ইন্ট্রোডিউস হয়েছে, এবং এটি ডেভেলপারদের জন্য অসাধারণ সম্ভাবনা উন্মোচন করেছে! উদাহরণস্বরূপ, Vue.js (পুরোনো ভার্সন) Proxy ব্যবহার করে একটি শক্তিশালী reactivity system তৈরি করেছে। ইন্টারেস্টিং, তাই না?

Proxy কীভাবে কাজ করে?

Proxy তৈরি করতে আপনি new Proxy() কনস্ট্রাক্টর ইউজ করবেন। এটি দুটি প্যারামিটার নেয়:

  1. target: যে অবজেক্টের উপর Proxy অ্যাপ্লাই করতে চান।
  2. handler: একটা অবজেক্ট, যেখানে আপনি কাস্টম লজিক ডিফাইন করবেন (যেমন, কোনো প্রোপার্টি অ্যাক্সেস করলে কী হবে)।

Handler-এ কিছু "traps" থাকে, যেমন:

  • get: প্রোপার্টি রিড করার সময় কল হয়।
  • set: প্রোপার্টি মডিফাই করার সময় কল হয়।
  • apply: ফাংশন কল করার সময় কল হয়।

একটা বেসিক উদাহরণ দেখুন:

const target = { name: "আলিফ" };
const handler = {
  get(target, prop) {
    console.log(`প্রোপার্টি অ্যাক্সেস করা হচ্ছে: ${prop}`);
    return target[prop];
  }
};
const proxy = new Proxy(target, handler);

console.log(proxy.name);
// আউটপুট:
// প্রোপার্টি অ্যাক্সেস করা হচ্ছে: name
// আলিফ

এই কোডে আমরা Proxy ইউজ করে প্রোপার্টি অ্যাক্সেসের সময় একটা লগ অ্যাড করেছি। এটা দেখায় কীভাবে Proxy অবজেক্টের বিহেভিয়ার কন্ট্রোল করে।

Proxy প্র্যাকটিকাল ইউজ কেস

এবার আসল ইন্টারেস্টিং পার্ট—Proxy দিয়ে আপনি কী কী করতে পারেন? এখানে কয়েকটা প্র্যাকটিকাল ইউজ কেস:

১. ডেটা ভ্যালিডেশন

ধরুন, আপনি চান অবজেক্টের কোনো প্রোপার্টি শুধু নির্দিষ্ট টাইপের হবে। প্রক্সি দিয়ে এটা সহজেই ইমপ্লিমেন্ট করা যায়:

const handler = {
  set(target, prop, value) {
    if (prop === "age" && typeof value !== "number") {
      throw new Error("এজ নাম্বার হতে হবে!");
    }
    target[prop] = value;
    return true;
  }
};
const proxy = new Proxy({}, handler);

proxy.age = 25; // কাজ করবে
proxy.age = "পঁচিশ"; // Error: এজ নাম্বার হতে হবে!

এটা খুব হেল্পফুল যখন আপনি API থেকে আসা ডেটা ভ্যালিডেট করতে চান।

২. লগিং এবং ডিবাগিং

কমপ্লেক্স অ্যাপে আপনি চাইতে পারেন অবজেক্টের সব অপারেশন ট্র্যাক করতে। প্রক্সি দিয়ে প্রোপার্টি অ্যাক্সেস বা মডিফিকেশন লগ করা যায়:

const target = { user: "রাহিম" };
const handler = {
  get(target, prop) {
    console.log(`প্রোপার্টি ${prop} অ্যাক্সেস করা হলো`);
    return target[prop];
  },
  set(target, prop, value) {
    console.log(`প্রোপার্টি ${prop} সেট করা হলো: ${value}`);
    target[prop] = value;
    return true;
  }
};
const proxy = new Proxy(target, handler);

proxy.user; // প্রোপার্টি user অ্যাক্সেস করা হলো
proxy.user = "করিম"; // প্রোপার্টি user সেট করা হলো: করিম

এটা ডিবাগিং-এর জন্য সুপার ইউজফুল!

৩. অ্যাক্সেস কন্ট্রোল

ধরুন, আপনি চান কিছু প্রোপার্টি প্রাইভেট রাখতে। Proxy দিয়ে অ্যাক্সেস রেস্ট্রিক্ট করা যায়:

const target = { _secret: "গোপন", public: "ওপেন" };
const handler = {
  get(target, prop) {
    if (prop.startsWith("_")) {
      throw new Error("এই প্রোপার্টি প্রাইভেট!");
    }
    return target[prop];
  }
};
const proxy = new Proxy(target, handler);

console.log(proxy.public); // ওপেন
console.log(proxy._secret); // Error: এই প্রোপার্টি প্রাইভেট!

৪. মেমোইজেশন

যদি আপনি একটা ফাংশনের রেজাল্ট ক্যাশ করতে চান যাতে বারবার কম্পিউট না করতে হয়, Proxy হেল্প করতে পারে:

const expensiveFunction = (x) => {
  console.log("হেভি কম্পিউটেশন রানিং...");
  return x * x;
};

const handler = {
  apply(target, thisArg, args) {
    const cacheKey = args.join(",");

    if (!target.cache) target.cache = {};

    if (target.cache[cacheKey]) {
      return target.cache[cacheKey];
    }

    const result = target(...args);
    target.cache[cacheKey] = result;
    return result;
  }
};

const proxy = new Proxy(expensiveFunction, handler);

console.log(proxy(5)); // হেভি কম্পিউটেশন রানিং... 25
console.log(proxy(5)); // 25 (ক্যাশ থেকে)

রিয়েল-ওয়ার্ল্ড অ্যাপ্লিকেশন

Proxy শুধু থিওরিটিকাল ফিচার নয়, এটা রিয়েল প্রজেক্টে ইউজ হয়। উদাহরণস্বরূপ:

  • Vue.js: Vue 2-তে রিঅ্যাক্টিভিটি সিস্টেম প্রক্সির উপর বিল্ড করা ছিল। ডেটা চেঞ্জ হলে প্রক্সি UI আপডেট করত।
  • Immer: এই লাইব্রেরি প্রক্সি ইউজ করে Immutable State Management সিম্পল করে।
  • API Clients: Proxy দিয়ে API কল ইন্টারসেপ্ট করে অটো-রিট্রাই বা ক্যাশিং অ্যাড করা যায়।

সাবধানতা এবং Best Practices

Proxy খুবই পাওয়ারফুল, কিন্তু কিছু পয়েন্ট মাথায় রাখবেন:

  • পারফরম্যান্স: বেশি Proxy ইউজ করলে কোড স্লো হতে পারে। শুধু নিডেড কেসে ইউজ করুন।
  • সিম্পল লজিক: হ্যান্ডলারে কমপ্লেক্স লজিক এড়িয়ে কোড ক্লিন রাখুন।
  • টেস্টিং: Proxy ট্র্যাপগুলো ভালোভাবে টেস্ট করুন, কারণ এগুলো অনাকাঙ্ক্ষিত ইফেক্ট তৈরি করতে পারে।

শেষ কথা

JavaScript Proxy হলো একটা hidden gem, যেটা আপনার কোডকে ডায়নামিক এবং কন্ট্রোল্ড করার পাওয়ার দেয়। ডেটা ভ্যালিডেশন থেকে মেমোইজেশন—এর ইউজ কেস অনেক! আশা করি এই ব্লগ আপনাকে Proxy নিয়ে এক্সপেরিমেন্ট করতে ইন্সপায়ার করবে।