জাভাস্ক্রিপ্টে ক্লাসগুলির অতিরিক্ত বৈশিষ্ট্য

জাভাস্ক্রিপ্টে ক্লাসগুলির অতিরিক্ত বৈশিষ্ট্য

এই নিবন্ধে, আমরা জাভাস্ক্রিপ্টে ক্লাসগুলির অতিরিক্ত বৈশিষ্ট্যগুলি ব্যাখ্যা করব।

YouTube Video

জাভাস্ক্রিপ্টে ক্লাসগুলির অতিরিক্ত বৈশিষ্ট্য

জাভাস্ক্রিপ্টে ব্যক্তিগত প্রোপার্টি

জাভাস্ক্রিপ্টে, ব্যক্তিগত প্রোপার্টি হল প্রোপার্টি যা শুধুমাত্র অবজেক্ট বা ক্লাসের ভিতরেই অ্যাক্সেসযোগ্য। এটি এনক্যাপ্সুলেশন এর মাধ্যমে আরও নিরাপদ এবং মজবুত কোড ডিজাইন সক্ষম করে, যার ফলে বাহ্যিক কোড থেকে সরাসরি পরিবর্তন বা রেফারেন্স সম্ভব নয়।

ECMAScript 2020 (ES11)-এ ২০২০ সালে প্রবর্তন করা হয়েছিল, যেখানে # (হ্যাশ) ব্যবহার করে ক্লাসের ভিতরে ব্যক্তিগত ফিল্ড সংজ্ঞায়িত করা হয়। এটি আরও স্বচ্ছ একটি পদ্ধতি প্রদান করে, যা জাভাস্ক্রিপ্টের ঐতিহ্যগত ব্যক্তিগত কনভেনশনগুলিকে (যেমন আন্ডারস্কোর দিয়ে শুরু হওয়া ভেরিয়েবল নাম) প্রতিস্থাপন করে।

ব্যক্তিগত প্রোপার্টির সুবিধা

ব্যক্তিগত সম্পত্তির সুবিধাগুলি নিম্নরূপ।

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

ব্যক্তিগত প্রোপার্টিগুলি কীভাবে ব্যবহার করবেন

ক্লাসে ব্যক্তিগত প্রোপার্টি সংজ্ঞায়িত করা

ব্যক্তিগত ফিল্ডগুলি # দিয়ে শুরু করা একটি নাম ব্যবহার করে সংজ্ঞায়িত করা হয়। এই ফিল্ডটি ক্লাস বা তার সাবক্লাসগুলির ইনস্ট্যান্স থেকে সরাসরি অ্যাক্সেস করা যায় না।

 1class Person {
 2    // Define private property
 3    #name;
 4
 5    constructor(name) {
 6        this.#name = name;
 7    }
 8
 9    // Method to access the private property
10    getName() {
11        return this.#name;
12    }
13
14    // Method to change the private property
15    setName(newName) {
16        this.#name = newName;
17    }
18}
19
20const john = new Person("John");
21console.log(john.getName()); // John
22
23// Cannot access private property directly
24console.log(john.#name); // SyntaxError: Private field '#name' must be declared in an enclosing class

উপরের কোডে, #name একটি ব্যক্তিগত প্রোপার্টি যা Person ক্লাসের বাইরে থেকে সরাসরি অ্যাক্সেস করা যায় না। আপনি শুধুমাত্র getName এবং setName পদ্ধতিগুলির মাধ্যমে নাম অ্যাক্সেস বা পরিবর্তন করতে পারেন।

ব্যক্তিগত মেথড সংজ্ঞায়িত করা

ব্যক্তিগত প্রোপার্টির মতো, ব্যক্তিগত মেথডগুলিও # দিয়ে শুরু করা নাম ব্যবহার করে সংজ্ঞায়িত করা হয়। ব্যক্তিগত মেথড শুধুমাত্র ক্লাসের ভিতর থেকে ডাকা যেতে পারে।

 1class Counter {
 2    #count = 0;
 3
 4    increment() {
 5        this.#count++;
 6        this.#logCount(); // Calling private method
 7    }
 8
 9    // Private method
10    #logCount() {
11        console.log(`Current count: ${this.#count}`);
12    }
13}
14
15const counter = new Counter();
16counter.increment(); // Current count: 1
17
18// Cannot access private method directly
19counter.#logCount(); // SyntaxError: Private field '#logCount' must be declared in an enclosing class

