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

ফোরট্রান (Fortran) - Computer Programming

316

অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ফোরট্রানে (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 সমর্থিত হওয়ায়, এটি মডুলার, পুনঃব্যবহারযোগ্য, এবং সহজে পরিচালনাযোগ্য প্রোগ্রাম তৈরি করতে সহায়ক।

Content added By

ফোরট্রানে 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) হিসেবে কাজ করে, এবং circlerectangle এর মত দুইটি 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 এর মৌলিক ধারণাগুলি অন্তর্ভুক্ত রয়েছে:

  1. ক্লাস (Class): ডেটা এবং ফাংশনের সমন্বয়।
  2. ইনহেরিট্যান্স (Inheritance): এক ক্লাস থেকে অন্য ক্লাসের বৈশিষ্ট্য অর্জন।
  3. পলিমরফিজম (Polymorphism): একাধিক ফাংশন বা সাবরুটিনের ব্যবহার।
  4. এনক্যাপসুলেশন (Encapsulation): ডেটাকে সুরক্ষিত রাখা এবং বাহ্যিক অ্যাক্সেস নিয়ন্ত্রণ করা।

ফোরট্রানে OOP ব্যবহার করে আরও উন্নত, সংগঠিত এবং নির্ভুল কোড লেখা সম্ভব।

Content added By

ফোরট্রানে 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_name
  • type: ফোরট্রানে 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 ব্যবহার করার সুবিধা

  1. ডেটা সংগঠন: ক্লাসের মাধ্যমে সম্পর্কিত ডেটাকে একত্রিত করা যায়, যা প্রোগ্রামিং কোডকে আরও মডুলার এবং পরিষ্কার করে তোলে।
  2. কোড পুনঃব্যবহারযোগ্যতা: একবার তৈরি করা ক্লাস পুনঃব্যবহার করা যায় অন্যান্য অংশে বা অন্যান্য প্রোগ্রামে।
  3. ডেটা এবং কার্যকলাপ একত্রিত: ক্লাসে ডেটা এবং কার্যকলাপ (ফাংশন/মেথড) একত্রিত করার মাধ্যমে কোড রক্ষণাবেক্ষণ সহজ হয়।
  4. বড় প্রজেক্টে সুবিধা: বড় এবং জটিল প্রজেক্টে কোডের মডুলারিটি এবং সুসংগততা বজায় রাখে।

উপসংহার

ফোরট্রানে Class এবং Object ব্যবহারের মাধ্যমে আপনি আরও মডুলার, পরিষ্কার এবং পুনঃব্যবহারযোগ্য কোড লিখতে পারবেন। Object-Oriented Programming (OOP) ফিচারগুলি ফোরট্রানে type, type-bound procedures এবং object instances এর মাধ্যমে বাস্তবায়ন করা সম্ভব, যা প্রোগ্রামের জটিলতা কমিয়ে দেয় এবং রক্ষণাবেক্ষণ সহজ করে তোলে।

Content added By

ফোরট্রানে 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_typedisplay_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_typecat_type হলো এর এক্সটেনশন।
  • speak হলো একটি টাইপ-বাউন্ড সাবরুটিন যা dog_type এবং cat_type এর জন্য ভিন্নভাবে কাজ করবে (অর্থাৎ পলিমরফিক আচরণ)।
  • Polymorphism এই উদাহরণে, একই নামের speak সাবরুটিনের মাধ্যমে ভিন্ন আচরণ (উল্লেখযোগ্যভাবে Woof! এবং Meow!) অর্জন করা হয়েছে।

আউটপুট:

Rex says Woof!
Whiskers says Meow!

Inheritance এবং Polymorphism এর ব্যবহারের সুবিধা

  1. Code Reusability: ইনহেরিট্যান্সের মাধ্যমে কোড পুনঃব্যবহারযোগ্য হয়। একবার বেস ক্লাস তৈরি করার পর, তার বৈশিষ্ট্য এবং আচরণ উত্তরাধিকারসূত্রে অন্যান্য ক্লাসে চলে আসে।
  2. Improved Maintainability: বেস ক্লাসের পরিবর্তন করলে এর সমস্ত সাবক্লাসের কার্যকারিতা আপডেট হয়, যা কোডের রক্ষণাবেক্ষণ সহজ করে।
  3. Flexibility: পলিমরফিজম ফাংশনগুলিকে বিভিন্ন ধরনের ডেটা দিয়ে ব্যবহার করার সুযোগ দেয়, এবং কোডের বিভিন্ন অংশে একাধিক আউটপুট তৈরি করতে সক্ষম হয়। এটি প্রোগ্রামটিকে আরও ফ্লেক্সিবল এবং শক্তিশালী করে তোলে।
  4. Clearer and Cleaner Code: ইনহেরিট্যান্স এবং পলিমরফিজমের মাধ্যমে কোড আরও পরিষ্কার, সংগঠিত এবং সহজ হয়ে ওঠে, এবং কোডের পুনঃব্যবহারযোগ্যতা বাড়ায়।

উপসংহার

ফোরট্রানে Inheritance এবং Polymorphism Object-Oriented Programming এর গুরুত্বপূর্ণ ধারণা যা কোডের পুনঃব্যবহারযোগ্যতা, মডুলারিটি এবং রক্ষণাবেক্ষণ সহজ করতে সহায়তা করে। Inheritance এর মাধ্যমে একটি ক্লাস বা টাইপ অন্য ক্লাস বা টাইপ থেকে বৈশিষ্ট্য এবং আচরণ উত্তরাধিকার হিসেবে পেতে পারে, এবং Polymorphism এর মাধ্যমে একটি ইন্টারফেসের মাধ্যমে একাধিক ধরনের অবজেক্টের আচরণ পরিচালনা করা যায়।

Content added By

অ্যাবস্ট্রাক্ট ইন্টারফেস এবং প্রোসিডিউর বাঁধন (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 ফাংশন প্রদান করে।
  • প্রোসিডিউর বাঁধন ফাংশনটি টাইপের উপর ভিত্তি করে আলাদা ফাংশন কল করবে।

৪. ফায়দা এবং ব্যবহার

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

উপসংহার

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

Content added By
Promotion

Are you sure to start over?

Loading...