ইমিউটেবিলিটি কার্যকরী প্রোগ্রামিংয়ের একটি মূল নীতি, এবং অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামগুলিতেও এটি অনেক কিছু দিতে পারে। একটি মিউটেবল অবজেক্ট হল এমন একটি অবজেক্ট যার অবস্থা তৈরির পরে পরিবর্তন করা যায়। একটি ইমিউটেবল অবজেক্ট হল এমন একটি অবজেক্ট যার অবস্থা তৈরির পরে পরিবর্তন করা যায় না।
জাভাস্ক্রিপ্টে ইমিউটেবল অবজেক্টের একটি উদাহরণ কী?
জাভাস্ক্রিপ্টে, কিছু বিল্ট-ইন টাইপ (সংখ্যা, স্ট্রিং) ইমিউটেবল, তবে কাস্টম অবজেক্টগুলি সাধারণত মিউটেবল হয়।
কিছু বিল্ট-ইন ইমিউটেবল জাভাস্ক্রিপ্ট অবজেক্ট হল Math, Date।
সাধারণ জাভাস্ক্রিপ্ট অবজেক্টে ইমিউটেবিলিটি যোগ/সিমুলেট করার কয়েকটি উপায় এখানে দেওয়া হল।
অবজেক্ট কনস্ট্যান্ট প্রপার্টিস
writable: false এবং configurable: false একত্রিত করে, আপনি মূলত একটি কনস্ট্যান্ট (পরিবর্তন করা যাবে না, পুনরায় সংজ্ঞায়িত করা যাবে না বা মুছে ফেলা যাবে না) একটি অবজেক্ট প্রপার্টি হিসাবে তৈরি করতে পারেন, যেমন:
let myObject = {};
Object.defineProperty(myObject, 'number', {
value: 42,
writable: false,
configurable: false,
});
console.log(myObject.number); // 42
myObject.number = 43;
console.log(myObject.number); // 42
এক্সটেনশন প্রতিরোধ করুন
আপনি যদি একটি অবজেক্টে নতুন প্রপার্টি যোগ করা থেকে বিরত রাখতে চান, কিন্তু অন্যথায় অবজেক্টের বাকি প্রপার্টিগুলিকে একা রাখতে চান, তবে Object.preventExtensions(...) কল করুন:
var myObject = {
a: 2,
};
Object.preventExtensions(myObject);
myObject.b = 3;
myObject.b; // undefined
নন-স্ট্রিক্ট মোডে, b তৈরি ব্যর্থ হয় নীরবভাবে। স্ট্রিক্ট মোডে, এটি একটি TypeError ছুঁড়ে দেয়।
সীল
Object.seal() একটি "সীল করা" অবজেক্ট তৈরি করে, যার অর্থ এটি একটি বিদ্যমান অবজেক্ট নেয় এবং মূলত তার উপর Object.preventExtensions() কল করে, তবে এর বিদ্যমান সমস্ত প্রপার্টিকে configurable: false হিসাবে চিহ্নিত করে।
সুতরাং, আপনি আর কোনো প্রপার্টি যোগ করতে পারবেন না, তবে আপনি কোনো বিদ্যমান প্রপার্টি পুনরায় কনফিগার বা মুছতে পারবেন না (যদিও আপনি এখনও তাদের মান পরিবর্তন করতে পারবেন)।
ফ্রিজ
Object.freeze() একটি হিমায়িত অবজেক্ট তৈরি করে, যার অর্থ এটি একটি বিদ্যমান অবজেক্ট নেয় এবং মূলত তার উপর Object.seal() কল করে, তবে এটি সমস্ত "ডেটা অ্যাক্সেসর" প্রপার্টিকে writable:false হিসাবে চিহ্নিত করে, যাতে তাদের মান পরিবর্তন করা না যায়।
এই পদ্ধতিটি অবজেক্টের জন্য আপনি যে সর্বোচ্চ স্তরের ইমিউটেবিলিটি অর্জন করতে পারেন তা হল, কারণ এটি অবজেক্টে বা এর সরাসরি কোনো প্রপার্টিতে কোনো পরিবর্তন প্রতিরোধ করে (যদিও, উপরে উল্লিখিত হিসাবে, কোনো রেফারেন্সকৃত অন্যান্য অবজেক্টের বিষয়বস্তু প্রভাবিত হয় না)।
var immutable = Object.freeze({});
একটি অবজেক্ট ফ্রিজ করা একটি অবজেক্টে নতুন প্রপার্টি যোগ করার অনুমতি দেয় না এবং বিদ্যমান প্রপার্টিগুলি সরানো বা পরিবর্তন করা থেকে বিরত থাকে। Object.freeze() অবজেক্টের এনুমেরেবিলিটি, কনফিগারাবিলিটি, রাইটেবিলিটি এবং প্রোটোটাইপ সংরক্ষণ করে। এটি পাস করা অবজেক্টটি ফেরত দেয় এবং একটি হিমায়িত কপি তৈরি করে না।
ইমিউটেবিলিটির সুবিধা এবং অসুবিধা কী?
সুবিধা
- পরিবর্তন সনাক্তকরণ সহজ - অবজেক্টের সমতা রেফারেনশিয়াল ইকুয়ালিটির মাধ্যমে কার্যকর এবং সহজে নির্ধারণ করা যায়। এটি React এবং Redux এ অবজেক্টের পার্থক্য তুলনা করার জন্য দরকারী।
- ইমিউটেবল অবজেক্ট সহ প্রোগ্রামগুলি সম্পর্কে চিন্তা করা কম জটিল, কারণ আপনাকে একটি অবজেক্ট সময়ের সাথে কীভাবে বিকশিত হতে পারে তা নিয়ে চিন্তা করতে হবে না।
- যখন ইমিউটেবল অবজেক্টগুলি ফাংশন থেকে ফেরত আসে বা ফাংশনে পাস করা হয় তখন প্রতিরক্ষামূলক কপিগুলির আর প্রয়োজন হয় না, কারণ একটি ইমিউটেবল অবজেক্ট এর দ্বারা পরিবর্তিত হওয়ার কোনো সম্ভাবনা থাকে না।
- রেফারেন্সের মাধ্যমে সহজ শেয়ারিং - একটি অবজেক্টের একটি কপি অন্যটির মতোই ভালো, তাই আপনি অবজেক্ট ক্যাশ করতে পারেন বা একই অবজেক্ট একাধিকবার পুনরায় ব্যবহার করতে পারেন।
- থ্রেড-নিরাপদ - ইমিউটেবল অবজেক্টগুলি একটি মাল্টি-থ্রেডেড পরিবেশে থ্রেডগুলির মধ্যে নিরাপদে ব্যবহার করা যেতে পারে কারণ অন্যান্য সমান্তরালভাবে চলমান থ্রেডগুলিতে তাদের পরিবর্তিত হওয়ার কোনো ঝুঁকি নেই।
- ImmutableJS-এর মতো লাইব্রেরি ব্যবহার করে, অবজেক্টগুলি স্ট্রাকচারাল শেয়ারিং ব্যবহার করে পরিবর্তিত হয় এবং একই কাঠামোর একাধিক অবজেক্টের জন্য কম মেমরি প্রয়োজন হয়।
অসুবিধা
- ইমিউটেবল ডেটা স্ট্রাকচার এবং এর অপারেশনগুলির সরল বাস্তবায়ন অত্যন্ত খারাপ পারফরম্যান্সের কারণ হতে পারে কারণ প্রতিবার নতুন অবজেক্ট তৈরি হয়। স্ট্রাকচারাল শেয়ারিং ব্যবহার করে দক্ষ ইমিউটেবল ডেটা স্ট্রাকচার এবং অপারেশনগুলির জন্য লাইব্রেরি ব্যবহার করার সুপারিশ করা হয়।
- বিদ্যমান অবজেক্টগুলি পরিবর্তন না করে অনেক ছোট অবজেক্ট বরাদ্দ (এবং বরাদ্দ বাতিল) করা কর্মক্ষমতার উপর প্রভাব ফেলতে পারে। অ্যালোকেটর বা গারবেজ কালেক্টরের জটিলতা সাধারণত হিপে অবজেক্টের সংখ্যার উপর নির্ভর করে।
- গ্রাফের মতো সাইক্লিক ডেটা স্ট্রাকচার তৈরি করা কঠিন। যদি আপনার দুটি অবজেক্ট থাকে যা ইনিশিয়ালাইজেশনের পরে পরিবর্তন করা যায় না, তবে আপনি কীভাবে সেগুলিকে একে অপরের দিকে নির্দেশ করতে পারেন?
আপনার নিজের কোডে আপনি কীভাবে ইমিউটেবিলিটি অর্জন করতে পারেন?
বিকল্প হল const ঘোষণাগুলি উপরের উল্লেখিত কৌশলগুলির সাথে একত্রিত করে তৈরি করা। অবজেক্ট "মিউটেট" করার জন্য, আসল অবজেক্ট পরিবর্তন না করে নতুন অবজেক্ট তৈরি করতে স্প্রেড অপারেটর, Object.assign, Array.concat() ইত্যাদি ব্যবহার করুন।
উদাহরণ:
// অ্যারে উদাহরণ
const arr = [1, 2, 3];
const newArr = [...arr, 4]; // [1, 2, 3, 4]
// অবজেক্ট উদাহরণ
const human = Object.freeze({ race: 'human' });
const john = { ...human, name: 'John' }; // {race: "human", name: "John"}
const alienJohn = { ...john, race: 'alien' }; // {race: "alien", name: "John"}