এখানে, #logCount একটি ব্যক্তিগত মেথড হিসেবে সংজ্ঞায়িত করা হয়েছে এবং এটি ক্লাসের বাইরে থেকে অ্যাক্সেস করা যায় না। এই মেথডটি শুধুমাত্র ক্লাসের ভিতরেই ব্যবহৃত হয়।

ব্যক্তিগত প্রোপার্টির সুবিধা ও বিবেচনা

সুবিধা

  • ক্লাসের বাইরে থেকে সরাসরি অ্যাক্সেস করা সম্ভব নয় বলে অনিচ্ছাকৃত পরিবর্তন বা অপারেশন প্রতিরোধ করা যায়।
  • বাইরে থেকে অদৃশ্য অংশগুলো ভালভাবে লুকানো যায়, ফলে API হিসেবে প্রকাশিত অংশগুলো স্পষ্টভাবে পরিচালনা করা সম্ভব।

নোটস

  • প্রাইভেট ফিল্ডগুলো ক্লাসের বাইরে থেকে সম্পূর্ণ লুকানো থাকে বলে টেস্টিং এবং ডিবাগিং কঠিন হতে পারে। সুতরাং, এমন একটি API প্রদান করা গুরুত্বপূর্ণ যা ডিজাইন পর্যায়ে সম্পূর্ণরূপে টেস্ট করা যায়।
  • প্রাইভেট ফিল্ডগুলো প্রোটোটাইপ ভিত্তিক বৈশিষ্ট্যসহ জাভাস্ক্রিপ্টের অন্যান্য অংশ থেকে ভিন্ন আচরণ করে কারণ এগুলো প্রতিটি ইনস্ট্যান্সের জন্য অনন্য।

প্রাইভেট প্রপার্টির ঐতিহ্যবাহী ছদ্মনামযুক্ত বাস্তবায়ন

# ব্যবহার করে প্রাইভেট ফিল্ড প্রবর্তনের আগে, জাভাস্ক্রিপ্টে প্রাইভেট প্রপার্টির জন্য কোনও আনুষ্ঠানিক সিনট্যাক্স ছিল না। তাই, অতীতে ছদ্ম-প্রাইভেট প্রপার্টিগুলো নিচের উপায়ে বাস্তবায়িত হয়েছিল।

আন্ডারস্কোর ব্যবহার করার প্রচলন

ডেভেলপাররা প্রচলিতভাবে ভ্যারিয়েবল নামের শুরুতে আন্ডারস্কোর বসিয়ে 'প্রাইভেট' নির্দেশ করতেন।

 1class Car {
 2    constructor(brand) {
 3        this._brand = brand; // Using an underscore to indicate private
 4    }
 5
 6    getBrand() {
 7        return this._brand;
 8    }
 9}
10
11const car = new Car("Toyota");
12console.log(car.getBrand()); // Toyota
13console.log(car._brand); // Toyota (Accessible from outside)

এই পদ্ধতিটি কেবল একটি 'প্রচলন,' এবং বাস্তবে, প্রপার্টিগুলো এখনও বাইরে থেকে অ্যাক্সেসযোগ্য থাকে।

ক্লোজার ব্যবহার করে প্রাইভেট প্রপার্টি বাস্তবায়ন

ফাংশনের স্কোপে ক্লোজার ব্যবহার করেও প্রাইভেট প্রপার্টি অর্জন করা সম্ভব।

 1function createPerson(name) {
 2    let _name = name; // Private variable within function scope
 3
 4    return {
 5        getName: function() {
 6            return _name;
 7        },
 8        setName: function(newName) {
 9            _name = newName;
10        }
11    };
12}
13
14const person = createPerson("Alice");
15console.log(person.getName()); // Alice
16person.setName("Bob");
17console.log(person.getName()); // Bob
18
19// Cannot access directly from outside
20console.log(person._name); // undefined

