Advanced Underscore.js Techniques

আন্ডারস্কোর.জেএস (underscorejs) - Web Development

242

Underscore.js এর উন্নত প্রযুক্তি (Advanced Techniques)

Underscore.js হল একটি শক্তিশালী লাইব্রেরি যা JavaScript কোড লেখাকে আরও কার্যকরী, পড়তে সহজ এবং সংক্ষিপ্ত করে তোলে। এই লাইব্রেরিটি ডেটা ম্যানিপুলেশন, ফাংশনাল প্রোগ্রামিং এবং অন্যান্য সাধারণ কাজের জন্য বেশ কিছু উন্নত ফিচার প্রদান করে। এখানে, আমরা Underscore.js এর কিছু উন্নত টেকনিক এবং প্যাটার্ন আলোচনা করব যা আপনার কোড লেখার দক্ষতা বাড়াবে।


১. Memoization (Memoization with _.memoize)

Memoization একটি কৌশল যেখানে আপনি একটি ফাংশনের আউটপুট ক্যালকুলেট করে তার ফলাফল ক্যাশে (সংরক্ষণ) করে রাখেন, যাতে ভবিষ্যতে একই ইনপুট পেলে তা দ্রুত রিটার্ন করা যায়। Underscore.js এর _.memoize() ফাংশন এই কাজটি সহজ করে তোলে। এটি একটি ফাংশনের আউটপুটকে ক্যাশে করে এবং পুনরায় সেই আউটপুটকে আর্গুমেন্টগুলির উপর ভিত্তি করে রিটার্ন করে।

সিনট্যাক্স:

_.memoize(func, [resolver]);
  • func: ক্যাশে করার জন্য যে ফাংশনটি ব্যবহার করা হবে।
  • resolver: (অপশনাল) একটি ফাংশন যা ইনপুটের উপর ভিত্তি করে কী তৈরি করে।

উদাহরণ:

var fib = _.memoize(function(n) {
  if (n <= 1) return 1;
  return fib(n - 1) + fib(n - 2);
});

console.log(fib(40)); // দ্রুত কাজ করবে কারণ ফলাফল ক্যাশে করা হয়েছে

এখানে fib ফাংশনটি ক্যাশে ফলাফল রাখে, ফলে একই ইনপুটের জন্য একই আউটপুট দ্রুত পাওয়া যাবে।


২. Throttling and Debouncing with _.throttle and _.debounce

Throttling এবং debouncing ফাংশনালিটির মাধ্যমে আপনি কোডের কর্মক্ষমতা নিয়ন্ত্রণ করতে পারেন, বিশেষত যখন আপনি ইভেন্ট হ্যান্ডলার ব্যবহার করছেন। _.throttle() এবং _.debounce() ফাংশনগুলো ইনপুট ইভেন্ট বা ফাংশনের কলিং সীমাবদ্ধ করতে সাহায্য করে।

  • _.throttle(): একটি ফাংশনকে নির্দিষ্ট সময়ের মধ্যে একাধিকবার চালানো থেকে বিরত রাখে।
  • _.debounce(): একটি ফাংশনকে নির্দিষ্ট সময় পর্যন্ত অপেক্ষা করার পর চালানোর সুযোগ দেয়, যাতে একাধিক কল একত্রিত করা যায়।

_.throttle() উদাহরণ:

var logScroll = _.throttle(function() {
  console.log('Scrolled!');
}, 2000);

window.addEventListener('scroll', logScroll);

এখানে, logScroll ফাংশনটি প্রতি 2 সেকেন্ডে একবারই কল হবে, এমনকি আপনি স্ক্রল করলে বারবার কল হতে না।

_.debounce() উদাহরণ:

var searchQuery = _.debounce(function(query) {
  console.log('Searching for:', query);
}, 300);

document.getElementById('search').addEventListener('input', function(e) {
  searchQuery(e.target.value);
});

এখানে, searchQuery ফাংশনটি 300 মিলিসেকেন্ড অপেক্ষা করবে এবং তারপর ইভেন্ট হ্যান্ডলিং করবে। অর্থাৎ, ইউজার টাইপ করার পর দ্রুত সাড়া দেওয়া হয় না, বরং কিছু সময় পর সঠিক ইনপুট এর জন্য একবার কল হবে।


৩. Custom Functions with _.partial

_.partial() হল একটি উন্নত টেকনিক যা ফাংশনাল প্রোগ্রামিংয়ের মাধ্যমে আর্গুমেন্ট প্রিপপুলেট করে একটি নতুন ফাংশন তৈরি করতে সহায়তা করে। এটি একটি ফাংশন তৈরি করতে ব্যবহৃত হয় যেখানে কিছু আর্গুমেন্ট পূর্বনির্ধারিত থাকে এবং বাকি আর্গুমেন্ট ব্যবহারকারীর কাছে থেকে আসে।

