Skill

Object-Oriented Programming in LISP (অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং)

লিস্প (LISP) - Computer Programming

330

LISP একটি ফাংশনাল প্রোগ্রামিং ভাষা হলেও, এটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) সমর্থন করে, বিশেষ করে Common LISP ডায়ালেক্টে। Common LISP Object System (CLOS) LISP-এ অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের জন্য ব্যবহৃত একটি শক্তিশালী সিস্টেম। CLOS ব্যবহার করে, আপনি ক্লাস, অবজেক্ট, ইনহেরিট্যান্স, পলিমরফিজম এবং এনক্যাপসুলেশন সহ OOP কনসেপ্টগুলো বাস্তবায়ন করতে পারেন।

এখানে LISP-এ OOP সম্পর্কে বিস্তারিত আলোচনা করা হয়েছে, যা CLOS এর মাধ্যমে বাস্তবায়িত হয়।


১. CLOS (Common LISP Object System)

CLOS হলো Common LISP-এর অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং সিস্টেম, যা LISP ভাষায় OOP কনসেপ্টগুলো প্রয়োগ করার জন্য ব্যবহৃত হয়। CLOS আপনাকে ক্লাস, অবজেক্ট, মেসেজ পাসিং, ইনহেরিট্যান্স এবং পলিমরফিজমের মতো মূল OOP ধারণাগুলি ব্যবহার করতে সক্ষম করে।


২. ক্লাস (Class) এবং অবজেক্ট (Object)

LISP-এ ক্লাস হলো একটি ব্লুপ্রিন্ট বা কাঠামো, যার মধ্যে একটি বা একাধিক অ্যাট্রিবিউট এবং মেথড থাকে। একটি অবজেক্ট হলো সেই ক্লাসের একটি ইনস্ট্যান্স (instance), যার মধ্যে ডেটা বা আঙুলের মাধ্যমে অ্যাক্সেসযোগ্য বৈশিষ্ট্য থাকে।

ক্লাস ডিফাইনেশন:

(defclass person ()
  ((name :initarg :name :accessor person-name)
   (age :initarg :age :accessor person-age)))

এখানে, person একটি ক্লাস যা দুটি অ্যাট্রিবিউট name এবং age ধারণ করে। :initarg ব্যবহার করে অ্যাট্রিবিউটের মান ইনিশিয়ালাইজ করা হয় এবং :accessor ব্যবহার করে তাদের মান অ্যাক্সেস করা যায়।

অবজেক্ট তৈরি:

