Object Oriented Programming-এ Abstraction বা বিমূর্তন হলো কোনো object-এর প্রয়োজনীয় বৈশিষ্ট্য ও কাজগুলো দেখানো এবং অপ্রয়োজনীয় অভ্যন্তরীণ বিস্তারিত তথ্য আড়াল করার ধারণা।
সহজভাবে বললে, ব্যবহারকারীকে object কীভাবে কাজ করে তার সব ভেতরের বিষয় না দেখিয়ে শুধু প্রয়োজনীয় interface বা method ব্যবহার করার সুযোগ দেওয়া হয়। JavaScript-এ class ও method ব্যবহার করে এই ধারণাটি বাস্তবায়ন করা যায়।
Abstraction = প্রয়োজনীয় বিষয় প্রকাশ + অপ্রয়োজনীয় implementation details আড়াল।উদাহরণ হিসেবে একটি ATM ব্যবহার করার সময় আমরা টাকা তোলার নিয়ম জানি, কিন্তু ATM-এর ভিতরে ব্যাংকের server-এর সঙ্গে কীভাবে যোগাযোগ হচ্ছে তা জানতে হয় না।
class ATM { withdraw(amount) { return "টাকা উত্তোলন করা হয়েছে"; } } const atm = new ATM(); console.log(atm.withdraw(500));
JavaScript-এর class ব্যবহার করে এমন method তৈরি করা যায় যেগুলো object-এর প্রয়োজনীয় কাজকে প্রকাশ করে। ব্যবহারকারী সেই method কল করবে, কিন্তু method-এর ভেতরের কাজের প্রতিটি ধাপ জানতে হবে না।
এখানে process() method-টি ব্যবহারকারীর জন্য একটি সহজ interface হিসেবে কাজ করছে।
class-এর public method-কে abstraction-এর একটি সহজ উদাহরণ হিসেবে ব্যবহার করা যায়।নিচের উদাহরণে process() কল করলেই ব্যবহারকারী ফলাফল পাচ্ছে।
class Computer { process() { this.start(); return "Processing complete"; } start() { console.log("Computer started"); } } const computer = new Computer(); console.log(computer.process());
আধুনিক JavaScript-এ class-এর private field তৈরি করতে নামের শুরুতে # ব্যবহার করা যায়। এই private member class-এর বাইরে সরাসরি access করা যায় না।
এটি implementation-এর কিছু অংশ object-এর বাইরের code থেকে আড়াল করতে সাহায্য করে এবং abstraction-এর ধারণাকে আরও শক্তিশালী করে।
Private field: #name — এটি class-এর বাইরে সরাসরি access করা যায় না।নিচের উদাহরণে #balance private field। বাইরে থেকে getBalance() method ব্যবহার করে balance জানা যাচ্ছে।
class Account { #balance = 1000; getBalance() { return this.#balance; } } const account = new Account(); console.log(account.getBalance());
শুধু field নয়, JavaScript class-এ private method-ও তৈরি করা যায়। private method-এর নামের শুরুতেও # ব্যবহার করা হয়।
এ ধরনের method সাধারণত class-এর অভ্যন্তরীণ কাজের জন্য রাখা হয় এবং বাইরে থেকে সরাসরি কল করা যায় না।
Private method-এর syntax: #methodName() { ... }নিচের উদাহরণে #calculate() একটি private method। বাইরে থেকে calculate() সরাসরি ব্যবহার না করে getResult() method ব্যবহার করা হচ্ছে।
class Result { #calculate(a, b) { return a + b; } getResult(a, b) { return this.#calculate(a, b); } } const result = new Result(); console.log(result.getResult(20, 30));
Getter একটি property-এর মতো করে method-এর ফলাফল ব্যবহার করার সুযোগ দেয়। এর মাধ্যমে object-এর ভিতরের data কীভাবে তৈরি হচ্ছে তা না দেখিয়ে প্রয়োজনীয় value প্রকাশ করা যায়।
Getter-এর আগে get keyword ব্যবহার করা হয়। বাইরে থেকে এটিকে method-এর মতো parentheses দিয়ে নয়, property-এর মতো access করা হয়।
Getter abstraction-এ calculated বা controlled data প্রকাশ করতে সুবিধাজনক।নিচে fullName getter firstName ও lastName থেকে পূর্ণ নাম তৈরি করছে।
class Person { constructor(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; } get fullName() { return this.firstName + " " + this.lastName; } } const person = new Person("Anik", "Chakraborty"); console.log(person.fullName);
Setter ব্যবহার করে কোনো property-তে value assign করার সময় নির্দিষ্ট logic প্রয়োগ করা যায়। ফলে object-এর data কীভাবে পরিবর্তন হবে তা নিয়ন্ত্রণ করা সম্ভব।
Setter-এর আগে set keyword ব্যবহার করা হয়। এটি abstraction-এর ক্ষেত্রে useful, কারণ বাইরে থেকে সাধারণ assignment-এর মতো কাজ করলেও ভিতরে validation বা অন্য logic চালানো যায়।
Setter = property value সেট করার সময় controlled logic প্রয়োগ।নিচের উদাহরণে age সেট করার সময় negative value গ্রহণ করা হচ্ছে না।
class User { #age = 0; set age(value) { if (value >= 0) { this.#age = value; } } get age() { return this.#age; } } const user = new User(); user.age = 25; console.log(user.age);
Abstraction-এর একটি গুরুত্বপূর্ণ বিষয় হলো complex operation-কে একটি সহজ method-এর মাধ্যমে প্রকাশ করা। ব্যবহারকারী শুধু method-এর নাম ও প্রয়োজনীয় parameter জানলেই কাজটি করতে পারে।
এতে application-এর অন্য অংশে একই complex logic বারবার লিখতে হয় না।
একটি পরিষ্কার method interface code-কে সহজ ও maintainable করতে সাহায্য করে।নিচের উদাহরণে buyProduct() method-এর ভিতরে price, quantity এবং discount-এর calculation রাখা হয়েছে।
class ShoppingCart { buyProduct(price, quantity, discount) { const total = price * quantity; return total - discount; } } const cart = new ShoppingCart(); console.log(cart.buyProduct(500, 2, 100));
JavaScript-এ Java বা C#-এর মতো আলাদা interface keyword নেই। তবে class-এর public method-গুলোকে একটি নির্দিষ্ট interface হিসেবে design করা যায়।
অর্থাৎ object ব্যবহারকারী কোন method ব্যবহার করবে এবং কী ধরনের input দেবে—এই বিষয়গুলো পরিষ্কার রাখা যায়, আর internal implementation class-এর ভিতরে রাখা যায়।
JavaScript-এ interface-এর ধারণা সাধারণত class, method এবং consistent API design-এর মাধ্যমে তৈরি করা হয়।নিচে Payment class-এর pay() method একটি সহজ public interface হিসেবে কাজ করছে।
class Payment { pay(amount) { this.validate(amount); return "Payment successful"; } validate(amount) { if (amount <= 0) { throw new Error("Invalid amount"); } } } const payment = new Payment(); console.log(payment.pay(1000));
Abstraction ব্যবহার করলে বড় program-কে সহজভাবে সংগঠিত করা যায়। ব্যবহারকারী বা অন্য code অংশকে অপ্রয়োজনীয় implementation details থেকে দূরে রাখা যায়।
বিশেষ করে বড় application-এ পরিষ্কার public methods এবং আলাদা internal logic রাখা code বোঝা, পরিবর্তন করা এবং maintain করা সহজ করতে পারে।
Abstraction-এর মূল লক্ষ্য হলো complexity কমিয়ে প্রয়োজনীয় functionality সহজভাবে প্রকাশ করা।যেমন একটি service-এর internal code পরিবর্তন হলেও public method একই থাকলে অন্য code-এ পরিবর্তনের প্রয়োজন কম হতে পারে।
class Printer { print(document) { this.#prepare(document); return "Document printed"; } #prepare(document) { console.log("Preparing: " + document); } } const printer = new Printer(); console.log(printer.print("Report.pdf"));
Abstraction এবং Encapsulation কাছাকাছি ধারণা হলেও এক নয়। Abstraction মূলত কী প্রয়োজনীয় বিষয় ব্যবহারকারীর কাছে প্রকাশ করা হবে তা নিয়ে কাজ করে। Encapsulation data ও implementation-কে class-এর মধ্যে সংগঠিত এবং নিয়ন্ত্রিত রাখার দিকে বেশি গুরুত্ব দেয়।
বাস্তব application-এ এই ধারণাগুলো একসঙ্গে ব্যবহার করা যায়। private field বা method দিয়ে internal data ও logic নিয়ন্ত্রণ করা এবং public method দিয়ে প্রয়োজনীয় functionality প্রকাশ করা একটি প্রচলিত পদ্ধতি।
মনে রাখুন: Abstraction focuses on what to expose; Encapsulation focuses on how data and implementation are contained and controlled.নিচের উদাহরণে #balance private রাখা হয়েছে এবং deposit() ও getBalance() public method হিসেবে প্রয়োজনীয় কাজ প্রকাশ করছে।
class BankAccount { #balance = 0; deposit(amount) { if (amount > 0) { this.#balance += amount; } } getBalance() { return this.#balance; } } const account = new BankAccount(); account.deposit(5000); console.log(account.getBalance());