এই পদ্ধতিতে, ভ্যারিয়েবল _name ফাংশন স্কোপের মধ্যে আবদ্ধ থাকে এবং বাইরে থেকে সরাসরি অ্যাক্সেস করা যায় না।

সারসংক্ষেপ

জাভাস্ক্রিপ্টে প্রাইভেট প্রপার্টি ক্লাস এবং অবজেক্ট ডিজাইনে ইনক্যাপসুলেশন প্রদান করতে অত্যন্ত কার্যকর, যা ডেটা নিরাপদে সংরক্ষণে সহায়তা করে। ES2020 এ প্রাইভেট ফিল্ডের জন্য প্রবর্তিত # নোটেশন প্রচলিত পদ্ধতি এবং ক্লোজারের তুলনায় স্পষ্ট এবং আরও নিরাপদ গোপনীয়তা ব্যবস্থাপনা প্রদান করে।

জাভাস্ক্রিপ্টে ঐচ্ছিক চেইনিং

ঐচ্ছিক চেইনিং জাভাস্ক্রিপ্টে গভীরভাবে বসানো অবজেক্টের প্রপার্টিগুলো অ্যাক্সেস করার জন্য একটি অত্যন্ত কার্যকর সিনট্যাক্স। এটি নির্দিষ্ট প্রপার্টিগুলোর অস্তিত্ব পৃথকভাবে যাচাই না করেও সুরক্ষিত অ্যাক্সেস প্রদান করে কোডের পঠনযোগ্যতা এবং সংস্করণক্ষমতা বৃদ্ধি করে।

ঐচ্ছিক চেইনিংয়ের মৌলিক সিনট্যাক্স

প্রোপার্টি অ্যাক্সেসের জন্য ব্যবহৃত ডট (.) বা ব্র্যাকেট নোটেশনের আগে ? বসিয়ে ঐচ্ছিক চেইনিং ব্যবহার করা যেতে পারে। এই নোটেশনটি null বা undefined প্রোপার্টি আসলে undefined রিটার্ন করে, যা প্রোগ্রামকে কোনও ত্রুটি ছাড়াই সুরক্ষিতভাবে প্রসেস চালিয়ে যেতে দেয়।

উদাহরণ:

 1const user = {
 2    name: 'John',
 3    address: {
 4        street: '123 Main St',
 5        city: 'New York'
 6    }
 7};
 8
 9// Without using optional chaining
10const city = user && user.address && user.address.city;
11console.log(city);  // New York
12
13// Using optional chaining
14const cityWithOptionalChaining = user?.address?.city;
15console.log(cityWithOptionalChaining);  // New York

এই উদাহরণে, আমরা user অবজেক্টের address এবং তার city প্রোপার্টি অ্যাক্সেস করছি। ঐচ্ছিক চেনিং ব্যবহার না করলে, আপনাকে একাধিক অস্তিত্ব পরীক্ষা করতে হবে, কিন্তু ঐচ্ছিক চেনিং এর মাধ্যমে একটি একক বিবৃতি ব্যবহার করেই সম্পত্তিতে নিরাপদে প্রবেশ করতে পারেন।

এরে এবং ফাংশনের সাথে ঐচ্ছিক চেনিং ব্যবহার

ঐচ্ছিক চেনিং কেবলমাত্র অবজেক্টের সম্পত্তির জন্য নয়, এরে উপাদান এবং ফাংশন কলের জন্যও প্রযোজ্য।

এরে সহ উদাহরণঃ

1const users = [{ name: 'Alice' }, { name: 'Bob' }];
2
3// Accessing the non-existent third element
4const thirdUser = users[2]?.name;
5console.log(thirdUser);  // undefined