সিনট্যাক্স:

_.partial(func, *args);
  • func: ফাংশন যার আর্গুমেন্ট কিছু পূর্বনির্ধারিত হবে।
  • *args: প্রাথমিক আর্গুমেন্ট যা ফাংশন কলের সময় দেয়া হবে।

উদাহরণ:

var greet = _.partial(function(greeting, name) {
  console.log(greeting + ' ' + name);
}, 'Hello');

greet('John'); // Output: "Hello John"
greet('Jane'); // Output: "Hello Jane"

এখানে, greet ফাংশনটি পূর্বনির্ধারিত 'Hello' আর্গুমেন্ট নিয়ে তৈরি হয়েছে, এবং বাকি আর্গুমেন্ট (যেমন John, Jane) ব্যবহারকারীর কাছ থেকে আসবে।


৪. Sorting Collections with _.sortBy()

_.sortBy() ফাংশনটি একটি অ্যারে বা অবজেক্টকে একটি নির্দিষ্ট ক্রম অনুযায়ী সাজাতে ব্যবহৃত হয়। এটি একটি ফাংশনাল প্রোগ্রামিং স্টাইল কৌশল যা আপনাকে অ্যারে বা অবজেক্টের কীগুলির মান অনুযায়ী সট (sort) করতে সাহায্য করে।

সিনট্যাক্স:

_.sortBy(collection, iteratee);
  • collection: অ্যারে বা অবজেক্ট।
  • iteratee: একটি ফাংশন বা প্রোপার্টি যার উপর ভিত্তি করে সট করা হবে।

উদাহরণ:

var people = [
  { name: 'John', age: 28 },
  { name: 'Jane', age: 34 },
  { name: 'Jack', age: 22 }
];

var sortedByAge = _.sortBy(people, 'age');
console.log(sortedByAge);
// Output: [{ name: 'Jack', age: 22 }, { name: 'John', age: 28 }, { name: 'Jane', age: 34 }]

এখানে, _.sortBy() ফাংশনটি age প্রপার্টি অনুযায়ী ব্যক্তিদের সাজিয়েছে।


৫. Group and Count with _.groupBy() and _.countBy()

_.groupBy() এবং _.countBy() ফাংশন দুটি শক্তিশালী ফাংশনালিটি যা আপনাকে একটি কোল্লেকশন (অ্যারে বা অবজেক্ট) গ্রুপ বা কাউন্ট করতে সাহায্য করে।

  • _.groupBy(): এটি কোল্লেকশনকে একটি নির্দিষ্ট কন্ডিশনের ভিত্তিতে গ্রুপ করে।
  • _.countBy(): এটি কোল্লেকশনের মান গণনা করে এবং কী ভিত্তিতে সংখ্যা রিটার্ন করে।

_.groupBy() উদাহরণ:

var numbers = [1, 2, 3, 4, 5, 6];
var grouped = _.groupBy(numbers, function(num) {
  return num % 2 === 0 ? 'even' : 'odd';
});
console.log(grouped);
// Output: { even: [2, 4, 6], odd: [1, 3, 5] }

_.countBy() উদাহরণ:

var numbers = [1, 2, 3, 4, 5, 6];
var count = _.countBy(numbers, function(num) {
  return num % 2 === 0 ? 'even' : 'odd';
});
console.log(count);
// Output: { even: 3, odd: 3 }

এটি আপনাকে একটি কোল্লেকশন থেকে গ্রুপিং বা কাউন্টিং এর মাধ্যমে ডেটা বিশ্লেষণ করতে সহায়তা করে।


সারাংশ

Underscore.js হল একটি শক্তিশালী JavaScript লাইব্রেরি যা উন্নত ফাংশনাল প্রোগ্রামিং কৌশল এবং টুলস প্রদান করে। এর মাধ্যমে আপনি কোডকে আরও কার্যকরী, পড়তে সহজ এবং পরিষ্কার করতে পারেন। উন্নত কৌশলগুলির মধ্যে Memoization, Throttling and Debouncing, Partial Functions, Sorting Collections, এবং Grouping/Counting ফাংশনালিটি অন্তর্ভুক্ত রয়েছে। এই প্রযুক্তিগুলি আপনার কোডকে দ্রুত, কার্যকরী এবং রিডেবল করে তুলতে সহায়তা করে, বিশেষ করে যখন আপনি বড় এবং জটিল অ্যাপ্লিকেশন ডেভেলপ করছেন।

Content added By

কাস্টম ফাংশন তৈরি (Creating Custom Functions)

Underscore.js অনেক শক্তিশালী ফাংশন সরবরাহ করে, তবে আপনি চাইলে আপনার নিজস্ব কাস্টম ফাংশনও তৈরি করতে পারেন যা আপনার প্রয়োজনীয়তা অনুযায়ী কাজ করবে। Underscore.js এর স্টাইল ও কনভেনশন অনুসরণ করে কাস্টম ফাংশন তৈরি করলে তা আরও পরিষ্কার এবং সহজবোধ্য হয়।

