অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ফোরট্রানে (Object-Oriented Programming in Fortran)
ফোরট্রান ২০০৩ এবং এর পরের সংস্করণে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (OOP) সমর্থন করা হয়েছে, যা প্রোগ্রামের মডুলারিটি ও পুনঃব্যবহারযোগ্যতা বৃদ্ধি করতে সহায়ক। OOP ধারণাগুলির মধ্যে প্রধানত ক্লাস এবং অবজেক্ট তৈরি, ইনহেরিটেন্স, পলিমরফিজম, এবং এনক্যাপসুলেশন অন্তর্ভুক্ত।
১. ক্লাস এবং অবজেক্টস
ফোরট্রানে OOP-এর মূল ভিত্তি হলো derived types, যা একটি ক্লাস হিসেবে কাজ করে। Derived types এর মাধ্যমে ডেটা এবং ফাংশন একত্রে সংরক্ষণ করা হয়।
উদাহরণ: একটি সাধারণ ক্লাস তৈরি
module person_module
type :: Person
character(len=20) :: name
integer :: age
contains
procedure :: display
end type Person
contains
subroutine display(this)
class(Person), intent(in) :: this
print *, "Name:", this%name
print *, "Age:", this%age
end subroutine display
end module person_module
program main
use person_module
type(Person) :: student
student%name = "Alice"
student%age = 21
call student%display()
end program mainএখানে:
Personনামক একটিtypeডেরাইভড টাইপ হিসেবে তৈরি করা হয়েছে যা একটি ক্লাসের মতো কাজ করে।displayনামে একটি মেম্বার ফাংশন রয়েছে, যাPersonঅবজেক্টের তথ্য প্রিন্ট করে।
২. এনক্যাপসুলেশন
এনক্যাপসুলেশন হল ডেটা এবং প্রোগ্রামের এক্সেস নিয়ন্ত্রণ করা। ফোরট্রানে private এবং public অ্যাক্সেস মডিফায়ার ব্যবহার করে মেম্বার ভেরিয়েবল এবং মেম্বার ফাংশনকে সীমাবদ্ধ করা যায়।
উদাহরণ: এনক্যাপসুলেশন
module encapsulation_example
type, public :: Person
private
character(len=20) :: name
integer :: age
contains
procedure, public :: set_data
procedure, public :: display
end type Person
contains
subroutine set_data(this, name, age)
class(Person), intent(inout) :: this
character(len=*), intent(in) :: name
integer, intent(in) :: age
this%name = name
this%age = age
end subroutine set_data
subroutine display(this)
class(Person), intent(in) :: this
print *, "Name:", this%name
print *, "Age:", this%age
end subroutine display
end module encapsulation_example
program main
use encapsulation_example
type(Person) :: student
call student%set_data("Bob", 22)
call student%display()
end program mainএখানে:
nameএবংageমেম্বারগুলোprivateহিসেবে নির্ধারণ করা হয়েছে এবং সরাসরি এক্সেস করতে দেওয়া হয়নি।set_dataমেম্বার ফাংশন ব্যবহার করেnameএবংageএর মান সেট করা হয়েছে, যা এনক্যাপসুলেশনের মাধ্যমে ডেটা সুরক্ষিত রাখে।
৩. ইনহেরিটেন্স
ফোরট্রানে OOP এর মাধ্যমে একটি type অন্য একটি type থেকে বৈশিষ্ট্য উত্তরাধিকার করতে পারে। extends কিওয়ার্ড ব্যবহার করে ইনহেরিটেন্স কার্যকর করা হয়।
উদাহরণ: ইনহেরিটেন্স
module inheritance_example
type :: Person
character(len=20) :: name
integer :: age
contains
procedure :: display
end type Person
type, extends(Person) :: Student
character(len=20) :: university
contains
procedure :: display
end type Student
contains
subroutine display(this)
class(Person), intent(in) :: this
print *, "Name:", this%name
print *, "Age:", this%age
end subroutine display
subroutine display(this)
class(Student), intent(in) :: this
call this%Person%display()
print *, "University:", this%university
end subroutine display
end module inheritance_example
program main
use inheritance_example
type(Student) :: student
student%name = "Charlie"
student%age = 20
student%university = "MIT"
call student%display()
end program mainএখানে:
PersonথেকেStudentডেরাইভড টাইপ ইনহেরিট করেছে।displayসাবরুটিনStudentক্লাসে ওভাররাইড করা হয়েছে এবংPersonএরdisplayসাবরুটিনও কল করা হচ্ছে।
৪. পলিমরফিজম (Polymorphism)
ফোরট্রানে class এবং select type কন্সট্রাক্ট ব্যবহার করে পলিমরফিজম তৈরি করা যায়। এর মাধ্যমে বিভিন্ন টাইপের অবজেক্টগুলির জন্য একক ইন্টারফেস তৈরি করা সম্ভব হয়।
উদাহরণ: পলিমরফিজম
module polymorphism_example
type :: Person
character(len=20) :: name
contains
procedure :: display
end type Person
type, extends(Person) :: Student
character(len=20) :: university
contains
procedure :: display
end type Student
contains
subroutine display(this)
class(Person), intent(in) :: this
print *, "Name:", this%name
end subroutine display
subroutine display(this)
class(Student), intent(in) :: this
call this%Person%display()
print *, "University:", this%university
end subroutine display
end module polymorphism_example
program main
use polymorphism_example
class(Person), pointer :: p
type(Student), target :: student
student%name = "Diana"
student%university = "Harvard"
p => student
call p%display() ! পলিমরফিকভাবে Student এর display কল করা
end program mainএখানে:
PersonএবংStudentডেরাইভড টাইপ ব্যবহার করা হয়েছে, যেখানেdisplayসাবরুটিন ওভাররাইড করা হয়েছে।class(Person), pointer :: pদ্বারা পলিমরফিজম তৈরি করা হয়েছে এবং পয়েন্টার ব্যবহার করেStudentক্লাসেরdisplayসাবরুটিন কল করা হয়েছে।
উপসংহার
ফোরট্রানে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের (OOP) ধারণা ক্লাস, অবজেক্ট, ইনহেরিটেন্স, পলিমরফিজম, এবং এনক্যাপসুলেশন এর মাধ্যমে বাস্তবায়ন করা যায়। ফোরট্রান ২০০৩ এবং এর পরবর্তী সংস্করণে OOP সমর্থিত হওয়ায়, এটি মডুলার, পুনঃব্যবহারযোগ্য, এবং সহজে পরিচালনাযোগ্য প্রোগ্রাম তৈরি করতে সহায়ক।
ফোরট্রানে Object-Oriented Programming (OOP) এর ধারণা
ফোরট্রান একটি প্রাথমিকভাবে প্রক্রিয়াভিত্তিক ভাষা, তবে আধুনিক ফোরট্রান সংস্করণগুলি (বিশেষ করে Fortran 90 এবং এর পরবর্তী সংস্করণ) অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) সমর্থন করতে সক্ষম হয়েছে। ফোরট্রানে OOP ধারণাটি প্রয়োগ করা সম্ভব এবং এতে ক্লাস, ইনহেরিট্যান্স, পলিমরফিজম, এবং এনক্যাপসুলেশন এর মতো মৌলিক বৈশিষ্ট্য অন্তর্ভুক্ত করা হয়েছে।
ফোরট্রানে OOP ব্যবহারের মাধ্যমে ডেটা এবং ফাংশনগুলিকে একত্রিত করে একটি উন্নত, মডুলার এবং পুনঃব্যবহারযোগ্য প্রোগ্রামিং কাঠামো তৈরি করা সম্ভব। ফোরট্রান 2003 থেকে এই ধারণাটি পূর্ণাঙ্গভাবে সমর্থিত, এবং এটি নতুন প্রোগ্রামিং পদ্ধতি আনার ক্ষেত্রে সহায়ক।
১. ক্লাস (Class)
ফোরট্রানে একটি Class হলো ডেটা এবং কার্যকলাপের একটি কাঠামো যা একত্রে রাখা হয়। ক্লাসে ভেরিয়েবল (প্রোপার্টি) এবং ফাংশন বা সাবরুটিন (মেথড) থাকে। এটি OOP-তে এনক্যাপসুলেশন এর একটি উদাহরণ, যেখানে ডেটা এবং কার্যকলাপ একত্রিত থাকে।
উদাহরণ:
MODULE vehicle_module
TYPE(vehicle)
CHARACTER(LEN=20) :: brand
INTEGER :: year
CONTAINS
PROCEDURE :: set_details
PROCEDURE :: display_details
END TYPE vehicle
CONTAINS
SUBROUTINE set_details(this, brand_name, model_year)
CLASS(vehicle), INTENT(INOUT) :: this
CHARACTER(LEN=20), INTENT(IN) :: brand_name
INTEGER, INTENT(IN) :: model_year
this%brand = brand_name
this%year = model_year
END SUBROUTINE set_details
SUBROUTINE display_details(this)
CLASS(vehicle), INTENT(IN) :: this
PRINT *, 'Brand: ', this%brand
PRINT *, 'Year: ', this%year
END SUBROUTINE display_details
END MODULE vehicle_module
PROGRAM test_vehicle
USE vehicle_module
TYPE(vehicle) :: car
CALL car%set_details('Toyota', 2020)
CALL car%display_details()
END PROGRAM test_vehicleএখানে:
- vehicle নামক একটি ক্লাস তৈরি করা হয়েছে, যাতে দুটি সদস্য (properties):
brandএবংyearরয়েছে। - ক্লাসের মধ্যে দুটি method (
set_detailsএবংdisplay_details) রয়েছে, যা ক্লাসের ডেটা সেট এবং প্রদর্শন করবে।
আউটপুট:
Brand: Toyota
Year: 2020২. ইনহেরিট্যান্স (Inheritance)
ফোরট্রানে ইনহেরিট্যান্স একটি ক্লাস থেকে অন্য ক্লাসের বৈশিষ্ট্য এবং কার্যকলাপের উত্তরাধিকার নেওয়ার প্রক্রিয়া। আপনি একটি বেস ক্লাস তৈরি করতে পারেন এবং সেই ক্লাসের বৈশিষ্ট্য অন্য ক্লাসে উত্তরাধিকারী হিসেবে ব্যবহার করতে পারেন।
উদাহরণ:
MODULE vehicle_module
TYPE, PUBLIC :: vehicle
CHARACTER(LEN=20) :: brand
INTEGER :: year
CONTAINS
PROCEDURE :: set_details
PROCEDURE :: display_details
END TYPE vehicle
TYPE, EXTENDS(vehicle) :: car
CHARACTER(LEN=20) :: fuel_type
CONTAINS
PROCEDURE :: set_car_details
PROCEDURE :: display_car_details
END TYPE car
CONTAINS
SUBROUTINE set_details(this, brand_name, model_year)
CLASS(vehicle), INTENT(INOUT) :: this
CHARACTER(LEN=20), INTENT(IN) :: brand_name
INTEGER, INTENT(IN) :: model_year
this%brand = brand_name
this%year = model_year
END SUBROUTINE set_details
SUBROUTINE display_details(this)
CLASS(vehicle), INTENT(IN) :: this
PRINT *, 'Brand: ', this%brand
PRINT *, 'Year: ', this%year
END SUBROUTINE display_details
SUBROUTINE set_car_details(this, fuel)
CLASS(car), INTENT(INOUT) :: this
CHARACTER(LEN=20), INTENT(IN) :: fuel
this%fuel_type = fuel
END SUBROUTINE set_car_details
SUBROUTINE display_car_details(this)
CLASS(car), INTENT(IN) :: this
CALL this%display_details()
PRINT *, 'Fuel Type: ', this%fuel_type
END SUBROUTINE display_car_details
END MODULE vehicle_module
PROGRAM test_vehicle
USE vehicle_module
TYPE(car) :: my_car
CALL my_car%set_details('Toyota', 2022)
CALL my_car%set_car_details('Gasoline')
CALL my_car%display_car_details()
END PROGRAM test_vehicleএখানে:
carক্লাস,vehicleক্লাস থেকে ইনহেরিট করা হয়েছে।carক্লাসে অতিরিক্ত একটি সদস্যfuel_typeএবং নতুন একটি মেথডset_car_detailsএবংdisplay_car_detailsযোগ করা হয়েছে।
আউটপুট:
Brand: Toyota
Year: 2022
Fuel Type: Gasoline৩. পলিমরফিজম (Polymorphism)
ফোরট্রানে পলিমরফিজম একটি ধারণা, যেখানে একটি ফাংশন বা সাবরুটিন একাধিকভাবে ব্যবহার করা যেতে পারে, যদিও তাদের প্যারামিটার বা কার্যকারিতা আলাদা হতে পারে। ফোরট্রানে এটি CLASS এবং EXTENDS কিওয়ার্ড ব্যবহার করে করা যায়।
উদাহরণ:
MODULE shape_module
TYPE, ABSTRACT :: shape
CONTAINS
PROCEDURE :: area
END TYPE shape
TYPE, EXTENDS(shape) :: circle
REAL :: radius
CONTAINS
PROCEDURE :: area
END TYPE circle
TYPE, EXTENDS(shape) :: rectangle
REAL :: length, width
CONTAINS
PROCEDURE :: area
END TYPE rectangle
CONTAINS
FUNCTION area(this)
CLASS(shape), INTENT(IN) :: this
REAL :: area
area = 0.0
END FUNCTION area
FUNCTION area(this)
CLASS(circle), INTENT(IN) :: this
REAL :: area
area = 3.14159 * this%radius**2
END FUNCTION area
FUNCTION area(this)
CLASS(rectangle), INTENT(IN) :: this
REAL :: area
area = this%length * this%width
END FUNCTION area
END MODULE shape_module
PROGRAM test_shapes
USE shape_module
TYPE(circle) :: c
TYPE(rectangle) :: r
c%radius = 5.0
r%length = 4.0
r%width = 3.0
PRINT *, 'Area of circle: ', area(c)
PRINT *, 'Area of rectangle: ', area(r)
END PROGRAM test_shapesএখানে:
- Shape একটি অ্যাবস্ট্রাক্ট টাইপ (base class) হিসেবে কাজ করে, এবং circle ও rectangle এর মত দুইটি derived class তৈরি করা হয়েছে।
- প্রতিটি ক্লাসে
areaফাংশন পৃথকভাবে কাজ করে, তবে একই নামের ফাংশন ব্যবহার করা হয়েছে (পলিমরফিজম)।
আউটপুট:
Area of circle: 78.539750
Area of rectangle: 12.000000৪. Encapsulation (এনক্যাপসুলেশন)
Encapsulation ফোরট্রানে ক্লাসের ভিতরের ডেটাকে একটি সীমাবদ্ধ পরিবেশে রাখতে এবং বাহ্যিক অ্যাক্সেস কন্ট্রোল করতে সহায়ক। এতে ডেটার নিরাপত্তা নিশ্চিত হয়, কারণ বাহ্যিক কোড সরাসরি ডেটা পরিবর্তন করতে পারে না।
উদাহরণ:
MODULE account_module
TYPE, PUBLIC :: bank_account
REAL :: balance
CONTAINS
PROCEDURE :: deposit
PROCEDURE :: withdraw
PROCEDURE :: get_balance
END TYPE bank_account
CONTAINS
SUBROUTINE deposit(this, amount)
CLASS(bank_account), INTENT(INOUT) :: this
REAL, INTENT(IN) :: amount
this%balance = this%balance + amount
END SUBROUTINE deposit
SUBROUTINE withdraw(this, amount)
CLASS(bank_account), INTENT(INOUT) :: this
REAL, INTENT(IN) :: amount
IF (this%balance >= amount) THEN
this%balance = this%balance - amount
ELSE
PRINT *, 'Insufficient funds!'
END IF
END SUBROUTINE withdraw
FUNCTION get_balance(this) RESULT(balance)
CLASS(bank_account), INTENT(IN) :: this
REAL :: balance
balance = this%balance
END FUNCTION get_balance
END MODULE account_module
PROGRAM test_account
USE account_module
TYPE(bank_account) :: my_account
CALL my_account%deposit(500.0)
CALL my_account%withdraw(200.0)
PRINT *, 'Balance: ', my_account%get_balance()
END PROGRAM test_accountএখানে:
bank_accountক্লাসের ভিতরের ডেটা (যেমন ব্যালেন্স) শুধুমাত্র মেথডের মাধ্যমে অ্যাক্সেস এবং পরিবর্তন করা যায়।
আউটপুট:
Balance: 300.000000উপসংহার
ফোরট্রানে Object-Oriented Programming (OOP) ধারণা ব্যবহার করে ডেটা এবং কার্যকলাপ একত্রিত করা যায়, যার মাধ্যমে কোড আরও মডুলার, পুনঃব্যবহারযোগ্য এবং রক্ষণাবেক্ষণযোগ্য হয়। ফোরট্রানে OOP এর মৌলিক ধারণাগুলি অন্তর্ভুক্ত রয়েছে:
- ক্লাস (Class): ডেটা এবং ফাংশনের সমন্বয়।
- ইনহেরিট্যান্স (Inheritance): এক ক্লাস থেকে অন্য ক্লাসের বৈশিষ্ট্য অর্জন।
- পলিমরফিজম (Polymorphism): একাধিক ফাংশন বা সাবরুটিনের ব্যবহার।
- এনক্যাপসুলেশন (Encapsulation): ডেটাকে সুরক্ষিত রাখা এবং বাহ্যিক অ্যাক্সেস নিয়ন্ত্রণ করা।
ফোরট্রানে OOP ব্যবহার করে আরও উন্নত, সংগঠিত এবং নির্ভুল কোড লেখা সম্ভব।
ফোরট্রানে Class এবং Object এর ব্যবহার
ফোরট্রান 90 সংস্করণ থেকে Object-Oriented Programming (OOP) এর ধারণা যোগ করা হয়েছে, যার মধ্যে Class এবং Object একটি মৌলিক অংশ হিসেবে ব্যবহৃত হয়। Class একটি template বা blueprint হিসেবে কাজ করে, যা Object তৈরি করার জন্য ব্যবহৃত হয়। ফোরট্রানে Class এবং Object এর ব্যবহার প্রোগ্রামিংয়ের মডুলারিটি এবং রিইউসেবিলিটি বাড়ানোর জন্য গুরুত্বপূর্ণ।
ফোরট্রানে Class এবং Object তৈরি এবং ব্যবহারের জন্য type, type-bound procedures (methods), এবং instantiate এর মতো কনসেপ্টগুলো ব্যবহার করা হয়।
১. Class তৈরি করা
ফোরট্রানে Class তৈরির জন্য type কিওয়ার্ড ব্যবহার করা হয়। একটি Class ডেটা এবং ফাংশন (methods) ধারণ করতে পারে। একটি Class-এ ডেটা সদস্য (data members) এবং মেথড (methods) অন্তর্ভুক্ত থাকে।
Class তৈরি করার সাধারণ গঠন:
type :: class_name
! সদস্য ভ্যারিয়েবল বা ডেটা সদস্য
integer :: member_variable
real :: another_member
! মেথড বা টাইপ-বাউন্ড প্রোসিডিউর
contains
procedure :: method_name
end type class_nametype: ফোরট্রানে Class বা derived type ঘোষণা করতে ব্যবহৃত হয়।contains: এখানে method বা function ঘোষণা করা হয়।
Class এর উদাহরণ:
module person_module
implicit none
type :: Person
character(len=30) :: name
integer :: age
contains
procedure :: set_name
procedure :: set_age
procedure :: display
end type Person
contains
! মেথড যা নাম সেট করে
subroutine set_name(this, new_name)
class(Person), intent(inout) :: this
character(len=30), intent(in) :: new_name
this%name = new_name
end subroutine set_name
! মেথড যা বয়স সেট করে
subroutine set_age(this, new_age)
class(Person), intent(inout) :: this
integer, intent(in) :: new_age
this%age = new_age
end subroutine set_age
! মেথড যা তথ্য প্রদর্শন করে
subroutine display(this)
class(Person), intent(in) :: this
print *, 'Name: ', this%name
print *, 'Age: ', this%age
end subroutine display
end module person_moduleএখানে:
Personএকটি ক্লাস, যার মধ্যেnameএবংageসদস্য ভ্যারিয়েবল রয়েছে।set_name,set_age, এবংdisplayমেথড বা টাইপ-বাউন্ড প্রোসিডিউর রয়েছে।
২. Object তৈরি এবং Class এর মেথড ব্যবহার করা
ফোরট্রানে Object তৈরি করার জন্য type-এর একটি ভ্যারিয়েবল তৈরি করা হয়। এই ভ্যারিয়েবলটি Class থেকে আসবে এবং method ব্যবহার করার জন্য তা কল করা হয়।
Object তৈরি এবং ব্যবহার করার উদাহরণ:
program object_example
use person_module
implicit none
type(Person) :: person1 ! Object তৈরি করা
character(len=30) :: input_name
integer :: input_age
! নাম এবং বয়স ইনপুট
print *, 'Enter name:'
read *, input_name
print *, 'Enter age:'
read *, input_age
! Object এর মেথড ব্যবহার
call person1%set_name(input_name)
call person1%set_age(input_age)
! Object এর তথ্য প্রদর্শন করা
call person1%display()
end program object_exampleএখানে:
type(Person)ব্যবহার করেperson1নামে একটি Object তৈরি করা হয়েছে, যাPersonক্লাসের একটি ইনস্ট্যান্স।set_nameএবংset_ageমেথডের মাধ্যমেperson1এরnameএবংageসেট করা হয়েছে।- অবশেষে,
displayমেথড ব্যবহার করেperson1এর তথ্য প্রিন্ট করা হয়েছে।
আউটপুট:
Enter name:
John
Enter age:
30
Name: John
Age: 30৩. Class এর মেম্বার ভ্যারিয়েবল এবং মেথড
ফোরট্রানে Class এর মধ্যে ভ্যারিয়েবল এবং ফাংশন/মেথড দুটি আলাদা করা যায়:
- মেম্বার ভ্যারিয়েবল (Member Variables): ডেটা সদস্য যা ক্লাসের মধ্যে সংরক্ষিত থাকে। প্রতিটি Object এর নিজস্ব ডেটা থাকে।
- মেথড (Methods): ক্লাসের মধ্যে ডিফাইন করা ফাংশন বা সাবরুটিন, যা ক্লাসের ডেটা পরিচালনা করতে সহায়ক।
৪. Encapsulation, Inheritance, and Polymorphism
ফোরট্রানে OOP ধারণা খুবই মৌলিক এবং Encapsulation (তথ্য লুকানো), Inheritance (উত্তরণ), এবং Polymorphism (একাধিক রূপ) এর মতো ক্ষমতা পুরোপুরি সমর্থিত নয়। তবে, ফোরট্রান 2003 সংস্করণ থেকে Encapsulation এবং Polymorphism এর কিছু রূপ পাওয়া যায়।
- Encapsulation: ক্লাসের মধ্যে ডেটা এবং ফাংশনগুলিকে একত্রিত করা যাতে বাইরের কোড অ্যাক্সেস করতে না পারে।
- Inheritance: এক ক্লাস থেকে অন্য ক্লাসের বৈশিষ্ট্য উত্তরাধিকারীভাবে গ্রহণ করা।
- Polymorphism: একাধিক ফাংশন বা মেথড যা একই নামের সাথে কাজ করতে পারে, কিন্তু তাদের আচরণ ভিন্ন হতে পারে।
৫. Class ব্যবহার করার সুবিধা
- ডেটা সংগঠন: ক্লাসের মাধ্যমে সম্পর্কিত ডেটাকে একত্রিত করা যায়, যা প্রোগ্রামিং কোডকে আরও মডুলার এবং পরিষ্কার করে তোলে।
- কোড পুনঃব্যবহারযোগ্যতা: একবার তৈরি করা ক্লাস পুনঃব্যবহার করা যায় অন্যান্য অংশে বা অন্যান্য প্রোগ্রামে।
- ডেটা এবং কার্যকলাপ একত্রিত: ক্লাসে ডেটা এবং কার্যকলাপ (ফাংশন/মেথড) একত্রিত করার মাধ্যমে কোড রক্ষণাবেক্ষণ সহজ হয়।
- বড় প্রজেক্টে সুবিধা: বড় এবং জটিল প্রজেক্টে কোডের মডুলারিটি এবং সুসংগততা বজায় রাখে।
উপসংহার
ফোরট্রানে Class এবং Object ব্যবহারের মাধ্যমে আপনি আরও মডুলার, পরিষ্কার এবং পুনঃব্যবহারযোগ্য কোড লিখতে পারবেন। Object-Oriented Programming (OOP) ফিচারগুলি ফোরট্রানে type, type-bound procedures এবং object instances এর মাধ্যমে বাস্তবায়ন করা সম্ভব, যা প্রোগ্রামের জটিলতা কমিয়ে দেয় এবং রক্ষণাবেক্ষণ সহজ করে তোলে।
ফোরট্রানে Inheritance এবং Polymorphism এর ব্যবহার
ফোরট্রান 90 থেকে শুরু করে আধুনিক ফোরট্রান সংস্করণগুলোতে Object-Oriented Programming (OOP) এর বৈশিষ্ট্য যেমন Inheritance এবং Polymorphism সাপোর্ট করা হয়েছে। এই ধারণাগুলি কেবলমাত্র কোডের পুনঃব্যবহারযোগ্যতা এবং রক্ষণাবেক্ষণ সহজতরই করে না, বরং প্রোগ্রামিংয়ের কাঠামো আরও সহজ এবং কার্যকর করে তোলে। যদিও ফোরট্রান OOP এর পূর্ণাঙ্গ সমর্থন প্রদান না করলেও, এটি কিছু মৌলিক ধারণা যেমন ইনহেরিট্যান্স এবং পলিমরফিজম সাপোর্ট করে।
১. Inheritance (উত্তরণ)
Inheritance হল একটি প্রোগ্রামিং ধারণা যেখানে একটি ক্লাস বা টাইপ অন্য ক্লাস বা টাইপ থেকে বৈশিষ্ট্য ও আচরণ (attributes and behaviors) উত্তরাধিকারসূত্রে গ্রহণ করে। ফোরট্রানে ইনহেরিট্যান্স কাজ করার জন্য সাধারণত type extension ব্যবহৃত হয়, যার মাধ্যমে একটি টাইপ নতুন বৈশিষ্ট্য এবং আচরণ পেতে পারে।
উদাহরণ: Type Extension (Inheritance)
module vehicle
implicit none
type :: vehicle_type
character(len=50) :: brand
real :: speed
contains
procedure :: display => display_vehicle
end type vehicle_type
contains
subroutine display_vehicle(this)
class(vehicle_type), intent(in) :: this
print *, "Brand: ", this%brand
print *, "Speed: ", this%speed
end subroutine display_vehicle
end module vehicle
module car
use vehicle
implicit none
type, extends(vehicle_type) :: car_type
character(len=50) :: model
contains
procedure :: display => display_car
end type car_type
contains
subroutine display_car(this)
class(car_type), intent(in) :: this
call display_vehicle(this%vehicle)
print *, "Model: ", this%model
end subroutine display_car
end module car
program main
use car
type(car_type) :: my_car
my_car%vehicle%brand = "Toyota"
my_car%vehicle%speed = 120.0
my_car%model = "Corolla"
call my_car%display()
end program mainব্যাখ্যা:
- vehicle_type হলো একটি বেস টাইপ যা brand এবং speed এর বৈশিষ্ট্য ধারণ করে।
- car_type হলো একটি extended type যা vehicle_type থেকে ইনহেরিট করে এবং অতিরিক্ত model বৈশিষ্ট্য রাখে।
- car_type এ
display_carসাবরুটিনে,display_vehicleনামক বেস টাইপেরdisplayফাংশনটি কল করা হয়েছে।
আউটপুট:
Brand: Toyota
Speed: 120.0
Model: Corollaব্যাখ্যা:
- Inheritance এর মাধ্যমে car_type টাইপটি vehicle_type থেকে বৈশিষ্ট্য উত্তরাধিকার হিসেবে পেয়েছে, এবং আমরা নতুন বৈশিষ্ট্য (model) যোগ করেছি।
২. Polymorphism (পলিমরফিজম)
Polymorphism হল একটি ধারণা যা একটি ইন্টারফেসের মাধ্যমে বিভিন্ন ধরনের অবজেক্টকে পরিচালনা করার সুযোগ দেয়। ফোরট্রানে polymorphism সাধারণত procedure overloading বা class polymorphism আকারে ব্যবহার করা হয়। ফোরট্রানে ক্লাস পলিমরফিজম করার জন্য, class type-bound procedure ব্যবহার করা হয়।
ফোরট্রানে পলিমরফিজম কেবলমাত্র type-bound procedures (অর্থাৎ methods) এবং procedure pointers এর মাধ্যমে পরিচালিত হয়।
উদাহরণ: Polymorphism using Type-bound Procedures
module animal
implicit none
type :: animal_type
character(len=50) :: name
contains
procedure :: speak
end type animal_type
type, extends(animal_type) :: dog_type
contains
procedure :: speak => dog_speak
end type dog_type
type, extends(animal_type) :: cat_type
contains
procedure :: speak => cat_speak
end type cat_type
contains
subroutine dog_speak(this)
class(dog_type), intent(in) :: this
print *, this%name, " says Woof!"
end subroutine dog_speak
subroutine cat_speak(this)
class(cat_type), intent(in) :: this
print *, this%name, " says Meow!"
end subroutine cat_speak
end module animal
program main
use animal
type(dog_type) :: dog
type(cat_type) :: cat
dog%name = "Rex"
cat%name = "Whiskers"
call dog%speak() ! Outputs: Rex says Woof!
call cat%speak() ! Outputs: Whiskers says Meow!
end program mainব্যাখ্যা:
- এখানে, animal_type হলো বেস টাইপ, এবং dog_type ও cat_type হলো এর এক্সটেনশন।
- speak হলো একটি টাইপ-বাউন্ড সাবরুটিন যা dog_type এবং cat_type এর জন্য ভিন্নভাবে কাজ করবে (অর্থাৎ পলিমরফিক আচরণ)।
- Polymorphism এই উদাহরণে, একই নামের speak সাবরুটিনের মাধ্যমে ভিন্ন আচরণ (উল্লেখযোগ্যভাবে Woof! এবং Meow!) অর্জন করা হয়েছে।
আউটপুট:
Rex says Woof!
Whiskers says Meow!Inheritance এবং Polymorphism এর ব্যবহারের সুবিধা
- Code Reusability: ইনহেরিট্যান্সের মাধ্যমে কোড পুনঃব্যবহারযোগ্য হয়। একবার বেস ক্লাস তৈরি করার পর, তার বৈশিষ্ট্য এবং আচরণ উত্তরাধিকারসূত্রে অন্যান্য ক্লাসে চলে আসে।
- Improved Maintainability: বেস ক্লাসের পরিবর্তন করলে এর সমস্ত সাবক্লাসের কার্যকারিতা আপডেট হয়, যা কোডের রক্ষণাবেক্ষণ সহজ করে।
- Flexibility: পলিমরফিজম ফাংশনগুলিকে বিভিন্ন ধরনের ডেটা দিয়ে ব্যবহার করার সুযোগ দেয়, এবং কোডের বিভিন্ন অংশে একাধিক আউটপুট তৈরি করতে সক্ষম হয়। এটি প্রোগ্রামটিকে আরও ফ্লেক্সিবল এবং শক্তিশালী করে তোলে।
- Clearer and Cleaner Code: ইনহেরিট্যান্স এবং পলিমরফিজমের মাধ্যমে কোড আরও পরিষ্কার, সংগঠিত এবং সহজ হয়ে ওঠে, এবং কোডের পুনঃব্যবহারযোগ্যতা বাড়ায়।
উপসংহার
ফোরট্রানে Inheritance এবং Polymorphism Object-Oriented Programming এর গুরুত্বপূর্ণ ধারণা যা কোডের পুনঃব্যবহারযোগ্যতা, মডুলারিটি এবং রক্ষণাবেক্ষণ সহজ করতে সহায়তা করে। Inheritance এর মাধ্যমে একটি ক্লাস বা টাইপ অন্য ক্লাস বা টাইপ থেকে বৈশিষ্ট্য এবং আচরণ উত্তরাধিকার হিসেবে পেতে পারে, এবং Polymorphism এর মাধ্যমে একটি ইন্টারফেসের মাধ্যমে একাধিক ধরনের অবজেক্টের আচরণ পরিচালনা করা যায়।
অ্যাবস্ট্রাক্ট ইন্টারফেস এবং প্রোসিডিউর বাঁধন (Abstract Interfaces and Procedure Binding)
ফোরট্রানে অ্যাবস্ট্রাক্ট ইন্টারফেস এবং প্রোসিডিউর বাঁধন দুটি শক্তিশালী কৌশল যা কোডের পুনঃব্যবহারযোগ্যতা, নমনীয়তা, এবং একাধিক ফাংশন বা প্রসিডিউরকে পরিচালনা করতে সাহায্য করে। এই কৌশলগুলির মাধ্যমে, আপনি জেনেরিক ফাংশন তৈরি করতে পারেন এবং কোডকে আরও মডুলার এবং পরিষ্কার করতে পারেন।
১. অ্যাবস্ট্রাক্ট ইন্টারফেস (Abstract Interfaces)
অ্যাবস্ট্রাক্ট ইন্টারফেস এমন একটি ইন্টারফেস যা এক বা একাধিক ফাংশন বা প্রসিডিউরের জন্য একটি সাধারণ ঘোষণা বা প্রটোটাইপ প্রদান করে, তবে এই ইন্টারফেসের ভিতরে নির্দিষ্ট কার্যকারিতা বা বাস্তবায়ন (implementation) অন্তর্ভুক্ত থাকে না।
অ্যাবস্ট্রাক্ট ইন্টারফেস ব্যবহৃত হয় যখন বিভিন্ন ফাংশন বা প্রসিডিউর একই নাম ব্যবহার করতে পারে, তবে তাদের বাস্তবায়ন আলাদা হতে পারে। এটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং এর মতো কোডের নমনীয়তা এবং পুনঃব্যবহারযোগ্যতা নিশ্চিত করে।
উদাহরণ:
module abstract_interface
implicit none
contains
! Abstract interface definition
abstract interface
function calculate_area(shape) result(area)
class(*), intent(in) :: shape
real :: calculate_area
end function calculate_area
end interface
end module abstract_interfaceএখানে:
calculate_areaএকটি অ্যাবস্ট্রাক্ট ইন্টারফেস ফাংশন যা বিভিন্ন শেপের জন্য এলাকা গণনা করতে পারে, তবে এটি কোন বিশেষ বাস্তবায়ন নেই।- বাস্তবায়নগুলির জন্য এই ইন্টারফেসকে ব্যবহার করে আরও বিভিন্ন ফাংশন তৈরি করা সম্ভব।
২. প্রোসিডিউর বাঁধন (Procedure Binding)
প্রোসিডিউর বাঁধন হল সেই প্রক্রিয়া যেখানে একটি ফাংশন বা প্রসিডিউর একটি ইন্টারফেসের মাধ্যমে যুক্ত হয়। এটি মূলত ডাইনামিক ফাংশন কল বা জেনেরিক ফাংশন ব্যবহারের জন্য ব্যবহৃত হয়। প্রোসিডিউর বাঁধন প্রোগ্রামের সময় নির্ধারণ করে কোন ফাংশন বা প্রসিডিউরটি কল করা হবে, যখন একই নামের একাধিক ফাংশন বা প্রসিডিউর থাকে।
ফোরট্রানে, প্রোসিডিউর বাঁধন বা জেনেরিক ফাংশন ব্যবহৃত হয় যখন একই নামের একাধিক ফাংশন বা প্রসিডিউর বিভিন্ন টাইপ বা আর্গুমেন্ট নিয়ে কাজ করে।
উদাহরণ:
module procedure_binding
implicit none
contains
! First procedure to calculate area of a circle
function area(radius) result(area)
real, intent(in) :: radius
real :: area
area = 3.14159 * radius**2
end function area
! Second procedure to calculate area of a square
function area(side) result(area)
real, intent(in) :: side
real :: area
area = side**2
end function area
end module procedure_binding
program test_binding
use procedure_binding
real :: circle_area, square_area
! Call the first procedure (circle)
circle_area = area(5.0)
print *, "Area of Circle: ", circle_area
! Call the second procedure (square)
square_area = area(4.0)
print *, "Area of Square: ", square_area
end program test_bindingএখানে:
areaনামক দুটি ভিন্ন ফাংশন আছে, একটি বৃত্তের (circle) এলাকা এবং একটি বর্গের (square) এলাকা বের করার জন্য।- ফোরট্রানে প্রোসিডিউর বাঁধন ব্যবহার করে,
areaফাংশনটি টাইপের ভিত্তিতে বিভিন্ন প্রকারের হিসাব করবে।
৩. অ্যাবস্ট্রাক্ট ইন্টারফেস এবং প্রোসিডিউর বাঁধনের ব্যবহার
অ্যাবস্ট্রাক্ট ইন্টারফেস এবং প্রোসিডিউর বাঁধন একসাথে ব্যবহার করা হলে, একাধিক কার্যাবলী একই নামের অধীনে আলাদা আলাদা ডেটা টাইপ বা আর্গুমেন্টের জন্য কার্যকরী হতে পারে।
উদাহরণ:
module shape_area
implicit none
type, abstract :: shape
contains
procedure(calculate_area), deferred :: area
end type shape
type, extends(shape) :: circle
real :: radius
end type circle
type, extends(shape) :: square
real :: side
end type square
contains
! Calculate area of a circle
function calculate_area_circle(this) result(area)
class(circle), intent(in) :: this
real :: area
area = 3.14159 * this%radius**2
end function calculate_area_circle
! Calculate area of a square
function calculate_area_square(this) result(area)
class(square), intent(in) :: this
real :: area
area = this%side**2
end function calculate_area_square
end module shape_area
program test_abstract
use shape_area
type(circle) :: c
type(square) :: s
c%radius = 5.0
s%side = 4.0
print *, "Area of Circle: ", c%area()
print *, "Area of Square: ", s%area()
end program test_abstractএখানে:
shapeএকটি অ্যাবস্ট্রাক্ট টাইপ, এবং এর মধ্যে একটি ডেফার্ড প্রোসিডিউর (area) রয়েছে যা ভবিষ্যতে বৃত্ত এবং বর্গের জন্য বাস্তবায়িত হবে।circleএবংsquareটাইপ দুটি extends করেshapeটাইপকে এবং তাদের নিজস্বareaফাংশন প্রদান করে।- প্রোসিডিউর বাঁধন ফাংশনটি টাইপের উপর ভিত্তি করে আলাদা ফাংশন কল করবে।
৪. ফায়দা এবং ব্যবহার
- কোড পুনঃব্যবহারযোগ্যতা: অ্যাবস্ট্রাক্ট ইন্টারফেস এবং প্রোসিডিউর বাঁধন ব্যবহার করে কোড পুনঃব্যবহারযোগ্য হয় এবং একাধিক ধরনের ডেটার জন্য একই নামের ফাংশন বা প্রসিডিউর ব্যবহার করা যায়।
- নমনীয়তা: প্রোগ্রামিং আরও নমনীয় হয়, কারণ আপনি একাধিক কার্যাবলী (যেমন বিভিন্ন শেপের জন্য এলাকা গণনা) একটি সাধারণ ইন্টারফেসের মাধ্যমে পরিচালনা করতে পারেন।
- অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP): অ্যাবস্ট্রাক্ট ইন্টারফেস অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের মতো কাজ করে, যা উন্নত প্রোগ্রামিং কৌশল এবং কোড মডুলারাইজেশনে সহায়তা করে।
উপসংহার
অ্যাবস্ট্রাক্ট ইন্টারফেস এবং প্রোসিডিউর বাঁধন ফোরট্রানে কোডের নমনীয়তা এবং পুনঃব্যবহারযোগ্যতা বৃদ্ধি করতে সহায়ক। এগুলি জেনেরিক প্রোগ্রামিং কৌশল যা একাধিক ডেটা টাইপের জন্য একক ইন্টারফেস বা নাম ব্যবহারের মাধ্যমে বিভিন্ন কার্যাবলী সম্পাদন করতে সহায়তা করে, যা কোডের দক্ষতা এবং পরিষ্কারতা নিশ্চিত করে।
Read more