(defparameter *john* (make-instance 'person :name "John" :age 30))

এখানে, *john* একটি person ক্লাসের একটি অবজেক্ট তৈরি করা হয়েছে, যেখানে name হলো "John" এবং age হলো ৩০।


৩. মেথড (Method)

LISP-এ মেথড একটি ফাংশন যা একটি ক্লাসের অবজেক্টের উপর কাজ করে। একটি মেথড একটি বা একাধিক ক্লাসের ইনস্ট্যান্সের উপর কাজ করতে পারে এবং এটি ইনহেরিট্যান্সের মাধ্যমে নতুন ক্লাসে প্রপাগেট (propagate) হয়।

মেথড ডিফাইনেশন:

(defmethod greet ((p person))
  (format t "Hello, my name is ~A and I am ~A years old." 
          (person-name p) (person-age p)))

এখানে, greet নামক একটি মেথড তৈরি করা হয়েছে যা person ক্লাসের একটি অবজেক্টের উপর কাজ করবে। এটি person-name এবং person-age অ্যাক্সেসর ফাংশনগুলি ব্যবহার করে অবজেক্টের বৈশিষ্ট্যগুলি প্রিন্ট করবে।

মেথড কল:

(greet *john*)  ; আউটপুট: Hello, my name is John and I am 30 years old.

এখানে, *john* অবজেক্টের উপর greet মেথড প্রয়োগ করা হয়েছে।


৪. ইনহেরিট্যান্স (Inheritance)

LISP-এর CLOS সিস্টেমে ইনহেরিট্যান্স বাস্তবায়ন করা যায়। একটি ক্লাস অন্য একটি ক্লাসের বৈশিষ্ট্য এবং মেথড উত্তরাধিকারী (inherit) করতে পারে। এটি মূলত সাবক্লাসিং এর মাধ্যমে কাজ করে।

উদাহরণ:

(defclass employee (person)
  ((employee-id :initarg :employee-id :accessor employee-id)))

এখানে, employee ক্লাসটি person ক্লাসের সাবক্লাস, যা person ক্লাসের বৈশিষ্ট্য যেমন name এবং age উত্তরাধিকারী করেছে এবং নতুন একটি employee-id অ্যাট্রিবিউট যুক্ত করেছে।

অবজেক্ট তৈরি:

(defparameter *alice* (make-instance 'employee :name "Alice" :age 25 :employee-id "E123"))

এখানে, *alice* একটি employee ক্লাসের ইনস্ট্যান্স, যা person ক্লাসের বৈশিষ্ট্যগুলি ও employee-id অ্যাট্রিবিউট ধারণ করে।


৫. পলিমরফিজম (Polymorphism)

LISP-এ পলিমরফিজম হলো এমন একটি বৈশিষ্ট্য যেখানে একই নামের মেথড বিভিন্ন ইনপুটে বিভিন্ন ধরনের কাজ করে। CLOS সিস্টেম পলিমরফিজম সমর্থন করে, যা বিভিন্ন ডেটা টাইপের জন্য একই মেথড ব্যবহার করতে দেয়।

উদাহরণ:

(defmethod describe ((p person))
  (format t "I am a person named ~A." (person-name p)))

(defmethod describe ((e employee))
  (format t "I am an employee named ~A with ID ~A." (person-name e) (employee-id e)))

এখানে, describe নামক দুটি মেথড আছে—একটি person ক্লাসের জন্য এবং অন্যটি employee ক্লাসের জন্য। একে মেথড ডিসপ্যাচিং বলে, যেখানে ফাংশনটি ডাটা টাইপ অনুযায়ী ভিন্ন আচরণ করবে।

মেথড কল:

(describe *john*)  ; আউটপুট: I am a person named John.
(describe *alice*)  ; আউটপুট: I am an employee named Alice with ID E123.

এখানে, describe মেথডটি ভিন্ন ভিন্ন ক্লাসের জন্য ভিন্ন আচরণ করছে।


৬. এনক্যাপসুলেশন (Encapsulation)

LISP-এ এনক্যাপসুলেশন নিশ্চিত করার জন্য অ্যাট্রিবিউটের অ্যাক্সেস নিয়ন্ত্রণ করা যায়। LISP-এ সাধারণত অ্যাক্সেসর ফাংশন ব্যবহার করে ক্লাসের ভিতরের ডেটা বা প্রপার্টি অ্যাক্সেস করা হয়।

উদাহরণ:

(defclass car ()
  ((make :initarg :make :accessor car-make)
   (model :initarg :model :accessor car-model)))

এখানে, make এবং model অ্যাট্রিবিউটগুলির জন্য অ্যাক্সেসর ফাংশন car-make এবং car-model তৈরি করা হয়েছে।

ডেটা অ্যাক্সেস:

(setq my-car (make-instance 'car :make "Toyota" :model "Camry"))
(car-make my-car)  ; আউটপুট: "Toyota"
(car-model my-car)  ; আউটপুট: "Camry"

এখানে, my-car অবজেক্টের make এবং model অ্যাট্রিবিউটগুলি অ্যাক্সেস করা হয়েছে। এইভাবে আপনি ক্লাসের ভিতরের ডেটা অ্যাক্সেস এবং পরিবর্তন নিয়ন্ত্রণ করতে পারেন।


সারসংক্ষেপ

LISP-এ অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) সমর্থন করে Common LISP Object System (CLOS) এর মাধ্যমে, যা আপনাকে ক্লাস, অবজেক্ট, ইনহেরিট্যান্স, পলিমরফিজম, এবং এনক্যাপসুলেশন সহ OOP কনসেপ্টগুলো ব্যবহার করার সুযোগ দেয়। LISP-এ OOP ব্যবহার করার মাধ্যমে আপনি শক্তিশালী অ্যাবস্ট্রাকশন এবং কোডের পুনঃব্যবহারযোগ্যতা তৈরি করতে পারেন। CLOS-এর মাধ্যমে আপনি ক্লাস এবং অবজেক্ট তৈরি, মেথড ডিফাইন, ইনহেরিট্যান্স প্রয়োগ এবং পলিমরফিজম ব্যবহার করতে পারেন, যা OOP-কে কার্যকরী করে তোলে।

Content added By

CLOS (Common LISP Object System) হলো LISP ভাষার জন্য একটি শক্তিশালী এবং নমনীয় অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) সিস্টেম। এটি LISP ভাষার জন্য একটি স্ট্যান্ডার্ড অবজেক্ট সিস্টেম তৈরি করে যা অবজেক্ট-ওরিয়েন্টেড ধারণাগুলি যেমন পলিমরফিজম, ইনহেরিট্যান্স, এবং এনক্যাপসুলেশন সমর্থন করে। CLOS এর মাধ্যমে LISP-এ অবজেক্ট-ওরিয়েন্টেড কোড লেখা সহজ এবং শক্তিশালী হয়ে ওঠে।

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


CLOS এর প্রধান বৈশিষ্ট্য

  1. ক্লাস (Classes):
    CLOS অবজেক্টগুলোকে class নামে সংগঠিত করে। একটি ক্লাস হল অবজেক্টের কাঠামো, যেখানে সদস্য (ফাংশন এবং প্রপার্টি) ডিফাইন করা থাকে।

    উদাহরণ:

    (defclass person ()
      ((name :accessor name :initarg :name)
       (age :accessor age :initarg :age)))

    এখানে, person একটি ক্লাস যা দুটি প্রপার্টি name এবং age ধারণ করে। :accessor এবং :initarg ব্যবহার করে এর জন্য অ্যাক্সেসর এবং ইনিশিয়ালাইজার তৈরি করা হয়েছে।

  2. ইনহেরিট্যান্স (Inheritance):
    CLOS অবজেক্ট-ওরিয়েন্টেড ধারণা ইনহেরিট্যান্সকে সমর্থন করে, যার মাধ্যমে এক ক্লাস অন্য ক্লাসের প্রপার্টি এবং মেথড গুলি উত্তরাধিকারসূত্রে পেতে পারে।

    উদাহরণ:

    (defclass employee (person)
      ((employee-id :accessor employee-id :initarg :employee-id)))

    এখানে, employee ক্লাসটি person ক্লাস থেকে ইনহেরিট করছে, অর্থাৎ employee ক্লাস name এবং age প্রপার্টি উত্তরাধিকারসূত্রে পাবে।

  3. পলিমরফিজম (Polymorphism):
    CLOS পলিমরফিজম সমর্থন করে, যার মাধ্যমে একই নামের ফাংশন ভিন্ন ভিন্ন ক্লাসের জন্য বিভিন্ন আচরণ করতে পারে। এটি generic functions এবং methods ব্যবহার করে অর্জন করা হয়।

    উদাহরণ:

    (defmethod greet ((p person))
      (format t "Hello, my name is ~a and I am ~a years old." (name p) (age p)))
    
    (defmethod greet ((e employee))
      (format t "Hello, my name is ~a, I am ~a years old, and my employee ID is ~a." (name e) (age e) (employee-id e)))

    এখানে, greet মেথড দুটি আলাদা আচরণ পাবে—একটি person অবজেক্টের জন্য এবং অন্যটি employee অবজেক্টের জন্য।

  4. জেনেরিক ফাংশন (Generic Functions):
    CLOS এ generic functions ব্যবহৃত হয়, যা একাধিক ক্লাসের অবজেক্ট নিয়ে কাজ করতে পারে এবং তাদের জন্য বিভিন্ন methods নির্ধারণ করতে পারে।

    উদাহরণ:

    (defgeneric greet (object))  ; generic function definition

    এখানে, greet একটি generic function, এবং greet এর জন্য ভিন্ন ভিন্ন methods তৈরি করা হবে যেগুলো নির্দিষ্ট অবজেক্ট টাইপের জন্য কাজ করবে।

  5. মেথড (Methods):
    CLOS মেথড ডিফাইন করতে defmethod ব্যবহার করে, যা একটি generic function এর জন্য নির্দিষ্ট আচরণ নির্ধারণ করে।

    উদাহরণ:

    (defmethod greet ((p person))
      (format t "Hello, my name is ~a." (name p)))

    এখানে, greet মেথডটি person টাইপের অবজেক্টের জন্য বিশেষ আচরণ নির্ধারণ করে।


CLOS এর সুবিধা

  1. ডায়নামিক টাইপিং:
    CLOS একটি ডায়নামিক টাইপ সিস্টেম ব্যবহার করে, অর্থাৎ ক্লাস এবং অবজেক্ট টাইপগুলি রানটাইমে নির্ধারণ করা হয়। এর ফলে, কোডের নমনীয়তা এবং প্রতিক্রিয়া বাড়ে।
  2. সহজ ইনহেরিট্যান্স এবং মডিউলারিটি:
    CLOS ইনহেরিট্যান্সের মাধ্যমে কোড পুনঃব্যবহারযোগ্যতা এবং মডিউলারিটি সহজে অর্জন করতে সহায়তা করে। আপনি একটি নতুন ক্লাস তৈরি করে পূর্ববর্তী ক্লাস থেকে প্রপার্টি এবং মেথডস সহজে উত্তরাধিকারসূত্রে নিতে পারেন।
  3. পলিমরফিজম এবং কাস্টম ফাংশন:
    CLOS পলিমরফিজম এবং কাস্টম ফাংশন সমর্থন করে, যার ফলে একই নামের ফাংশন বিভিন্ন টাইপের অবজেক্টের জন্য ভিন্ন আচরণ করতে পারে, যা কোডকে আরও সাধারণ ও কার্যকরী করে তোলে।
  4. এনক্যাপসুলেশন:
    CLOS অবজেক্টের সদস্য বা ডেটা সদস্যদের (প্রপার্টি) অ্যাক্সেস নিয়ন্ত্রণ করতে সহায়তা করে, যার ফলে ডেটার নিরাপত্তা বজায় থাকে এবং কোড মেইনটেন করা সহজ হয়।

CLOS ব্যবহার করে একটি সাধারণ উদাহরণ:

1. ক্লাস ডিফাইন করা (Class Definition):

(defclass person ()
  ((name :accessor name :initarg :name)
   (age :accessor age :initarg :age)))

এখানে, person নামক একটি ক্লাস ডিফাইন করা হয়েছে যার দুটি প্রপার্টি name এবং age রয়েছে। :accessor ব্যবহার করা হয়েছে যাতে প্রপার্টি গুলির মান অ্যাক্সেস করা যায় এবং :initarg দিয়ে ইনিশিয়ালাইজ করা যাবে।

2. মেথড ডিফাইন করা (Method Definition):

(defmethod greet ((p person))
  (format t "Hello, my name is ~a and I am ~a years old." (name p) (age p)))

এখানে, greet একটি মেথড যা person টাইপের অবজেক্টের জন্য name এবং age প্রপার্টি নিয়ে একটি মেসেজ প্রিন্ট করবে।

3. অবজেক্ট তৈরি এবং মেথড কল (Object Creation and Method Call):

(setq john (make-instance 'person :name "John" :age 30))
(greet john)  ; আউটপুট: Hello, my name is John and I am 30 years old.

এখানে, john নামক একটি person অবজেক্ট তৈরি করা হয়েছে এবং তার পর greet মেথড কল করা হয়েছে যা আউটপুট দিবে: Hello, my name is John and I am 30 years old.


সারসংক্ষেপ

CLOS (Common LISP Object System) হল LISP ভাষার জন্য একটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং সিস্টেম যা অবজেক্ট, ক্লাস, ইনহেরিট্যান্স, পলিমরফিজম, এবং মেথড সাপোর্ট করে। এটি LISP প্রোগ্রামিংকে আরও শক্তিশালী, নমনীয় এবং ব্যবহারযোগ্য করে তোলে। CLOS এর মাধ্যমে আপনি সহজেই অবজেক্ট তৈরি করতে পারেন, মেথড তৈরি করতে পারেন, এবং পলিমরফিজমের মাধ্যমে একাধিক অবজেক্টের জন্য একই নামের ফাংশন বিভিন্ন আচরণ করতে পারেন।

Content added By

LISP একটি ফাংশনাল প্রোগ্রামিং ভাষা হলেও, এটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর ধারণা সমর্থন করতে পারে, বিশেষ করে Common Lisp Object System (CLOS) ব্যবহার করে। CLOS LISP এর একটি শক্তিশালী OOP সিস্টেম যা ক্লাস এবং অবজেক্ট তৈরি, ইনহেরিট্যান্স, পলিমরফিজম, এবং এনক্যাপসুলেশন সমর্থন করে।

এখানে আমরা দেখবো কিভাবে LISP-এ class এবং object তৈরি করা যায় CLOS ব্যবহার করে।


১. Class তৈরি করা (Creating a Class)

LISP-এ একটি ক্লাস তৈরি করতে defclass ম্যাক্রো ব্যবহার করা হয়। একটি ক্লাস ডিফাইন করার সময়, তার অ্যাট্রিবিউট বা প্রপার্টি (যেমন, ভেরিয়েবল বা ফিল্ড) ঘোষণা করতে হয়।

Syntax:

(defclass class-name (superclass)
  ((attribute1 :initform value :accessor attribute1)
   (attribute2 :initform value :accessor attribute2)))
  • class-name: ক্লাসের নাম
  • superclass: ঐ ক্লাস যদি অন্য ক্লাস থেকে ইনহেরিট করে তবে তার নাম (যেমন, object বা অন্য কোনো ক্লাস)
  • attribute: ক্লাসের প্রপার্টি বা ভেরিয়েবল

উদাহরণ (Class তৈরি করা):

(defclass person ()
  ((name :initarg :name :accessor person-name)
   (age :initarg :age :accessor person-age)))

এখানে:

  • person নামে একটি ক্লাস তৈরি করা হয়েছে।
  • দুটি অ্যাট্রিবিউট name এবং age রয়েছে, যেগুলি :initarg দিয়ে ইনিশিয়ালাইজ হবে এবং :accessor এর মাধ্যমে অ্যাক্সেস করা যাবে।

২. Object তৈরি করা (Creating an Object)

LISP-এ ক্লাসের একটি অবজেক্ট তৈরি করতে make-instance ফাংশন ব্যবহার করা হয়। এটি ক্লাসের একটি ইনস্ট্যান্স তৈরি করে এবং তার প্রপার্টি বা অ্যাট্রিবিউটের মান প্রদান করা যায়।

Syntax:

(make-instance 'class-name :attribute1 value1 :attribute2 value2)

উদাহরণ (Object তৈরি করা):

(setq john (make-instance 'person :name "John Doe" :age 30))

এখানে, john নামে একটি অবজেক্ট তৈরি করা হয়েছে person ক্লাস থেকে, যেখানে name "John Doe" এবং age ৩০ প্রদান করা হয়েছে।


৩. Accessor এবং Setter Method ব্যবহার করা

LISP-এ, CLOS ক্লাসে প্রপার্টি অ্যাক্সেস করতে accessor ফাংশন ব্যবহার করা হয়। আপনি ক্লাসে ডিফাইন করা accessor ফাংশনগুলির মাধ্যমে অ্যাট্রিবিউটের মান রিড করতে পারেন।

উদাহরণ (Accessor Method ব্যবহার):

(person-name john)  ; আউটপুট: "John Doe"
(person-age john)   ; আউটপুট: 30

এখানে, person-name এবং person-age অ্যাক্সেসর ব্যবহার করে আমরা john অবজেক্টের name এবং age অ্যাট্রিবিউটের মান পেতে পারি।


৪. Method তৈরি করা (Creating a Method)

LISP-এ defmethod ব্যবহার করে মেথড তৈরি করা হয় যা ক্লাসের অবজেক্টে কাজ করবে। মেথড ডিফাইন করার সময় তার আর্গুমেন্ট হিসেবে ক্লাসের অবজেক্ট এবং অন্যান্য আর্গুমেন্ট দেয়া হয়।

Syntax:

(defmethod method-name ((object class-name) other-arguments)
  "Method body")

উদাহরণ (Method তৈরি করা):

(defmethod print-person ((p person))
  (format t "Name: ~A, Age: ~A" (person-name p) (person-age p)))

এখানে, print-person একটি মেথড যা person ক্লাসের অবজেক্ট নিয়ে তার নাম এবং বয়স প্রিন্ট করবে।

মেথড কল করা:

(print-person john)  ; আউটপুট: Name: John Doe, Age: 30

এখানে, print-person মেথড কল করে আমরা john অবজেক্টের নাম এবং বয়স প্রিন্ট করেছি।


৫. Inheritance (Inheriting a Class)

CLOS তে ইনহেরিট্যান্স সমর্থিত। আপনি একটি ক্লাসকে অন্য ক্লাস থেকে ইনহেরিট করতে পারেন।

উদাহরণ (Inheritance):

(defclass employee (person)
  ((salary :initarg :salary :accessor employee-salary)))

(setq jane (make-instance 'employee :name "Jane Smith" :age 25 :salary 50000))

এখানে, employee ক্লাসটি person ক্লাস থেকে ইনহেরিট করছে। employee ক্লাসে নতুন একটি অ্যাট্রিবিউট salary যোগ করা হয়েছে।

মেথড ব্যবহার:

(print-person jane)  ; আউটপুট: Name: Jane Smith, Age: 25
(employee-salary jane)  ; আউটপুট: 50000

এখানে, jane একটি employee অবজেক্ট, যেটি person ক্লাস থেকে name এবং age অ্যাট্রিবিউট ইনহেরিট করেছে এবং employee ক্লাসে salary অ্যাট্রিবিউট যোগ হয়েছে।


সারসংক্ষেপ

  • Class তৈরি: LISP-এ ক্লাস তৈরি করতে defclass ব্যবহার করা হয়।
  • Object তৈরি: ক্লাসের অবজেক্ট তৈরি করতে make-instance ব্যবহার করা হয়।
  • Accessor Methods: ক্লাসের প্রপার্টি অ্যাক্সেস করতে accessor ফাংশন ব্যবহার করা হয়।
  • Method তৈরি: defmethod ব্যবহার করে ক্লাসের মেথড তৈরি করা হয়।
  • Inheritance: একটি ক্লাস থেকে অন্য ক্লাস ইনহেরিট করতে defclass এর মধ্যে সুপারক্লাস নির্ধারণ করা হয়।

LISP এর CLOS (Common Lisp Object System) একটি শক্তিশালী OOP সিস্টেম যা ক্লাস, অবজেক্ট, মেথড, এবং ইনহেরিট্যান্সসহ অন্যান্য OOP ধারণাগুলি সাপোর্ট করে।

Content added By

Inheritance (উত্তরাধিকার) এবং Polymorphism (বহুরূপতা) হল Object-Oriented Programming (OOP) এর দুটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা কোডের পুনঃব্যবহারযোগ্যতা, স্থায়িত্ব এবং প্রবণতা উন্নত করতে সাহায্য করে। LISP-এর মত ভাষায় এই ধারণাগুলির কাজ ভিন্নভাবে হতে পারে, তবে এই ধারণাগুলির মূল উদ্দেশ্য একই: একটি কাঠামোগত উপায়ে কোডকে সংগঠিত করা এবং উন্নয়ন প্রক্রিয়াকে সহজ করা।


১. Inheritance (উত্তরাধিকার)

Inheritance হল একটি ধারণা যেখানে একটি ক্লাস অন্য একটি ক্লাসের বৈশিষ্ট্য এবং আচরণ (attributes and behaviors) উত্তরাধিকারসূত্রে পেয়ে থাকে। এটি আপনাকে পূর্বে ডিফাইন করা ক্লাসের ফাংশন এবং প্রপার্টি পুনরায় ব্যবহার করার সুযোগ দেয়, যা কোডের পুনঃব্যবহারযোগ্যতা নিশ্চিত করে এবং কোডের জটিলতা কমায়।

Inheritance এর মূল বৈশিষ্ট্য:

  • Superclass এবং Subclass: একটি ক্লাস যে ক্লাস থেকে বৈশিষ্ট্য এবং আচরণ উত্তরাধিকারসূত্রে পায় তাকে superclass বা parent class বলা হয়, এবং যে ক্লাসটি ঐ বৈশিষ্ট্যগুলি গ্রহণ করে তাকে subclass বা child class বলা হয়।
  • Code Reusability: Inheritance কোডের পুনঃব্যবহারযোগ্যতা নিশ্চিত করে। আপনি যদি একটি ক্লাসের আচরণ (behavior) পুনরায় ব্যবহার করতে চান, তবে সেই ক্লাস থেকে উত্তরাধিকারসূত্রে বৈশিষ্ট্য গ্রহণ করে নতুন ক্লাস তৈরি করতে পারেন।
  • Extensibility: Inheritance ব্যবহার করে একটি নতুন ক্লাসের মধ্যে পুরনো ক্লাসের আচরণ এবং বৈশিষ্ট্যগুলো বর্ধিত করা যেতে পারে।

Inheritance এর উদাহরণ:

ধরা যাক, একটি Animal (প্রাণী) ক্লাস রয়েছে, যা সকল প্রাণীর সাধারণ বৈশিষ্ট্য এবং আচরণ ধারণ করে। এর পরে, আমরা একটি Dog (কুকুর) ক্লাস তৈরি করব, যা Animal ক্লাস থেকে উত্তরাধিকারসূত্রে বৈশিষ্ট্য পাবে।

(defclass animal ()
  ((name :initarg :name :accessor name)
   (age :initarg :age :accessor age)))

(defclass dog (animal)  ; dog ক্লাস animal থেকে উত্তরাধিকার গ্রহণ করবে
  ((breed :initarg :breed :accessor breed)))

(defmethod speak ((d dog))
  (format t "~A says Woof!" (name d)))

(setq my-dog (make-instance 'dog :name "Buddy" :age 3 :breed "Golden Retriever"))

(speak my-dog)  ; আউটপুট: Buddy says Woof!

এখানে:

  • dog ক্লাসটি animal ক্লাস থেকে উত্তরাধিকার নিয়েছে এবং তার কিছু বৈশিষ্ট্য (যেমন name, age) পেয়ে গেছে।
  • speak মেথড dog ক্লাসের জন্য ডিফাইন করা হয়েছে এবং এটি কুকুরের শব্দ (Woof) প্রিন্ট করবে।

২. Polymorphism (বহুরূপতা)

Polymorphism হল একটি ধারণা যেখানে একটি সাধারণ ইন্টারফেস বা ফাংশন বিভিন্ন ধরনের অবজেক্টের জন্য কাজ করতে পারে। এর মাধ্যমে একাধিক ধরনের অবজেক্টের মধ্যে একটি সাধারণ আচরণ বজায় রাখা হয়। Polymorphism মূলত দুইভাবে কাজ করে:

  1. Method Overriding: যখন একটি সাবক্লাস তার সুপারক্লাসের একটি মেথডকে পুনঃডিফাইন (override) করে।
  2. Method Overloading: যখন একই নামের মেথড বিভিন্ন প্যারামিটার নিয়ে কাজ করে (যদিও LISP তে এই বৈশিষ্ট্যটি সরাসরি উপলব্ধ নয়, তবে OOP ভাষাগুলিতে এটি ব্যবহৃত হয়)।

Polymorphism এর মূল বৈশিষ্ট্য:

  • Single Interface, Multiple Implementations: একটি ফাংশন বা মেথড একাধিক অবজেক্টের জন্য একই ইন্টারফেস ব্যবহার করে, তবে এটি প্রতিটি অবজেক্টের জন্য ভিন্নভাবে আচরণ করতে পারে।
  • Method Overriding: সাবক্লাস তার মেথডে নতুন আচরণ সংযোজন বা পূর্বের আচরণ পরিবর্তন করতে পারে।
  • Flexibility: Polymorphism ব্যবহার করলে আপনার কোড আরো নমনীয় ও মানানসই হয়ে ওঠে, কারণ এটি বিভিন্ন ধরনের অবজেক্টের জন্য এক ধরনের ইন্টারফেস এবং আচরণ ব্যবহার করতে দেয়।

Polymorphism এর উদাহরণ:

ধরা যাক, Animal ক্লাসে একটি speak মেথড রয়েছে, যা Dog এবং Cat ক্লাসে ভিন্নভাবে আচরণ করবে।

(defclass animal ()
  ((name :initarg :name :accessor name)))

(defclass dog (animal)
  ())

(defclass cat (animal)
  ())

(defmethod speak ((a dog))
  (format t "~A says Woof!" (name a)))

(defmethod speak ((a cat))
  (format t "~A says Meow!" (name a)))

(setq my-dog (make-instance 'dog :name "Buddy"))
(setq my-cat (make-instance 'cat :name "Whiskers"))

(speak my-dog)  ; আউটপুট: Buddy says Woof!
(speak my-cat)  ; আউটপুট: Whiskers says Meow!

এখানে:

  • Dog এবং Cat ক্লাস দুটি Animal ক্লাস থেকে উত্তরাধিকার পেয়েছে এবং প্রতিটি ক্লাসের জন্য speak মেথড ভিন্নভাবে আচরণ করছে।
  • speak মেথডটি Dog এবং Cat ক্লাসের জন্য ভিন্ন আউটপুট দেয়, যা polymorphism এর উদাহরণ।

Inheritance এবং Polymorphism এর মধ্যে পার্থক্য:

বৈশিষ্ট্যInheritancePolymorphism
মৌলিক ধারণাএকটি ক্লাস অন্য ক্লাসের বৈশিষ্ট্য এবং আচরণ পায়।একই মেথড বা ফাংশন একাধিক উপায়ে কাজ করে, বিভিন্ন ক্লাসের জন্য।
কোড পুনঃব্যবহারকোড পুনঃব্যবহারযোগ্যতা বৃদ্ধি করে।একাধিক ক্লাসের মধ্যে সাধারণ ফাংশন বা মেথড ব্যবহার করা যায়।
অভিযোগ/ব্যবহারনতুন ক্লাস তৈরি করতে বা আগের ক্লাসের বৈশিষ্ট্য পুনরায় ব্যবহার করতে।একাধিক ফাংশন বা মেথডের জন্য একই নাম ব্যবহার করে বিভিন্ন আচরণ তৈরি।
ফাংশনালিটিএকাধিক ক্লাসের মধ্যে আচরণ ভাগাভাগি করে।একাধিক ক্লাসের জন্য একটি সাধারণ ইন্টারফেস ব্যবহার করে ভিন্ন আচরণ।

সারসংক্ষেপ:

  • Inheritance ক্লাসের মধ্যে বৈশিষ্ট্য এবং আচরণ ভাগাভাগি করার প্রক্রিয়া। এটি কোড পুনঃব্যবহার এবং প্রসারণের জন্য অত্যন্ত উপকারী।
  • Polymorphism একই ইন্টারফেস বা ফাংশনের মাধ্যমে বিভিন্ন ক্লাসের অবজেক্টের জন্য ভিন্ন আচরণ প্রদান করে, যার ফলে কোড আরও নমনীয় এবং সুবিধাজনক হয়।

এই দুটি ধারণা OOP তে গুরুত্বপূর্ণ ভূমিকা পালন করে, এবং কোডকে আরও প্রাঞ্জল, পরিষ্কার এবং সহজে পরিচালনাযোগ্য করে তোলে।

Content added By

LISP প্রোগ্রামিং ভাষায় Generic Functions এবং Methods একটি অত্যন্ত শক্তিশালী এবং গুরুত্বপূর্ণ বৈশিষ্ট্য, বিশেষত যখন Object-Oriented Programming (OOP) বা CLOS (Common Lisp Object System) ব্যবহৃত হয়। এই কনসেপ্টগুলি মাল্টিপল ডিসপ্যাচ এবং পলিমরফিজম সরবরাহ করে, যেখানে একটি ফাংশন একাধিক ধরনের আর্গুমেন্টের সাথে কাজ করতে পারে এবং সেই আর্গুমেন্টের টাইপ অনুযায়ী আচরণ পরিবর্তন করতে পারে।

এখানে আমরা Generic Functions এবং Methods এর মৌলিক ধারণা, তাদের ব্যবহারের ধরন এবং উদাহরণ নিয়ে আলোচনা করব।


১. Generic Functions (জেনেরিক ফাংশন)

Generic Functions হল এমন ফাংশন যা একাধিক ক্লাসের বিভিন্ন ইনস্ট্যান্সের উপর কাজ করতে পারে এবং সেই ক্লাসের উপর নির্ভর করে তাদের আচরণ পরিবর্তিত হয়। LISP এর CLOS সিস্টেমের মাধ্যমে এটি সম্ভব হয়।

Generic Function হলো একটি সাধারণ ফাংশন, যা একাধিক methods দ্বারা সাপোর্টেড হয়, এবং ইনপুট আর্গুমেন্টের টাইপ বা ক্লাস অনুযায়ী নির্ধারিত method নির্বাচন করে।

Generic Function ডিফাইন করা:

LISP-এ Generic Functions ডিফাইন করতে defgeneric ব্যবহৃত হয়। এটি একটি সাধারণ ফাংশন তৈরি করে যা পরে defmethod দিয়ে নির্দিষ্ট ইনপুট টাইপের জন্য ব্যবহার করা যায়।

উদাহরণ:

(defgeneric area (shape))

এখানে:

  • area হল একটি generic function, যা কোনও shape এর উপর কাজ করবে।

২. Methods (মেথডস)

Methods হল সেই কোডের ব্লক যা Generic Functions এর সাথে সম্পর্কিত এবং যেগুলি নির্দিষ্ট ইনপুট ক্লাস বা টাইপের জন্য নির্ধারিত হয়। Methods ফাংশনের আচরণ নির্ধারণ করে। একটি generic function একাধিক method নিয়ে কাজ করতে পারে, এবং method গুলি ক্লাস বা ইনপুট আর্গুমেন্টের টাইপের ওপর ভিত্তি করে পৃথক পৃথক কাজ করতে পারে।

Method ডিফাইন করা:

LISP-এ Methods ডিফাইন করতে defmethod ব্যবহৃত হয়। defmethod এক বা একাধিক ক্লাসের উপর ভিত্তি করে কাজ করার জন্য একটি নির্দিষ্ট ফাংশনের আচরণ সংজ্ঞায়িত করে।

উদাহরণ:

(defmethod area ((shape circle))
  (* pi (expt (radius shape) 2)))

(defmethod area ((shape rectangle))
  (* (length shape) (width shape)))

এখানে:

  • দুটি method তৈরি করা হয়েছে, একটি circle ক্লাসের জন্য এবং অন্যটি rectangle ক্লাসের জন্য।
  • area generic function দুটি ভিন্ন আর্গুমেন্ট টাইপের (circle এবং rectangle) জন্য আলাদা আচরণ নিয়ে কাজ করবে।

৩. Generic Functions এবং Methods এর ব্যবহার

LISP-এর CLOS (Common Lisp Object System)Generic Functions এবং Methods ব্যবহারের উদ্দেশ্য হল কোডের পুনঃব্যবহারযোগ্যতা, স্কেলেবিলিটি এবং মাল্টিপল ডিসপ্যাচ সুবিধা প্রদান করা।

উদাহরণ: বিভিন্ন ধরনের আকারের জন্য Generic Functions এবং Methods ব্যবহার

ধরা যাক, আমরা circle, rectangle, এবং square ক্লাসের জন্য একটি area generic function তৈরি করতে চাই।

  1. ক্লাস ডিফাইন করা:
    ```lisp
    (defclass circle ()
    ((radius :initarg :radius :accessor radius)))

(defclass rectangle ()
((length :initarg :length :accessor length)
(width :initarg :width :accessor width)))

(defclass square (rectangle) ())


এখানে:
- আমরা তিনটি ক্লাস তৈরি করেছি: **circle**, **rectangle**, এবং **square**।

2. **Generic Function ডিফাইন করা**:
```lisp
(defgeneric area (shape))

এখানে:

  • area একটি generic function যা shape নামক আর্গুমেন্ট নেবে এবং তার উপর নির্ভর করে method নির্বাচন করবে।
  1. Methods ডিফাইন করা:
    ```lisp
    (defmethod area ((shape circle))
    (* pi (expt (radius shape) 2)))

(defmethod area ((shape rectangle))
(* (length shape) (width shape)))

(defmethod area ((shape square))
(area (make-instance 'rectangle :length (length shape) :width (width shape))))


এখানে:
- **`area`** generic function এর জন্য আলাদা **method** তৈরি করা হয়েছে `circle`, `rectangle`, এবং `square` ক্লাসের জন্য।

4. **ব্যবহার**:
```lisp
(let ((c (make-instance 'circle :radius 3))
      (r (make-instance 'rectangle :length 4 :width 5))
      (s (make-instance 'square :length 4 :width 4)))
  (print (area c))  ; আউটপুট: 28.2743
  (print (area r))  ; আউটপুট: 20
  (print (area s))) ; আউটপুট: 20

এখানে:

  • area generic function নির্দিষ্ট ক্লাসের method অনুসারে কাজ করছে এবং ভিন্ন ভিন্ন আর্গুমেন্টের জন্য ভিন্ন আউটপুট প্রদান করছে।

৪. Multiple Dispatch (মাল্টিপল ডিসপ্যাচ)

LISP-এর Generic Functions multiple dispatch সমর্থন করে, অর্থাৎ একই ফাংশন একাধিক ইনপুট টাইপের উপর ভিত্তি করে আলাদা আচরণ করে। এর ফলে, কোড আরও নমনীয় এবং ভিন্ন ভিন্ন ডেটা টাইপের জন্য একই ফাংশন একাধিক কাজ করতে সক্ষম হয়।

উদাহরণ:

ধরা যাক, আমরা add নামক একটি ফাংশন তৈরি করতে চাই যা দুটি ইনপুটের ধরণ অনুসারে ভিন্ন আচরণ করবে।

(defgeneric add (x y))

(defmethod add ((x integer) (y integer))
  (+ x y))

(defmethod add ((x string) (y string))
  (concatenate 'string x y))

এখানে:

  • add generic function দুটি ইনপুটের ধরণ অনুযায়ী ভিন্ন ভিন্ন method দিয়ে কাজ করবে। যদি ইনপুট integer হয়, তাহলে যোগফল করবে, এবং যদি ইনপুট string হয়, তাহলে concatenation করবে।

সারসংক্ষেপ

  • Generic Functions LISP-এ এমন ফাংশন যা একাধিক ধরনের ইনপুটের জন্য বিভিন্ন methods গ্রহণ করে এবং সেই ইনপুটের টাইপ অনুযায়ী কাজ করে।
  • Methods হল সেই কোডের অংশ যা generic functions এর জন্য নির্দিষ্ট ইনপুট ক্লাস বা টাইপের জন্য আচরণ নির্ধারণ করে।
  • LISP-এর CLOS সিস্টেমের মাধ্যমে polymorphism এবং multiple dispatch সহজে পরিচালনা করা যায়, যেখানে একটি ফাংশন একাধিক আর্গুমেন্ট টাইপের জন্য আলাদা আচরণ করতে পারে।

এই কৌশলগুলি OOP এর মতো একটি শক্তিশালী এবং নমনীয় ডেভেলপমেন্ট প্যাটার্ন তৈরি করতে সাহায্য করে, যা কোডের পুনঃব্যবহারযোগ্যতা এবং স্কেলেবিলিটি বৃদ্ধি করে।

Content added By
Promotion

Are you sure to start over?

Loading...