আপনি কাস্টম ফাংশন তৈরি করার জন্য _.mixin() ফাংশন ব্যবহার করতে পারেন, যা নতুন ফাংশনকে Underscore.js লাইব্রেরির অংশ হিসেবে অন্তর্ভুক্ত করতে সহায়তা করে। _.mixin() ব্যবহার করে আপনি আপনার কাস্টম ফাংশনগুলোকে Underscore.js এর অন্যান্য ফাংশনের মতোই ব্যবহার করতে পারেন।

কাস্টম ফাংশন তৈরি করার জন্য সিনট্যাক্স:

_.mixin({
  customFunction: function(param) {
    // ফাংশনটি কিভাবে কাজ করবে
    return param + " is awesome!";
  }
});

এখানে, আপনি একটি নতুন ফাংশন customFunction তৈরি করেছেন যা param প্যারামিটার গ্রহণ করে এবং একটি স্ট্রিং রিটার্ন করে।


কাস্টম ফাংশনের উদাহরণ

উদাহরণ ১: একটি কাস্টম ফাংশন তৈরি করা যা স্ট্রিংয়ের দৈর্ঘ্য চেক করবে

// কাস্টম ফাংশন তৈরি
_.mixin({
  checkLength: function(str) {
    return str.length;
  }
});

// কাস্টম ফাংশন ব্যবহার
console.log(_.checkLength("Hello")); // Output: 5

এখানে checkLength নামের একটি কাস্টম ফাংশন তৈরি করা হয়েছে, যা একটি স্ট্রিং ইনপুট হিসেবে নেয় এবং তার দৈর্ঘ্য রিটার্ন করে।


উদাহরণ ২: একটি কাস্টম ফাংশন তৈরি করা যা দুটি অ্যারে মিশিয়ে একটি নতুন অ্যারে তৈরি করবে

// কাস্টম ফাংশন তৈরি
_.mixin({
  mergeArrays: function(arr1, arr2) {
    return arr1.concat(arr2);
  }
});

// কাস্টম ফাংশন ব্যবহার
var arr1 = [1, 2, 3];
var arr2 = [4, 5, 6];
console.log(_.mergeArrays(arr1, arr2)); // Output: [1, 2, 3, 4, 5, 6]

এখানে mergeArrays ফাংশনটি দুটি অ্যারেকে একত্রিত করে একটি নতুন অ্যারে রিটার্ন করছে।


মিক্সিন ব্যবহার (Using Mixins)

Mixins হল একটি ধারণা যা অন্য অবজেক্ট বা ক্লাসের বৈশিষ্ট্যগুলিকে একটি অবজেক্টে যুক্ত করে। Underscore.js এর মাধ্যমে, আপনি _.mixin() ফাংশন ব্যবহার করে আপনার কাস্টম ফাংশনগুলোকে Underscore.js এর লাইব্রেরির অংশ হিসেবে অন্তর্ভুক্ত করতে পারেন। এর মাধ্যমে আপনি অনেক সুবিধা পাবেন, যেমন অন্য যেকোনো Underscore.js ফাংশনের মতো সহজে অ্যাক্সেস করতে পারবেন এবং কোড আরও মডুলার এবং পুনঃব্যবহারযোগ্য হবে।

_.mixin() সিনট্যাক্স:

_.mixin({
  customMethod: function() {
    // কাস্টম ফাংশন কোড
  }
});

উদাহরণ ১: একটি সাধারণ মিক্সিন

// মিক্সিন ব্যবহার
_.mixin({
  greet: function(name) {
    return "Hello, " + name + "!";
  }
});

// ব্যবহার
console.log(_.greet("John")); // Output: Hello, John!

এখানে greet নামের একটি কাস্টম ফাংশন Underscore.js এর সাথে যুক্ত করা হয়েছে।

উদাহরণ ২: কাস্টম ফাংশন এবং পূর্বে থাকা ফাংশন একসাথে ব্যবহার করা

// মিক্সিন ব্যবহার
_.mixin({
  calculateSum: function(arr) {
    return _.reduce(arr, function(sum, num) {
      return sum + num;
    }, 0);
  }
});

// ব্যবহার
var numbers = [1, 2, 3, 4];
console.log(_.calculateSum(numbers)); // Output: 10

এখানে calculateSum ফাংশন তৈরি করা হয়েছে, যা _.reduce() ফাংশনের সাথে কাজ করে এবং অ্যারের সমস্ত সংখ্যার যোগফল রিটার্ন করে।