ফাংশন সহ উদাহরণঃ

 1const user = {
 2    greet: function() {
 3        return 'Hello!';
 4    }
 5};
 6
 7// Call the function only if greet exists
 8const greeting = user.greet?.();
 9console.log(greeting);  // Hello!
10
11// Return undefined if greet does not exist
12const nonExistentGreeting = user.nonExistentMethod?.();
13console.log(nonExistentGreeting);  // undefined

ঐচ্ছিক চেনিং এবং ডিফল্ট মানের সংমিশ্রণ

ঐচ্ছিক চেনিং ব্যবহার করার সময়, ডিফল্ট মান নির্ধারণের জন্য সাধারণত লজিকাল OR (||) বা নালিশ কোয়েলাসিং অপারেটর (??) ব্যবহার করা হয় যখন কোনও সম্পত্তি বিদ্যমান না থাকে।

উদাহরণ:

 1const user = {
 2    name: 'John',
 3    address: {
 4        city: 'New York'
 5    }
 6};
 7
 8// Set a default value for a non-existent property
 9const state = user?.address?.state || 'Unknown';
10console.log(state);  // Unknown
11
12// Example using the nullish coalescing operator
13const zipCode = user?.address?.zipCode ?? '00000';
14console.log(zipCode);  // 00000

|| অপারেটর false, 0, '' প্রভৃতিকে ফালসি হিসেবে বিবেচনা করে, পক্ষান্তরে ?? অপারেটর কেবল ডিফল্ট মান ব্যবহার করে যদি অপারেন্ড null বা undefined হয়।

ঐচ্ছিক চেনিং এর সুবিধাসমূহ

  • নেস্টেড অবজেক্টে নিরাপদ প্রবেশাধিকার: ঐচ্ছিক চেনিং ব্যবহার করে, আপনাকে আর স্পষ্ট অস্তিত্ব পরীক্ষা করতে হবে না, যা কোডকে আরো সংক্ষিপ্ত করে।
  • ত্রুটি পরিহার: এটি রানটাইম ত্রুটি প্রতিরোধ করতে পারে, এমনকি যদি কোনও সম্পত্তি null বা undefined হয়।
  • উন্নত পাঠযোগ্যতা এবং রক্ষণাবেক্ষণ যোগ্যতা: বিশেষ করে যখন অনেক নেস্টেড অবজেক্ট নিয়ে কাজ করা হয়, কোডের পাঠযোগ্যতা উল্লেখযোগ্যভাবে বৃদ্ধি পায়।

ঐচ্ছিক চেনিং ব্যবহারে সতর্কতা

  • ঐচ্ছিক চেনিং এর ঘন ঘন ব্যবহার নির্দেশ করতে পারে যে ডেটা স্ট্রাকচারের ডিজাইন অতিরিক্ত জটিল। আপনার একটি সহজতর ডেটা মডেলের জন্য প্রচেষ্টা করা উচিত।
  • কারণ কিছু পুরনো ব্রাউজার এবং জাভাস্ক্রিপ্ট ইঞ্জিন এটি সমর্থন করে না, তাই আপনাকে পলিফিল বা ট্রান্সপাইলার ব্যবহার করতে হতে পারে।

উপসংহার

ঐচ্ছিক চেনিং একটি শক্তিশালী বৈশিষ্ট্য যা জাভাস্ক্রিপ্টে নেস্টেড অবজেক্টের সম্পত্তি এবং ফাংশনে নিরাপদ প্রবেশধিকার সহজতর করে। গভীরভাবে নেস্টেড ডেটা স্ট্রাকচার অ্যাক্সেস করার সময় এটি বিশেষভাবে কার্যকর, যা ত্রুটি প্রতিরোধ এবং কোডের উন্নত পাঠযোগ্যতায় সহায়তা করে।

আপনি আমাদের ইউটিউব চ্যানেলে ভিজ্যুয়াল স্টুডিও কোড ব্যবহার করে উপরের নিবন্ধটি অনুসরণ করতে পারেন। দয়া করে ইউটিউব চ্যানেলটিও দেখুন।

YouTube Video