টাইপস্ক্রিপ্ট OOP-এর উন্নত প্যাটার্নস অন্বেষণ করুন। এই গাইডটি ক্লাস ডিজাইন নীতি, ইনহেরিটেন্স বনাম কম্পোজিশন বিতর্ক এবং বিশ্বব্যাপী শ্রোতাদের জন্য পরিমাপযোগ্য, রক্ষণাবেক্ষণযোগ্য অ্যাপ্লিকেশন তৈরির ব্যবহারিক কৌশলগুলি কভার করে।
টাইপস্ক্রিপ্ট OOP প্যাটার্নস: ক্লাস ডিজাইন এবং ইনহেরিটেন্স স্ট্র্যাটেজির একটি গাইড
আধুনিক সফটওয়্যার ডেভেলপমেন্টের জগতে, টাইপস্ক্রিপ্ট শক্তিশালী, পরিমাপযোগ্য এবং রক্ষণাবেক্ষণযোগ্য অ্যাপ্লিকেশন তৈরির জন্য একটি ভিত্তি হিসাবে আবির্ভূত হয়েছে। জাভাস্ক্রিপ্টের উপরে নির্মিত এর শক্তিশালী টাইপিং সিস্টেম, ডেভেলপারদের ত্রুটিগুলি দ্রুত ধরতে এবং আরও অনুমানযোগ্য কোড লিখতে সরঞ্জাম সরবরাহ করে। টাইপস্ক্রিপ্টের শক্তির কেন্দ্রে রয়েছে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) নীতিগুলির জন্য এর ব্যাপক সমর্থন। তবে, কেবল একটি ক্লাস তৈরি করতে জানা যথেষ্ট নয়। টাইপস্ক্রিপ্ট আয়ত্ত করার জন্য ক্লাস ডিজাইন, ইনহেরিটেন্স হায়ারার্কি এবং বিভিন্ন আর্কিটেকচারাল প্যাটার্নের মধ্যে ট্রেড-অফগুলির গভীর জ্ঞান প্রয়োজন।
এই গাইডটি বিশ্বব্যাপী ডেভেলপারদের জন্য ডিজাইন করা হয়েছে, যারা তাদের মধ্যবর্তী দক্ষতা জোরদার করছেন তাদের থেকে শুরু করে অভিজ্ঞ স্থপতি পর্যন্ত। আমরা টাইপস্ক্রিপ্টে OOP-এর মূল ধারণাগুলির গভীরে প্রবেশ করব, কার্যকর ক্লাস ডিজাইন কৌশলগুলি অন্বেষণ করব এবং বয়স-পুরানো বিতর্কটি মোকাবেলা করব: ইনহেরিটেন্স বনাম কম্পোজিশন। শেষে, আপনি আরও পরিচ্ছন্ন, আরও নমনীয় এবং ভবিষ্যৎ-প্রমাণ কোডবেসের দিকে পরিচালিত জ্ঞাত ডিজাইন সিদ্ধান্তগুলি নেওয়ার জ্ঞানের সাথে সজ্জিত হবেন।
টাইপস্ক্রিপ্টে OOP-এর স্তম্ভগুলি বোঝা
আমরা জটিল প্যাটার্নগুলিতে যাওয়ার আগে, আসুন টাইপস্ক্রিপ্টে প্রযোজ্য চারটি মৌলিক OOP স্তম্ভগুলির একটি দৃঢ় ভিত্তি স্থাপন করে পুনরায় পরিদর্শন করি।
১. এনক্যাপসুলেশন
এনক্যাপসুলেশন হল একটি অবজেক্টের ডেটা (বৈশিষ্ট্য) এবং সেই ডেটাতে কাজ করা পদ্ধতিগুলিকে একটি একক ইউনিটে – একটি ক্লাস – বান্ডিল করার নীতি। এটি একটি অবজেক্টের অভ্যন্তরীণ অবস্থায় সরাসরি অ্যাক্সেস সীমাবদ্ধ করাও জড়িত। টাইপস্ক্রিপ্ট এটি প্রাথমিকভাবে অ্যাক্সেস মডিফায়ারগুলির মাধ্যমে অর্জন করে: public, private, এবং protected।
উদাহরণ: একটি ব্যাংক অ্যাকাউন্ট যেখানে ব্যালেন্স কেবল জমা এবং তোলার পদ্ধতিগুলির মাধ্যমে পরিবর্তন করা যেতে পারে।
class BankAccount {
private balance: number = 0;
constructor(initialBalance: number) {
if (initialBalance >= 0) {
this.balance = initialBalance;
}
}
public deposit(amount: number): void {
if (amount > 0) {
this.balance += amount;
console.log(`Deposited: ${amount}. New balance: ${this.balance}`);
}
}
public getBalance(): number {
// We expose the balance through a method, not directly
return this.balance;
}
}
২. অ্যাবস্ট্রাকশন
অ্যাবস্ট্রাকশন মানে জটিল বাস্তবায়নের বিবরণ গোপন করা এবং একটি অবজেক্টের কেবল প্রয়োজনীয় বৈশিষ্ট্যগুলি প্রকাশ করা। এটি আমাদের অন্তর্নিহিত জটিল মেশিনারি বোঝার প্রয়োজন ছাড়াই উচ্চ-স্তরের ধারণাগুলির সাথে কাজ করার অনুমতি দেয়। টাইপস্ক্রিপ্টে, অ্যাবস্ট্রাকশন প্রায়শই abstract ক্লাস এবং interfaces ব্যবহার করে অর্জন করা হয়।
উদাহরণ: যখন আপনি একটি রিমোট কন্ট্রোল ব্যবহার করেন, আপনি কেবল "Power" বোতাম টিপেন। আপনাকে ইনফ্রারেড সংকেত বা অভ্যন্তরীণ সার্কিট্রি সম্পর্কে জানার দরকার নেই। রিমোটটি টিভির কার্যকারিতার জন্য একটি অ্যাবস্ট্রাক্ট ইন্টারফেস সরবরাহ করে।
৩. ইনহেরিটেন্স
ইনহেরিটেন্স হল একটি প্রক্রিয়া যেখানে একটি নতুন ক্লাস (সাবক্লাস বা ডিরাইভড ক্লাস) একটি বিদ্যমান ক্লাস (সুপারক্লাস বা বেস ক্লাস) থেকে বৈশিষ্ট্য এবং পদ্ধতিগুলি উত্তরাধিকার সূত্রে পায়। এটি কোড পুনর্ব্যবহারকে উৎসাহিত করে এবং ক্লাসগুলির মধ্যে একটি স্পষ্ট "is-a" সম্পর্ক স্থাপন করে। টাইপস্ক্রিপ্ট ইনহেরিটেন্সের জন্য extends কীওয়ার্ড ব্যবহার করে।
উদাহরণ: একজন `Manager` হল `Employee`-এর একটি প্রকার। তারা `name` এবং `id`-এর মতো সাধারণ বৈশিষ্ট্যগুলি ভাগ করে নেয়, তবে `Manager`-এর `subordinates`-এর মতো অতিরিক্ত বৈশিষ্ট্য থাকতে পারে।
class Employee {
constructor(public name: string, public id: number) {}
getProfile(): string {
return `Name: ${this.name}, ID: ${this.id}`;
}
}
class Manager extends Employee {
constructor(name: string, id: number, public subordinates: Employee[]) {
super(name, id); // Call the parent constructor
}
// Managers can also have their own methods
delegateTask(): void {
console.log(`${this.name} is delegating tasks.`);
}
}
৪. পলিমরফিজম
পলিমরফিজম, যার অর্থ "অনেক রূপ", বিভিন্ন ক্লাসের অবজেক্টগুলিকে একটি সাধারণ সুপারক্লাসের অবজেক্ট হিসাবে বিবেচনা করার অনুমতি দেয়। এটি একটি একক ইন্টারফেস (যেমন একটি পদ্ধতির নাম) বিভিন্ন অন্তর্নিহিত রূপ (বাস্তবায়ন) উপস্থাপন করতে সক্ষম করে। এটি প্রায়শই পদ্ধতি ওভাররাইডিংয়ের মাধ্যমে অর্জন করা হয়।
উদাহরণ: একটি `render()` পদ্ধতি যা একটি `Circle` অবজেক্টের জন্য এবং একটি `Square` অবজেক্টের জন্য ভিন্নভাবে আচরণ করে, যদিও উভয়ই `Shape`।
abstract class Shape {
abstract draw(): void; // An abstract method must be implemented by subclasses
}
class Circle extends Shape {
draw(): void {
console.log("Drawing a circle.");
}
}
class Square extends Shape {
draw(): void {
console.log("Drawing a square.");
}
}
function renderShapes(shapes: Shape[]): void {
shapes.forEach(shape => shape.draw()); // Polymorphism in action!
}
const myShapes: Shape[] = [new Circle(), new Square()];
renderShapes(myShapes);
// Output:
// Drawing a circle.
// Drawing a square.
মহ dàbate: ইনহেরিটেন্স বনাম কম্পোজিশন
OOP-তে এটি অন্যতম গুরুত্বপূর্ণ ডিজাইন সিদ্ধান্ত। আধুনিক সফটওয়্যার ইঞ্জিনিয়ারিং-এ সাধারণ জ্ঞান হল "ইনহেরিটেন্সের চেয়ে কম্পোজিশনকে অগ্রাধিকার দিন"। আসুন উভয় ধারণাকে গভীরভাবে অন্বেষণ করে কেন তা বোঝা যাক।
ইনহেরিটেন্স কি? "is-a" সম্পর্ক
ইনহেরিটেন্স বেস ক্লাস এবং ডিরাইভড ক্লাসের মধ্যে একটি টাইট কাপলিং তৈরি করে। যখন আপনি `extends` ব্যবহার করেন, তখন আপনি বলছেন যে নতুন ক্লাসটি বেস ক্লাসের একটি বিশেষ সংস্করণ। এটি কোড পুনর্ব্যবহারের জন্য একটি শক্তিশালী সরঞ্জাম যখন একটি স্পষ্ট শ্রেণিবিন্যাস সম্পর্ক বিদ্যমান থাকে।
- সুবিধা:
- কোড পুনর্ব্যবহার: সাধারণ যুক্তি বেস ক্লাসে একবার সংজ্ঞায়িত করা হয়।
- পলিমরফিজম: আমাদের `Shape` উদাহরণের মতো মার্জিত, পলিমরফিক আচরণের অনুমতি দেয়।
- স্পষ্ট শ্রেণিবিন্যাস: এটি একটি বাস্তব-বিশ্বের, টপ-ডাউন শ্রেণীবিভাগ পদ্ধতি মডেল করে।
- অসুবিধা:
- টাইট কাপলিং: বেস ক্লাসে পরিবর্তনগুলি দুর্ঘটনাক্রমে ডিরাইভড ক্লাসগুলিকে ভেঙে দিতে পারে। এটি "fragile base class problem" হিসাবে পরিচিত।
- Hierarchy Hell: অতিরিক্ত ব্যবহার গভীর, জটিল এবং অনমনীয় ইনহেরিটেন্স চেইনগুলিতে নেতৃত্ব দিতে পারে যা বোঝা এবং বজায় রাখা কঠিন।
- অনমনীয়: একটি ক্লাস টাইপস্ক্রিপ্টে অন্য একটি ক্লাস থেকে উত্তরাধিকার সূত্রে পেতে পারে (একক ইনহেরিটেন্স), যা সীমিত হতে পারে। আপনি একাধিক, সম্পর্কহীন ক্লাস থেকে বৈশিষ্ট্যগুলি উত্তরাধিকার সূত্রে পেতে পারেন না।
ইনহেরিটেন্স কখন একটি ভাল পছন্দ?
ইনহেরিটেন্স ব্যবহার করুন যখন সম্পর্কটি সত্যিই "is-a" এবং এটি স্থিতিশীল এবং পরিবর্তন হওয়ার সম্ভাবনা কম। উদাহরণস্বরূপ, `CheckingAccount` এবং `SavingsAccount` উভয়ই মৌলিকভাবে `BankAccount`-এর প্রকার। এই শ্রেণিবিন্যাস বোধগম্য এবং পুনর্বিন্যাস হওয়ার সম্ভাবনা কম।
কম্পোজিশন কি? "has-a" সম্পর্ক
কম্পোজিশনে ছোট, স্বাধীন অবজেক্ট থেকে জটিল অবজেক্ট নির্মাণ অন্তর্ভুক্ত। একটি ক্লাস অন্য কিছু হওয়ার পরিবর্তে, এটি অন্য অবজেক্ট ধারণ করে যা প্রয়োজনীয় কার্যকারিতা সরবরাহ করে। এটি একটি লুজ কাপলিং তৈরি করে, কারণ ক্লাসটি কেবল কম্পোজড অবজেক্টগুলির পাবলিক ইন্টারফেসের সাথে ইন্টারঅ্যাক্ট করে।
- সুবিধা:
- নমনীয়তা: কম্পোজ করা অবজেক্টগুলি পরিবর্তন করে রানটাইমে কার্যকারিতা পরিবর্তন করা যেতে পারে।
- লুজ কাপলিং: কন্টেইনিং ক্লাসকে তার ব্যবহৃত উপাদানগুলির অভ্যন্তরীণ কার্যকারিতা জানার দরকার নেই। এটি কোড পরীক্ষা এবং বজায় রাখা সহজ করে তোলে।
- Hierarchy Issues এড়ানো: আপনি একটি জট পাকানো ইনহেরিটেন্স ট্রি তৈরি না করে বিভিন্ন উত্স থেকে কার্যকারিতা একত্রিত করতে পারেন।
- স্পষ্ট দায়িত্ব: প্রতিটি উপাদান ক্লাস সিঙ্গেল রেসপনসিবিলিটি প্রিন্সিপাল অনুসরণ করতে পারে।
- অসুবিধা:
- আরও বয়লারপ্লেট: এটি কখনও কখনও একটি সাধারণ ইনহেরিটেন্স মডেলের তুলনায় বিভিন্ন উপাদানগুলিকে সংযুক্ত করতে আরও বেশি কোডের প্রয়োজন হতে পারে।
- শ্রেণিবিন্যাসের জন্য কম স্বজ্ঞাত: এটি ইনহেরিটেন্সের মতো সরাসরি প্রাকৃতিক শ্রেণিবিন্যাস মডেল করে না।
একটি ব্যবহারিক উদাহরণ: Car
একটি `Car` কম্পোজিশনের একটি নিখুঁত উদাহরণ। একটি `Car` `Engine`-এর একটি প্রকার নয়, বা এটি `Wheel`-এর একটি প্রকার নয়। পরিবর্তে, একটি `Car`-এর একটি `Engine` আছে এবং `Wheels` আছে।
// Component classes
class Engine {
start() {
console.log("Engine starting...");
}
}
class GPS {
navigate(destination: string) {
console.log(`Navigating to ${destination}...`);
}
}
// The composite class
class Car {
private readonly engine: Engine;
private readonly gps: GPS;
constructor() {
// The Car creates its own parts
this.engine = new Engine();
this.gps = new GPS();
}
driveTo(destination: string) {
this.engine.start();
this.gps.navigate(destination);
console.log("Car is on its way.");
}
}
const myCar = new Car();
myCar.driveTo("New York City");
এই ডিজাইনটি অত্যন্ত নমনীয়। যদি আমরা একটি `ElectricEngine` সহ একটি `Car` তৈরি করতে চাই, আমাদের একটি নতুন ইনহেরিটেন্স চেইনের প্রয়োজন নেই। আমরা `Car`-কে তার উপাদানগুলি সরবরাহ করতে Dependency Injection ব্যবহার করতে পারি, এটি আরও মডুলার করে তোলে।
interface IEngine {
start(): void;
}
class PetrolEngine implements IEngine {
start() { console.log("Petrol engine starting..."); }
}
class ElectricEngine implements IEngine {
start() { console.log("Silent electric engine starting..."); }
}
class AdvancedCar {
// The car depends on an abstraction (interface), not a concrete class
constructor(private engine: IEngine) {}
startJourney() {
this.engine.start();
console.log("Journey has begun.");
}
}
const tesla = new AdvancedCar(new ElectricEngine());
tesla.startJourney();
const ford = new AdvancedCar(new PetrolEngine());
ford.startJourney();
উন্নত স্ট্র্যাটেজি এবং প্যাটার্নস টাইপস্ক্রিপ্টে
ইনহেরিটেন্স এবং কম্পোজিশনের মধ্যে মৌলিক পছন্দের বাইরে, টাইপস্ক্রিপ্ট পরিশীলিত এবং নমনীয় ক্লাস ডিজাইন তৈরি করার জন্য শক্তিশালী সরঞ্জাম সরবরাহ করে।
১. অ্যাবস্ট্রাক্ট ক্লাস: ইনহেরিটেন্সের জন্য ব্লুপ্রিন্ট
যখন আপনার একটি শক্তিশালী "is-a" সম্পর্ক থাকে তবে আপনি বেস ক্লাসগুলি নিজে থেকে ইনস্ট্যান্টিএট করা যাবে না তা নিশ্চিত করতে চান, তখন `abstract` ক্লাস ব্যবহার করুন। তারা একটি ব্লুপ্রিন্টের মতো কাজ করে, সাধারণ পদ্ধতি এবং বৈশিষ্ট্যগুলি সংজ্ঞায়িত করে এবং `abstract` পদ্ধতিগুলি ঘোষণা করতে পারে যা ডিরাইভড ক্লাসগুলি অবশ্যই প্রয়োগ করতে হবে।
ব্যবহারের ক্ষেত্র: একটি পেমেন্ট প্রসেসিং সিস্টেম। আপনি জানেন প্রতিটি গেটওয়ের `pay()` এবং `refund()` পদ্ধতি থাকতে হবে, তবে বাস্তবায়ন প্রতিটি প্রদানকারীর (যেমন, Stripe, PayPal) জন্য নির্দিষ্ট।
abstract class PaymentGateway {
constructor(public apiKey: string) {}
// A concrete method shared by all subclasses
protected connect(): void {
console.log("Connecting to payment service...");
}
// Abstract methods that subclasses must implement
abstract processPayment(amount: number): boolean;
abstract issueRefund(transactionId: string): boolean;
}
class StripeGateway extends PaymentGateway {
processPayment(amount: number): boolean {
this.connect();
console.log(`Processing ${amount} via Stripe.`);
return true;
}
issueRefund(transactionId: string): boolean {
console.log(`Refunding transaction ${transactionId} via Stripe.`);
return true;
}
}
// const gateway = new PaymentGateway("key"); // Error: Cannot create an instance of an abstract class.
const stripe = new StripeGateway("sk_test_123");
stripe.processPayment(100);
২. ইন্টারফেস: আচরণের জন্য চুক্তি সংজ্ঞায়িত করা
টাইপস্ক্রিপ্টে ইন্টারফেসগুলি একটি ক্লাসের আকৃতির জন্য একটি চুক্তি সংজ্ঞায়িত করার একটি উপায়। তারা কোন বৈশিষ্ট্য এবং পদ্ধতিগুলি একটি ক্লাসের থাকা উচিত তা নির্দিষ্ট করে, তবে তারা কোনও বাস্তবায়ন সরবরাহ করে না। একটি ক্লাস একাধিক ইন্টারফেস `implement` করতে পারে, তাদের কম্পোজিশনাল এবং ডিকাপল্ড ডিজাইনের একটি মূল ভিত্তি তৈরি করে।
ইন্টারফেস বনাম অ্যাবস্ট্রাক্ট ক্লাস
- abstract class ব্যবহার করুন যখন আপনি একাধিক ঘনিষ্ঠভাবে সম্পর্কিত ক্লাসগুলির মধ্যে বাস্তবায়িত কোড ভাগ করতে চান।
- interface ব্যবহার করুন যখন আপনি আচরণের জন্য একটি চুক্তি সংজ্ঞায়িত করতে চান যা বিভিন্ন, সম্পর্কহীন ক্লাস দ্বারা প্রয়োগ করা যেতে পারে।
ব্যবহারের ক্ষেত্র: একটি সিস্টেমে, অনেকগুলি বিভিন্ন বস্তুকে একটি স্ট্রিং বিন্যাসে সিরিয়ালাইজ করা প্রয়োজন হতে পারে (যেমন, লগিং বা সংরক্ষণের জন্য)। এই বস্তুগুলি (`User`, `Product`, `Order`) সম্পর্কহীন তবে একটি সাধারণ ক্ষমতা ভাগ করে নেয়।
interface ISerializable {
serialize(): string;
}
class User implements ISerializable {
constructor(public id: number, public name: string) {}
serialize(): string {
return JSON.stringify({ id: this.id, name: this.name });
}
}
class Product implements ISerializable {
constructor(public sku: string, public price: number) {}
serialize(): string {
return JSON.stringify({ sku: this.sku, price: this.price });
}
}
function logItems(items: ISerializable[]): void {
items.forEach(item => {
console.log("Serialized item:", item.serialize());
});
}
const user = new User(1, "Alice");
const product = new Product("TSHIRT-RED", 19.99);
logItems([user, product]);
৩. মিক্সিনস: কোড পুনর্ব্যবহারের জন্য একটি কম্পোজিশনাল পদ্ধতি
যেহেতু টাইপস্ক্রিপ্ট শুধুমাত্র একক ইনহেরিটেন্সের অনুমতি দেয়, আপনি যদি একাধিক উত্স থেকে কোড পুনর্ব্যবহার করতে চান তবে কি হবে? এখানেই মিক্সিন প্যাটার্ন আসে। মিক্সিন হল ফাংশন যা একটি কনস্ট্রাক্টর নেয় এবং একটি নতুন কনস্ট্রাক্টর প্রদান করে যা এটিকে নতুন কার্যকারিতা সহ প্রসারিত করে। এটি কম্পোজিশনের একটি রূপ যা আপনাকে একটি ক্লাসে কার্যকারিতা "mix in" করার অনুমতি দেয়।
ব্যবহারের ক্ষেত্র: আপনি একাধিক মডেল ক্লাসে `Timestamp` (with `createdAt`, `updatedAt`) এবং `SoftDeletable` (`deletedAt` property and `softDelete()` method সহ) আচরণ যোগ করতে চান।
// A Type helper for mixins
type Constructor<T = {}> = new (...args: any[]) => T;
// Timestamp Mixin
function Timestamped<TBase extends Constructor>(Base: TBase) {
return class extends Base {
createdAt: Date = new Date();
updatedAt: Date = new Date();
};
}
// SoftDeletable Mixin
function SoftDeletable<TBase extends Constructor>(Base: TBase) {
return class extends Base {
deletedAt: Date | null = null;
softDelete() {
this.deletedAt = new Date();
console.log("Item has been soft deleted.");
}
};
}
// Base class
class DocumentModel {
constructor(public title: string) {}
}
// Create a new class by composing mixins
const UserAccountModel = SoftDeletable(Timestamped(DocumentModel));
const userAccount = new UserAccountModel("My User Account");
console.log(userAccount.title);
console.log(userAccount.createdAt);
userAccount.softDelete();
console.log(userAccount.deletedAt);
উপসংহার: ভবিষ্যৎ-প্রমাণ টাইপস্ক্রিপ্ট অ্যাপ্লিকেশন তৈরি করা
টাইপস্ক্রিপ্টে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং আয়ত্ত করা সিনট্যাক্স বোঝা থেকে ডিজাইন দর্শন গ্রহণ করার একটি যাত্রা। ক্লাস স্ট্রাকচার, ইনহেরিটেন্স এবং কম্পোজিশন সম্পর্কিত আপনার পছন্দগুলির আপনার অ্যাপ্লিকেশনের দীর্ঘমেয়াদী স্বাস্থ্যের উপর গভীর প্রভাব রয়েছে।
আপনার বিশ্বব্যাপী উন্নয়ন অনুশীলনের জন্য মূল বিষয়গুলি এখানে:
- স্তম্ভগুলি দিয়ে শুরু করুন: নিশ্চিত করুন যে আপনার এনক্যাপসুলেশন, অ্যাবস্ট্রাকশন, ইনহেরিটেন্স এবং পলিমরফিজমের একটি দৃঢ় দখল আছে। এগুলি OOP-এর শব্দভাণ্ডার।
- ইনহেরিটেন্সের চেয়ে কম্পোজিশনকে অগ্রাধিকার দিন: এই নীতিটি আপনাকে আরও নমনীয়, মডুলার এবং পরীক্ষামূলক কোডের দিকে নিয়ে যাবে। কম্পোজিশন দিয়ে শুরু করুন এবং কেবল তখনই ইনহেরিটেন্স ব্যবহার করুন যখন একটি স্পষ্ট, স্থিতিশীল "is-a" সম্পর্ক বিদ্যমান থাকে।
- কাজের জন্য সঠিক সরঞ্জাম ব্যবহার করুন:
- একটি স্থিতিশীল শ্রেণিবিন্যাসে প্রকৃত বিশেষীকরণ এবং কোড ভাগ করার জন্য ইনহেরিটেন্স ব্যবহার করুন।
- কিছু বাস্তবায়ন ভাগ করে নেওয়ার সময় একটি চুক্তির প্রয়োগ করে ক্লাসগুলির একটি পরিবারের জন্য একটি সাধারণ ভিত্তি সংজ্ঞায়িত করতে অ্যাবস্ট্রাক্ট ক্লাস ব্যবহার করুন।
- যেকোন ক্লাস দ্বারা প্রয়োগ করা যেতে পারে এমন আচরণের জন্য চুক্তিগুলি সংজ্ঞায়িত করতে ইন্টারফেস ব্যবহার করুন, চরম ডিকাপলিং প্রচার করুন।
- একাধিক উত্স থেকে একটি ক্লাসে কার্যকারিতা কম্পোজ করার প্রয়োজন হলে মিক্সিন ব্যবহার করুন, একক ইনহেরিটেন্সের সীমাবদ্ধতাগুলি কাটিয়ে উঠুন।
এই প্যাটার্নগুলি সম্পর্কে সমালোচনামূলকভাবে চিন্তা করে এবং তাদের ট্রেড-অফগুলি বোঝার মাধ্যমে, আপনি টাইপস্ক্রিপ্ট অ্যাপ্লিকেশনগুলি তৈরি করতে পারেন যা আজ কেবল শক্তিশালী এবং দক্ষই নয়, বরং আগামী বছরগুলির জন্য সহজেই খাপ খাইয়ে নেওয়া, প্রসারিত এবং রক্ষণাবেক্ষণযোগ্য – আপনি বা আপনার দল বিশ্বের যে কোনও জায়গায় থাকুন না কেন।