মিক্সিন এর উপকারিতা

  1. কাস্টম ফাংশন তৈরি করা সহজ: Underscore.js এর _.mixin() ফাংশনটি আপনাকে কাস্টম ফাংশন তৈরি করতে এবং সহজে লাইব্রেরির অংশ হিসেবে যুক্ত করতে সহায়তা করে।
  2. ফাংশন রিইউসেবিলিটি: আপনি যেকোনো ফাংশনকে মিক্সিনের মাধ্যমে অন্য কোডে রিইউজ (re-use) করতে পারবেন, যা কোডের কার্যকারিতা বাড়ায়।
  3. অফিশিয়াল লাইব্রেরির মতো ব্যবহার: মিক্সিন ব্যবহার করলে আপনার কাস্টম ফাংশনগুলো Underscore.js লাইব্রেরির বাকি ফাংশনের মতো ব্যবহারযোগ্য হবে।

সারাংশ

Underscore.js-এ কাস্টম ফাংশন তৈরি এবং মিক্সিন ব্যবহার করা কোডকে আরও মডুলার এবং কার্যকরী করে তোলে। _.mixin() ফাংশনটির মাধ্যমে আপনি আপনার কাস্টম ফাংশনগুলো Underscore.js লাইব্রেরির অংশ হিসেবে যোগ করতে পারেন এবং সহজে অন্য ফাংশনগুলোর মতো ব্যবহার করতে পারেন। এতে কোডের পুনঃব্যবহারযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা বৃদ্ধি পায়, এবং এটি আপনার ওয়েব ডেভেলপমেন্টের কাজকে আরও দ্রুত এবং কার্যকরী করে তোলে।

Content added By

Functional Programming (FP) কি?

Functional Programming (FP) হল একটি প্রোগ্রামিং প্যারাডাইম যেখানে প্রোগ্রামিং ভাষায় ফাংশনগুলিকে প্রথম শ্রেণির নাগরিক হিসেবে ব্যবহৃত করা হয়। অর্থাৎ, ফাংশনগুলোকে আর্গুমেন্ট হিসেবে পাস করা যায়, রিটার্ন করা যায় এবং ভ্যারিয়েবলে স্টোর করা যায়। FP এর মূল বৈশিষ্ট্যগুলির মধ্যে রয়েছে:

  • Pure Functions: ফাংশনগুলো আউটপুট নির্ধারণে শুধুমাত্র ইনপুটের উপর নির্ভর করে এবং বাহ্যিক স্টেট বা প্রভাবের উপর তাদের কাজ নির্ভর করে না।
  • Higher-Order Functions: ফাংশনগুলো অন্য ফাংশনকে আর্গুমেন্ট হিসেবে নিতে পারে বা ফাংশন রিটার্ন করতে পারে।
  • Immutability: ডেটাকে পরিবর্তন না করে নতুন ডেটা তৈরি করা হয়।
  • Function Composition: ছোট ছোট ফাংশনগুলোকে একত্রে ব্যবহার করে বড় ফাংশন তৈরি করা।

Underscore.js ফাংশনাল প্রোগ্রামিং ধারণা অনুসরণ করে এবং JavaScript-এ FP প্রয়োগ করতে অনেক শক্তিশালী টুল সরবরাহ করে। Underscore.js এর অনেক ফাংশন যেমন map(), filter(), reduce(), each(), chain() ইত্যাদি FP ধারণার উপর ভিত্তি করে তৈরি।


Underscore.js এর সাথে Functional Programming প্যাটার্ন প্রয়োগ

Underscore.js লাইব্রেরি ফাংশনাল প্রোগ্রামিং প্যাটার্নগুলিকে কার্যকরীভাবে প্রয়োগ করতে সহায়তা করে। এর মাধ্যমে আপনি ডেটা ম্যানিপুলেশন, ফাংশনাল কনভার্শন, এবং ফাংশন কম্পোজিশন যেমন FP কৌশল ব্যবহার করতে পারেন।

১. Higher-Order Functions

Underscore.js বিভিন্ন higher-order functions সরবরাহ করে যা অ্যারে বা অবজেক্টের উপর অপারেশন করতে সাহায্য করে। উদাহরণস্বরূপ, _.map(), _.filter(), _.reduce() ইত্যাদি।

উদাহরণ:

// Higher-Order function - map
var numbers = [1, 2, 3, 4, 5];
var doubledNumbers = _.map(numbers, function(num) {
  return num * 2;
});
console.log(doubledNumbers); // [2, 4, 6, 8, 10]

এখানে _.map() একটি higher-order function যা num নামক একটি ফাংশনকে আর্গুমেন্ট হিসেবে নেয় এবং প্রতিটি উপাদানকে ম্যাপ করে।


২. Pure Functions

Pure Functions হল এমন ফাংশন যা তাদের আউটপুট নির্ধারণের জন্য শুধুমাত্র তাদের ইনপুটের উপর নির্ভর করে এবং বাহ্যিক স্টেট বা পার্শ্ব-প্রভাবের উপর কোনো নির্ভরতা থাকে না। Underscore.js এর ফাংশনগুলি সাধারণত pure functions অনুসরণ করে।

