Menu
7.8 জাভাস্ক্রিপ্টে প্রাইভেট প্রোপার্টি হাইড করা
অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং কনসেপ্টের সবচেয়ে গুরুত্বপূর্ণ টপিকগুলোর একটা হলো – internal ইন্টারফেস থেকে external ইন্টারফেসকে আলাদা করা। মানে কোডের কঠিন ইমপ্লিমেন্টেশন লজিকগুলোকে আলাদা করা এবং ইউজারকে শুধুমাত্র বাইরের ফাংশনালিটি দেখানো। যেকোনো সফটওয়্যার তৈরির ক্ষেত্রে আমাদের এই কনসেপ্ট জানা দরকার। চলুন একটা বাস্তব উদাহরণ দিয়ে বোঝা যাক। আমরা কফি মেশিনের সাথে সবাই পরিচিত। কফি বানানোর জন্য আমাদের সাধারণত কি করতে হয়? উপরে দিয়ে কফি, দুধ আর চিনি দিয়ে কয়েকটা বাটনে টিপ দিতে হয়, খুবই সহজ তাইনা? বাহির থেকে দেখতে খুব সিম্পল মনে হলেও ভিতরে দেখতে অনেকটা নিচের ছবির মতো। অনেক জটিল তাইনা? কিন্তু আমাদের কফি বানানোর জন্য ভিতরের এই জটিল কাজকর্ম জানার দরকার নেই। আমরা যদি মেশিনের উপরের কভার খুলে রাখি, তাহলে আমাদের জন্য অনেক কনফিউজিং হয়ে যাবে। প্রোগ্রামিং এ অবজেক্ট অনেকটা কফি মেশিনের মতোই। জটিল কাজকর্ম আমাদের প্রাইভেট করে রাখতে হয় যাতে ইউজাররা কনফিউজড না হয়ে যায় এবং চাইলেই ভিতরের জটিল লজিক পরিবর্তন করতে পারে না। অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এ, প্রোপার্টি আর মেথডকে সাধারণত দুই ভাগে ভাগ করা যায়ঃ Internal interface – যা ক্লাসের অন্যান্য মেথড থেকে এক্সেস করা যাবে, কিন্তু ক্লাসের বাইরে থেকে এক্সেস করা যাবেনা। Internal প্রোপার্টিকে private প্রোপার্টিও বলা হয়। External interface – ক্লাসের ভিতরে অথবা বাইরে, যেকোনো যায়গা থেকে এক্সেস করা যাবে। External প্রোপার্টিকে public প্রোপার্টিও বলা হয়। এগুলোকে আমরা আমাদের কফি মেশিনের সাথে তুলনা করতে পারি। ভিতরের জটিল মেশিন হলো internal ইন্টারফেস, আর বাইরের বাটন সুইচ এগুলা হলো external ইন্টারফেস। কিছু কিছু ল্যাঙ্গুয়েজে protected ফিল্ডও আছে। যা শুধুমাত্র ক্লাসের ভিতরে থেকে এবং যেসকল অবজেক্ট ক্লাস থেকে ইন্সট্যান্স তৈরি করে বানানো হয়েছে তারাই এক্সেস করতে পারবে। জাভাস্ক্রিপ্টে ল্যাংগুয়েজ লেভেলে protected ফিল্ড বলতে কিছু নেই। কিন্তু আমরা প্রায়ই protected ফিল্ড নিয়ে কাজ করব। Protected প্রোপার্টিগুলো সাধারণত _ (underscore) দিয়ে শুরু করা হয়। এটা কোনো বাধ্যতামূলক জিনিস না, কিন্তু জাভাস্ক্রিপ্ট প্রোগ্রামাররা এই নিয়ম মেনে চলে। নিচের কোডটি খেয়াল করি।class CoffeeMachine {
waterAmount = 0;
sugarAmount = 0;
constructor(power) {
this.power = power;
console.log(“Created a coffee machine with power: “+power)
}
}
// কফি মেশিন থেকে নতুন কফি অবজেক্ট তৈরি
let coffee = new CoffeeMachine(100);
// কফিতে পানির পরিমাণ
coffee.waterAmount = 200;
class CoffeeMachine {
waterAmount = 0;
_sugarAmount = 0;
set sugarAmount(value) {
if (value < 0) {
value = 0;
}
this._sugarAmount = value;
}
get sugarAmount(){
return this._sugarAmount;
}
constructor(power) {
this.power = power;
console.log(“Created a coffee machine with power: “+power)
}
}
// কফি মেশিন থেকে নতুন কফি অবজেক্ট তৈরি
let coffee = new CoffeeMachine(100);
// কফিতে চিনির পরিমাণ
coffee.sugarAmount = -100;
console.log(coffee.sugarAmount) // আউটপুটঃ 0
class CoffeeMachine {
#waterAmount = 0;
set setWaterAmount(value) {
this.#waterAmount = value;
}
}
let coffee = new CoffeeMachine();
coffee.setWaterAmount = 100;
coffee.#waterAmount; // SyntaxError: Private field ‘#waterAmount’ must be declared in an enclosing class
class CoffeeMachine {
#waterAmount = 0;
set waterAmount(value) {
this.#waterAmount = value;
}
get waterAmount() {
return this.#waterAmount;
}
}
let coffee = new CoffeeMachine();
coffee.waterAmount = 10;
console.log(coffee.waterAmount);
উদাহরণ-১:
class Person {#address;#mobile;constructor(name) {this.name = name;}setAddress(address) {this.#address = address;}setMobile(mobileNumber) {this.#mobile = mobileNumber;}getDetails() {console.log(`${this.name} from ${this.#address}, Mobile: ${this.#mobile}`);}}const teaBoy = new Person(‘Foyez’);console.log(teaBoy); // Person { name: ‘Foyez’ }teaBoy.setAddress(‘Sylhet’);teaBoy.setMobile(‘019502080’);teaBoy.getDetails(); // Foyez from Sylhet, Mobile: 019502080উদাহরণ-২:
class Student {#grade;constructor(name, roll) {this.name = name;this.roll = roll;}setGrade(grade) {this.#grade = grade;}getGrade() {return this.#grade;}}const rahim = new Student(‘Rahim’, 101);console.log(rahim); // Student { name: ‘Rahim’, roll: 101 }rahim.setGrade(‘A+’);console.log(rahim.getGrade()); // A+উদাহরণ-৩:
class Fund {#currentBalance = 0;set currentBalance(amount) {this.#currentBalance = amount;}get currentBalance() {return this.#currentBalance;}}const orphanageFund = new Fund();orphanageFund.currentBalance = 780450;console.log(‘Current balance: ‘, orphanageFund.currentBalance); // Current balance: 780450উদাহরণ-৪:
class Account {#balance = 0;constructor(initBalance) {this.#balance = initBalance;}deposite(amount) {this.#balance = this.#balance + amount;console.log(‘Current balance: ‘, this.#balance);}withdraw(amount) {this.#balance = this.#balance – amount;console.log(‘Current balance: ‘, this.#balance);}}const myBankAccount = new Account(14780920);myBankAccount.deposite(70500); // Current balance: 14851420myBankAccount.withdraw(2280500); // Current balance: 12570920
- একটি ক্লাসের প্রাইভেট প্রোপার্টি ডিফাইন করো এবং get/set মেথডের মাধ্যমে সেটার মানের পরিবর্তন করো।
- Friends নামে একটি ক্লাস তৈরি করো যেটার মধ্যে পাবলিক ফ্রেন্ড লিস্ট ও প্রাইভেট ফ্রেন্ড লিস্ট থাকবে এবং ঐ লিস্টগুলোতে ফ্রেন্ড যোগ করার মেথড তৈরি করো।
- এমন একটি ক্লাস তৈরি করো যার প্রাইভেট প্রোপার্টি দেখানো হবে কোন নির্দিষ্ট শর্ত সাপেক্ষে।
- ক্লাসের মধ্যে একটি প্রাইভেট মেথড ডিক্লেয়ার করো যেটার কার্য সম্পাদন করা হবে অন্য কোন পাবলিক মেথড দ্বারা।
- BkashAccount নামে একটি ক্লাস তৈরি করো যার একটি মেথডের মাধ্যমে প্রাইভেট ব্যালেন্স থেকে টাকা ট্রান্সফার করা যাবে।