উদাহরণ:

// Pure function - filter
var numbers = [1, 2, 3, 4, 5];
var evenNumbers = _.filter(numbers, function(num) {
  return num % 2 === 0;
});
console.log(evenNumbers); // [2, 4]

এটি একটি pure function উদাহরণ, যেখানে ফাংশন শুধুমাত্র অ্যারের উপাদানগুলির উপর কাজ করে এবং কোন বাহ্যিক স্টেটকে পরিবর্তন করে না।


৩. Function Composition

Function Composition হল ছোট ছোট ফাংশনগুলোকে একত্রে ব্যবহার করে একটি বড় ফাংশন তৈরি করা। Underscore.js এর _.compose() ফাংশনটি ফাংশন কম্পোজিশনের ধারণা প্রয়োগ করে। এটি একাধিক ফাংশনকে একত্রিত করে একটি নতুন ফাংশন তৈরি করে।

উদাহরণ:

// Function Composition with Underscore.js
var addOne = function(num) { return num + 1; };
var multiplyByTwo = function(num) { return num * 2; };

var addOneThenMultiplyByTwo = _.compose(multiplyByTwo, addOne);

console.log(addOneThenMultiplyByTwo(3)); // 8

এখানে, প্রথমে addOne ফাংশনটি প্রয়োগ করা হয়, তারপর multiplyByTwo ফাংশনটি প্রয়োগ করা হয়, এবং দুটি ফাংশনের কম্বিনেশন একটি নতুন ফাংশন হিসেবে তৈরি করা হয়।


৪. Immutability

Immutability হল একটি ধারণা যেখানে ডেটাকে সরাসরি পরিবর্তন না করে, একটি নতুন কপি তৈরি করা হয়। Underscore.js এর বেশ কিছু ফাংশন যেমন _.clone() বা _.extend() নতুন কপি তৈরি করতে ব্যবহৃত হয়।

উদাহরণ:

var original = { name: 'John', age: 30 };
var cloned = _.clone(original);
cloned.age = 35;

console.log(original); // { name: 'John', age: 30 }
console.log(cloned);   // { name: 'John', age: 35 }

এখানে, _.clone() ফাংশনটি অবজেক্টটির একটি নতুন কপি তৈরি করে, যা মূল অবজেক্টকে অপরিবর্তিত রাখে। এটি immutability প্যাটার্ন অনুসরণ করে।


৫. Lazy Evaluation

Lazy Evaluation হল একটি কৌশল যেখানে কোনো অপারেশন কেবলমাত্র তখনই করা হয় যখন তার প্রয়োজন হয়। Underscore.js এ _.chain() ফাংশনটি lazy evaluation এর ধারণা প্রয়োগ করে। এটি একাধিক ফাংশন একত্রে চেইন করার জন্য ব্যবহার করা হয় এবং শেষের ফলাফলটি value() এর মাধ্যমে পাওয়া যায়।

উদাহরণ:

var result = _.chain([1, 2, 3, 4, 5])
  .filter(function(num) { return num % 2 === 0; })
  .map(function(num) { return num * 2; })
  .reduce(function(total, num) { return total + num; }, 0)
  .value();

console.log(result); // 12

এখানে, _.chain() এর মাধ্যমে আমরা একাধিক ফাংশন একত্রে প্রয়োগ করেছি এবং শেষের ফলাফলটি .value() দিয়ে গ্রহণ করেছি। এটি lazy evaluation এর মাধ্যমে কোডের কার্যকরীতা বাড়ায়।


সারাংশ

Underscore.js ফাংশনাল প্রোগ্রামিং প্যাটার্নের জন্য একটি শক্তিশালী লাইব্রেরি, যা JavaScript ডেভেলপারদের জন্য একাধিক ফাংশনাল অপারেশন সহজ করে তোলে। Higher-Order Functions, Pure Functions, Immutability, Function Composition, এবং Lazy Evaluation এইসব কৌশলগুলির মাধ্যমে কোড আরও পরিষ্কার, কার্যকরী এবং পুনঃব্যবহারযোগ্য হয়ে ওঠে। Underscore.js এর মাধ্যমে আপনি ফাংশনাল প্রোগ্রামিংয়ের আধুনিক ধারণাগুলিকে সহজে প্রয়োগ করতে পারেন, যা কোডের কার্যকারিতা এবং রিডেবিলিটি বৃদ্ধি করে।

Content added By

কনটেক্সট বাউন্ড ফাংশন (Context-Bound Functions)

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

_.bind() ফাংশনটি ব্যবহার করে আপনি একটি ফাংশনকে নির্দিষ্ট কনটেক্সটের সাথে বাঁধতে পারেন। তবে, যদি আপনি একাধিক ফাংশনকে একই কনটেক্সটের সাথে বাঁধতে চান, তাহলে _.bindAll() ব্যবহার করা সহজ এবং সুবিধাজনক।


_.bind() এর ব্যবহার

_.bind() ফাংশনটি JavaScript-এর bind() ফাংশনের মতো কাজ করে, যা একটি ফাংশনকে একটি নির্দিষ্ট কনটেক্সটের সাথে বাঁধে, এবং পরবর্তী সময়ে যখন সেই ফাংশনটি কল করা হয়, তখন তার this কনটেক্সট হবে সেই নির্দিষ্ট অবজেক্ট।

সিনট্যাক্স:

_.bind(func, context, *arguments);
  • func: যে ফাংশনটিকে কনটেক্সটের সাথে বাঁধতে হবে।
  • context: যে অবজেক্টের কনটেক্সট ব্যবহার করতে হবে।
  • *arguments: (অপশনাল) যে আর্গুমেন্টগুলো আপনি ফাংশনে পাস করতে চান।

উদাহরণ:

var person = {
  name: "John",
  greet: function() {
    console.log("Hello, " + this.name);
  }
};

// `greet` ফাংশনকে `person` অবজেক্টের সাথে বাঁধা
var greetPerson = _.bind(person.greet, person);
greetPerson(); // Output: Hello, John

এখানে, greet ফাংশনটি person অবজেক্টের this কনটেক্সটের সাথে বাঁধা হয়েছে, তাই যখন greetPerson() কল করা হয়, তখন এটি সঠিক this কনটেক্সট ব্যবহার করে "Hello, John" প্রিন্ট করবে।


_.bindAll() এর ব্যবহার

_.bindAll() একটি Underscore.js ফাংশন যা একসাথে অনেকগুলো ফাংশনকে একটি নির্দিষ্ট কনটেক্সটের সাথে বাঁধতে সাহায্য করে। যখন একটি অবজেক্টে অনেকগুলো মেথড থাকে, তখন _.bindAll() ব্যবহার করে আপনি সব মেথডগুলোকে একই this কনটেক্সটের সাথে বাঁধতে পারেন, যাতে কোন সমস্যা না হয়।

সিনট্যাক্স:

_.bindAll(object, *methodNames);
  • object: যেটি অবজেক্ট যেখানে সমস্ত মেথড বাঁধা হবে।
  • *methodNames: ফাংশন বা মেথডের নাম, যেগুলি আপনি কনটেক্সটের সাথে বাঁধতে চান।

উদাহরণ:

var person = {
  name: "John",
  greet: function() {
    console.log("Hello, " + this.name);
  },
  sayGoodbye: function() {
    console.log("Goodbye, " + this.name);
  }
};

// `greet` এবং `sayGoodbye` মেথডগুলোকে `person` অবজেক্টের সাথে বাঁধা
_.bindAll(person, 'greet', 'sayGoodbye');

// এখন `greet` এবং `sayGoodbye` মেথড সঠিক কনটেক্সটের সাথে কাজ করবে
person.greet();      // Output: Hello, John
person.sayGoodbye(); // Output: Goodbye, John

এখানে, greet এবং sayGoodbye উভয় ফাংশন person অবজেক্টের কনটেক্সটের সাথে বাঁধা হয়েছে, তাই যখন আপনি এই ফাংশনগুলো কল করবেন, তখন this.name সঠিকভাবে "John" রিটার্ন করবে।


_.bindAll এবং this কনটেক্সটের সমস্যা সমাধান

JavaScript-এ অনেক সময় আমরা this কনটেক্সট নিয়ে সমস্যায় পড়ি, বিশেষ করে যখন কোনো ফাংশনকে আর্গুমেন্ট হিসেবে পাস করি অথবা কলব্যাক ফাংশন ব্যবহার করি। _.bindAll() এর মাধ্যমে আপনি সহজেই এই ধরনের সমস্যা এড়িয়ে যেতে পারেন এবং একটি নির্দিষ্ট কনটেক্সটের সাথে ফাংশনগুলোকে বাঁধতে পারেন।

উদাহরণ (callback function):

var person = {
  name: "John",
  greet: function() {
    console.log("Hello, " + this.name);
  }
};

// `setTimeout` এর কনটেক্সটে `this` হারিয়ে যাবে, তবে `_.bindAll` ব্যবহার করলে সমস্যা সমাধান হবে
_.bindAll(person, 'greet');

// এখন `greet` ফাংশন সঠিক `this` কনটেক্সটের সাথে কাজ করবে
setTimeout(person.greet, 1000); // Output: Hello, John

এখানে, setTimeout ফাংশন কল করার সময় this হারিয়ে যাওয়ার সমস্যা ছিল। _.bindAll() ব্যবহার করে আমরা greet মেথডটি person অবজেক্টের this কনটেক্সটের সাথে বাঁধলাম, যার ফলে সেটি সঠিকভাবে কাজ করেছে।


সারাংশ

_.bindAll() এবং _.bind() দুটি শক্তিশালী ফাংশন যা আপনাকে JavaScript-এ this কনটেক্সটের সমস্যা সমাধান করতে সাহায্য করে। _.bind() একটি একক ফাংশনকে একটি নির্দিষ্ট কনটেক্সটের সাথে বাঁধতে ব্যবহৃত হয়, আর _.bindAll() একাধিক ফাংশনকে একই কনটেক্সটের সাথে বাঁধতে ব্যবহৃত হয়। এই দুটি ফাংশন ব্যবহার করে আপনি ফাংশনাল প্রোগ্রামিংয়ের দক্ষতা উন্নত করতে পারেন এবং কোডের স্থিতিশীলতা বজায় রাখতে পারেন।

Content added By

Underscore.js টেমপ্লেটিং কি?

Underscore.js একটি জনপ্রিয় JavaScript লাইব্রেরি, যা ফাংশনাল প্রোগ্রামিং এবং ইউটিলিটি ফাংশন সরবরাহের পাশাপাশি একটি শক্তিশালী টেমপ্লেটিং সিস্টেমও প্রদান করে। এর টেমপ্লেট ফাংশন আপনাকে HTML টেমপ্লেটগুলি ডায়নামিকভাবে তৈরি এবং রেন্ডার করতে সাহায্য করে। এটি কোড এবং কন্টেন্টের মধ্যে একটি শক্তিশালী সংযোগ তৈরি করতে পারে, যাতে আপনার ওয়েব অ্যাপ্লিকেশনগুলি আরও কার্যকর এবং স্কেলেবল হয়।

Underscore.js টেমপ্লেটিং একটি সহজ এবং কার্যকরী উপায়, যা HTML এবং JavaScript ডেটার মধ্যে ডাইনামিক কনটেন্ট প্রয়োগ করতে ব্যবহৃত হয়।


Underscore.js এর টেমপ্লেটিং ফাংশন

Underscore.js টেমপ্লেটিং ফাংশনটি একটি string আর্গুমেন্ট হিসাবে HTML কোড নেয় এবং একটি data object পাঠানোর মাধ্যমে সেই HTML টেমপ্লেটের মধ্যে ডাইনামিক ডেটা ইনজেক্ট করে। এটি মূলত <%= %> সিনট্যাক্স ব্যবহার করে, যেখানে আপনি ভেরিয়েবল এবং এক্সপ্রেশন ইনজেক্ট করতে পারেন।


Underscore.js টেমপ্লেটিং এর মূল ফিচার

  1. ডায়নামিক ডেটা বেঁধে ফেলা: টেমপ্লেটের মধ্যে ডাইনামিক ডেটা প্রবাহিত করার জন্য Underscore.js এক্সপ্রেশন ব্যবহার করে, যেমন model.property
  2. টেমপ্লেটের এক্সপ্রেশন: Underscore.js টেমপ্লেটিং <%= %> ব্যবহার করে HTML কন্টেন্টের মধ্যে JavaScript এক্সপ্রেশন প্রয়োগ করতে সাহায্য করে।
  3. অফসেট এক্সপ্রেশন: <%- %> ব্যবহার করে কোডকে HTML-এর ভ্যালিড কনটেন্ট হিসেবে ইনজেক্ট করা যায়, এটি নিরাপদে অপ্রয়োজনীয় কোড স্ট্রিং এক্সপ্রেশনগুলো সরিয়ে দেয়।

Underscore.js টেমপ্লেটিং উদাহরণ

১. মৌলিক টেমপ্লেটিং:

<!DOCTYPE html>
<html>
<head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.13.1/underscore-min.js"></script>
</head>
<body>
    <div id="content"></div>

    <script>
        var data = {
            name: "John",
            age: 30
        };

        var template = "<h1>Hello, <%= name %>!</h1><p>Your age is: <%= age %></p>";
        
        // Underscore.js টেমপ্লেট কম্পাইল করা হচ্ছে
        var compiledTemplate = _.template(template);

        // টেমপ্লেট রেন্ডার করা হচ্ছে
        document.getElementById('content').innerHTML = compiledTemplate(data);
    </script>
</body>
</html>

এখানে, _.template() ব্যবহার করে একটি HTML টেমপ্লেট তৈরি করা হয়েছে, যেখানে <%= %> সিনট্যাক্সের মাধ্যমে ডেটা ইনজেক্ট করা হচ্ছে। এই টেমপ্লেটটি name এবং age প্রপার্টি সহ data অবজেক্টটি ব্যবহার করে রেন্ডার করা হচ্ছে।

২. নিরাপদ HTML ইনজেকশন (Escaping HTML):

Underscore.js এর <%- %> সিনট্যাক্স ব্যবহার করে আপনি HTML ইনজেকশন থেকে রক্ষা পেতে পারেন, যা কিছু HTML স্পেশাল ক্যারেক্টারকে এনকোড করে।

<!DOCTYPE html>
<html>
<head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.13.1/underscore-min.js"></script>
</head>
<body>
    <div id="content"></div>

    <script>
        var data = {
            userInput: "<script>alert('XSS Attack');</script>"
        };

        var template = "<h1>User Input: <%- userInput %></h1>";

        var compiledTemplate = _.template(template);

        document.getElementById('content').innerHTML = compiledTemplate(data);
    </script>
</body>
</html>

এখানে, <%- %> ব্যবহার করা হয়েছে যাতে HTML ইনজেকশন থেকে রক্ষা পায় এবং স্ক্রিপ্ট ট্যাগ সঠিকভাবে এনকোড হয়ে যায়।

৩. অ্যারে রেন্ডারিং:

Underscore.js টেমপ্লেটিং সহজেই অ্যারে এবং লিস্ট রেন্ডার করতে সহায়তা করে।

<!DOCTYPE html>
<html>
<head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.13.1/underscore-min.js"></script>
</head>
<body>
    <div id="content"></div>

    <script>
        var data = {
            users: [
                {name: "John", age: 30},
                {name: "Jane", age: 25},
                {name: "Mike", age: 35}
            ]
        };

        var template = "<ul><% _.each(users, function(user) { %><li><%= user.name %> is <%= user.age %> years old</li><% }); %></ul>";

        var compiledTemplate = _.template(template);

        document.getElementById('content').innerHTML = compiledTemplate(data);
    </script>
</body>
</html>

এখানে, _.each() ব্যবহার করে users অ্যারে এর প্রতিটি উপাদানকে টেমপ্লেটে রেন্ডার করা হয়েছে, যা একটি লিস্টে পরিণত হয়।

৪. কন্ডিশনাল লজিক (Conditional Logic):

Underscore.js টেমপ্লেটিংয়ের মধ্যে কন্ডিশনাল লজিক প্রয়োগ করা সম্ভব। যেমন, আপনি যদি কোনও শর্ত পূর্ণ না হলে একটি নির্দিষ্ট HTML উপাদান প্রদর্শন না করতে চান।

<!DOCTYPE html>
<html>
<head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.13.1/underscore-min.js"></script>
</head>
<body>
    <div id="content"></div>

    <script>
        var data = {
            isAuthenticated: true,
            userName: "John"
        };

        var template = "<% if (isAuthenticated) { %><h1>Welcome, <%= userName %>!</h1><% } else { %><h1>Please log in</h1><% } %>";

        var compiledTemplate = _.template(template);

        document.getElementById('content').innerHTML = compiledTemplate(data);
    </script>
</body>
</html>

এখানে, কন্ডিশনাল লজিক ব্যবহার করে যদি isAuthenticated true হয়, তবে ব্যবহারকারীর নাম এবং ওয়েলকাম মেসেজ প্রদর্শিত হবে, আর যদি false হয়, তবে "Please log in" মেসেজ দেখানো হবে।


Underscore.js এর টেমপ্লেটিং এর সুবিধা

  1. সহজ এবং দ্রুত: Underscore.js এর টেমপ্লেটিং সিস্টেম HTML এবং JavaScript কোডের মধ্যে দ্রুত সংযোগ তৈরি করতে সাহায্য করে, যা সময় সাশ্রয়ী।
  2. সহজ শর্ত এবং লুপ: _.each() এবং কন্ডিশনাল স্টেটমেন্টের মাধ্যমে টেমপ্লেটিং খুব সহজভাবে করতে পারা যায়।
  3. নিরাপত্তা: <%- %> সিনট্যাক্স ব্যবহারের মাধ্যমে HTML ইনজেকশন থেকে রক্ষা পাওয়া যায়, যা নিরাপত্তার জন্য গুরুত্বপূর্ণ।
  4. এবং আরও অনেক ফাংশন: Underscore.js এর টেমপ্লেটিং আরও অনেক শক্তিশালী ফিচার প্রদান করে, যেমন এক্সপ্রেশন, ডেটা ম্যানিপুলেশন এবং ফাংশনাল প্রোগ্রামিং।

সারাংশ

Underscore.js এর টেমপ্লেটিং সিস্টেম খুবই শক্তিশালী এবং সহজ। এটি HTML টেমপ্লেটের মধ্যে ডাইনামিক ডেটা ইনজেক্ট করতে সহায়তা করে এবং কোডের মাঝে কার্যকরী সংযোগ তৈরি করতে সাহায্য করে। এতে _.each(), _.template(), এবং <%- %> এর মতো ফাংশনাল ফিচার রয়েছে যা আপনার ওয়েব অ্যাপ্লিকেশনগুলিকে আরও ডায়নামিক এবং কার্যকরী করে তোলে।

Content added By
Promotion

Are you sure to start over?

Loading...