Object-Oriented Programming Foundations

Introduction to Object-Oriented Design

ReadingPreview

আপনি একটি free preview lesson দেখছেন।

Lesson Overview

Object-Oriented Programming বা OOP শুধু class তৈরি করা, fields private করা, অথবা getters এবং setters লেখার নাম নয়।

OOP হলো software-কে এমন objects-এর মাধ্যমে model করার একটি পদ্ধতি, যাদের:

  • একটি clear responsibility আছে
  • নিজস্ব state আছে
  • meaningful behavior আছে
  • অন্য objects-এর সঙ্গে well-defined relationship আছে

একটি ছোট program-এ সব variables এবং logic main() method-এর মধ্যে রাখা সম্ভব।

public class Main {

    public static void main(String[] args) {
        String learnerName = "Nur";
        int completedLessons = 16;
        int totalLessons = 20;

        double progress =
                completedLessons
                * 100.0
                / totalLessons;

        System.out.println(
                learnerName
                + " completed "
                + progress
                + "% of the course."
        );
    }
}

এই programটি simple এবং readable।

কিন্তু application বড় হলে আমাদের handle করতে হতে পারে:

  • Multiple learners
  • Multiple courses
  • Enrollments
  • Lesson progress
  • Payments
  • Assessments
  • Certificates

তখন শুধু আরও variables এবং আরও conditions যোগ করা sustainable নয়।

আমাদের code এমনভাবে organize করতে হবে, যাতে প্রতিটি business concept-এর state এবং behavior একটি appropriate জায়গায় থাকে।

এই lesson-এ আমরা syntax-এর চেয়ে object-oriented thinking-এর foundation তৈরি করব।


Learning Objectives

এই lesson শেষ করার পর আপনি পারবেন:

  • Object-Oriented Programming-এর purpose ব্যাখ্যা করতে
  • Class এবং object-এর conceptual difference বুঝতে
  • Object-এর state, behavior এবং identity identify করতে
  • Responsibility-based class design বুঝতে
  • Procedural এবং object-oriented approaches-এর trade-off ব্যাখ্যা করতে
  • একটি requirement থেকে possible objects identify করতে
  • Encapsulation, abstraction, inheritance এবং polymorphism-এর purpose সংক্ষেপে বলতে
  • Common beginner OOP misconceptions এড়িয়ে চলতে

Why Do We Need Object-Oriented Design?

ধরা যাক আমাদের একটি learning platform আছে।

একজন learner একটি course-এ enroll করেছে।

আমাদের track করতে হবে:

Learner name
Course title
Completed lessons
Total lessons
Enrollment status

একজন learner-এর জন্য variables লেখা যায়:

String learnerName = "Nur";
String courseTitle =
        "Java and OOP Foundation";

int completedLessons = 16;
int totalLessons = 20;
boolean enrollmentActive = true;

কিন্তু এখন যদি Sakib, Jalisa, Subu, এবং Sumu-এর enrollmentও track করতে হয়, তাহলে একই ধরনের variables বারবার তৈরি করতে হবে।

String firstLearnerName = "Nur";
int firstCompletedLessons = 16;

String secondLearnerName = "Sakib";
int secondCompletedLessons = 18;

String thirdLearnerName = "Jalisa";
int thirdCompletedLessons = 20;

Application বড় হওয়ার সঙ্গে সঙ্গে সমস্যা দেখা দেবে:

  • Related values আলাদা হয়ে যেতে পারে
  • ভুল learner-এর data update হতে পারে
  • Validation বিভিন্ন জায়গায় duplicate হবে
  • একই calculation বারবার লেখা হবে
  • Business rules কোথায় আছে বোঝা কঠিন হবে

OOP related state এবং behavior meaningful units-এর মধ্যে organize করতে সাহায্য করে।

Conceptually:

Learner
Course
Enrollment

প্রতিটি concept-এর আলাদা responsibility থাকতে পারে।


Procedural Thinking and Object-Oriented Thinking

Procedural programming সাধারণত প্রশ্ন করে:

কোন steps execute করতে হবে?

Example:

1. Read completed lesson count
2. Read total lesson count
3. Calculate progress
4. Print the result

Object-oriented design সাধারণত প্রশ্ন করে:

কোন object এই information-এর owner, এবং কোন object এই behavior-এর জন্য responsible?

Example:

Enrollment
- Knows completed lesson count
- Knows total lesson count
- Calculates progress
- Prevents progress from exceeding the course size

দুটির কোনোটিই inherently ভালো বা খারাপ নয়।

একটি short calculation-এর জন্য procedural code often simpler।

একটি business application-এ related state, rules এবং behavior থাকলে object-oriented design code organize করতে সাহায্য করে।


What Is an Object?

Object হলো একটি software entity, যার সাধারণত তিনটি গুরুত্বপূর্ণ characteristic থাকে:

  1. State
  2. Behavior
  3. Identity

State

State হলো object-এর current data।

একটি enrollment-এর state হতে পারে:

Learner: Nur
Course: Java and OOP Foundation
Completed lessons: 16
Total lessons: 20
Status: ACTIVE

State সময়ের সঙ্গে পরিবর্তিত হতে পারে।

Completed lessons: 16

একটি lesson complete করার পরে:

Completed lessons: 17

Behavior

Behavior হলো object যে meaningful actions perform করতে পারে।

একটি enrollment-এর behavior হতে পারে:

Complete a lesson
Calculate progress
Cancel enrollment
Check whether the course is completed

Java-তে behavior methods দিয়ে represent করা হয়।

Conceptually:

enrollment.completeLesson();
enrollment.calculateProgress();
enrollment.cancel();

Identity

Identity নির্ধারণ করে আমরা কোন specific object-এর সঙ্গে কাজ করছি।

দুটি enrollment-এর state একই হতে পারে:

Completed lessons: 10
Total lessons: 20

তবুও তারা different learners বা different courses-এর enrollment হতে পারে।

Production systems-এ identity represent হতে পারে:

  • Database ID
  • Enrollment ID
  • User ID
  • Unique reference
  • In-memory object identity

What Is a Class?

Class হলো একটি custom type, যা objects-এর structure এবং behavior define করে।

Conceptually:

Class:
Enrollment

Objects:
Nur's Java enrollment
Sakib's Java enrollment
Jalisa's backend enrollment

একটি class define করতে পারে:

  • কোন state থাকবে
  • কোন behavior available হবে
  • Object কীভাবে তৈরি হবে
  • কোন states valid
  • State কীভাবে change করা যাবে

একটি class নিজে specific learner enrollment নয়।

এটি enrollment objects তৈরির definition।


Class and Object

ClassObject
একটি type বা definitionসেই type-এর actual instance
State-এর structure define করেActual state values রাখে
Behavior define করেBehavior execute করে
Example: CourseExample: javaCourse
Example: EnrollmentExample: nurEnrollment

Conceptual Java:

Course javaCourse =
        new Course();

Enrollment nurEnrollment =
        new Enrollment();

এখানে:

Course
Enrollment

classes।

javaCourse
nurEnrollment

object references।

Classes এবং objects পরবর্তী lesson-এ syntaxসহ বিস্তারিত শেখানো হবে।


Responsibility: The Most Important Design Question

OOP design-এর সবচেয়ে গুরুত্বপূর্ণ প্রশ্নগুলোর একটি:

কোন object কোন কাজের জন্য responsible?

ধরা যাক learner-এর course progress calculate করতে হবে।

Possible locations:

  • Learner
  • Course
  • Enrollment
  • Main

এখন relationshipটি দেখি।

একজন learner multiple courses-এ enroll করতে পারে।

Nur:
- Java progress: 80%
- Backend progress: 40%

তাই progress শুধু Learner-এর property নয়।

একটি course-এ multiple learners থাকতে পারে।

Java course:
- Nur progress: 80%
- Sakib progress: 90%

তাই progress শুধু Course-এর propertyও নয়।

Progress learner এবং course-এর relationship-এর অংশ।

সুতরাং Enrollment একটি natural owner।

enrollment.calculateProgress();

এই reasoning syntax-এর চেয়ে বেশি গুরুত্বপূর্ণ।


Modeling a Learning Platform

একটি simple learning platform-এর possible objects:

Learner
Course
Lesson
Enrollment
Payment
Certificate

প্রতিটি object-এর responsibility আলাদা হওয়া উচিত।


Learner

Possible state:

Name
Email
Account status

Possible behavior:

Update profile
Verify email
Deactivate account

Course

Possible state:

Title
Price
Publication status
Lesson count

Possible behavior:

Publish
Change price
Add lesson
Open enrollment

Enrollment

Possible state:

Learner
Course
Completed lessons
Enrollment status

Possible behavior:

Complete lesson
Calculate progress
Cancel
Mark completed

Notice that Enrollment should not process payments, send emails, publish courses, and update learner profiles।

A class should have a coherent responsibility।


State and Behavior Should Stay Together

Poorly organized code often stores data in one place and all related rules elsewhere।

Example:

int completedLessons = 20;
int totalLessons = 18;

Technically both values are valid integers।

But together they form an invalid enrollment state।

Completed lessons cannot exceed total lessons.

A well-designed object can protect this rule।

Conceptually:

enrollment.completeLesson();

Instead of:

enrollment.completedLessons++;

The method can check:

  • Enrollment active কি না
  • Course already completed কি না
  • Completed count total-এর বেশি হবে কি না

This is one of the central benefits of object-oriented design:

The object that owns the state should usually help protect the rules of that state.


OOP Is Not Just Data Grouping

এই classটি data group করে:

public class Enrollment {

    String learnerName;
    String courseTitle;
    int completedLessons;
    int totalLessons;
}

এটি useful শুরু হতে পারে, কিন্তু object-oriented design এখানেই শেষ নয়।

যদি external code যেকোনো value assign করতে পারে:

enrollment.completedLessons = -10;
enrollment.totalLessons = 0;

তাহলে object নিজের validity protect করছে না।

A stronger design eventually exposes meaningful behavior:

enrollment.completeLesson();
enrollment.calculateProgress();

এবং internal state uncontrolledভাবে change হতে দেয় না।

এই বিষয়টি constructors এবং encapsulation lessons-এ implement করা হবে।


Encapsulation

Encapsulation-এর দুইটি related purpose আছে:

  1. Related state এবং behavior একসঙ্গে রাখা
  2. Internal state-এর access এবং modification control করা

Example:

course.changePrice(4990);

Method validate করতে পারে:

Price cannot be negative.

Caller-এর internal field structure জানা প্রয়োজন হয় না।

Encapsulation মানে শুধু fields private করে every field-এর getter এবং setter তৈরি করা নয়।

Blind setter:

course.setPrice(-500);

যদি invalid value accept করে, তাহলে field private হলেও object properly encapsulated নয়।

Meaningful encapsulation protects rules।


Abstraction

Abstraction caller-কে meaningful operation দেয় এবং unnecessary implementation details hide করে।

Example:

course.publish();

Caller-এর জানা প্রয়োজন নেই:

  • Publication timestamp কীভাবে set হয়
  • Validation কীভাবে চলে
  • Audit entry কীভাবে তৈরি হয়
  • Database update কীভাবে হয়

Caller meaningful action দেখে:

Publish this course

Abstraction একটি object-এর public API সহজ এবং intention-revealing রাখে।


Inheritance

Inheritance একটি class-কে অন্য class থেকে structure বা behavior inherit করতে দেয়।

Conceptual example:

User
├── Learner
└── Instructor

কিন্তু inheritance OOP-এর starting point নয়।

Beginner code-এ inheritance প্রায়ই unnecessarily ব্যবহার করা হয়।

অনেক relationship inheritance নয়।

Example:

Course has lessons.
Enrollment has a learner and a course.

এগুলো composition বা association।

Inheritance এবং polymorphism পরবর্তী module-এ শেখানো হবে, যখন classes এবং composition clear হবে।


Polymorphism

Polymorphism একই common operation different implementations-এর মাধ্যমে execute করতে দেয়।

Conceptual example:

EmailNotification
SmsNotification
PushNotification

সবগুলোর operation হতে পারে:

send();

কিন্তু প্রতিটি type নিজের implementation ব্যবহার করবে।

এই module-এ আমরা foundation তৈরি করব; বিস্তারিত পরে আসবে।


Composition Before Inheritance

Production design-এ একটি useful principle:

Prefer composition when one object contains or collaborates with another object.

Example:

Course has Lessons
Enrollment has a Learner
Enrollment has a Course

এই relationships inheritance নয়।

Wrong mental model:

Enrollment is a Learner

Correct:

Enrollment belongs to a Learner
Enrollment connects a Learner and a Course

is-a relationship inheritance suggest করতে পারে।

has-a relationship composition suggest করতে পারে।


A First Look at an Object-Oriented Model

এখন codeটি শুধু preview হিসেবে দেখুন।

public class Enrollment {

    String learnerName;
    int completedLessons;
    int totalLessons;

    void completeLesson() {
        if (
                completedLessons
                >= totalLessons
        ) {
            return;
        }

        completedLessons++;
    }

    double calculateProgress() {
        if (totalLessons == 0) {
            return 0.0;
        }

        return completedLessons
                * 100.0
                / totalLessons;
    }
}

Usage:

Enrollment nurEnrollment =
        new Enrollment();

nurEnrollment.learnerName =
        "Nur";

nurEnrollment.completedLessons = 16;
nurEnrollment.totalLessons = 20;

nurEnrollment.completeLesson();

System.out.println(
        nurEnrollment.calculateProgress()
);

Output:

85.0

এই design এখনও final নয়।

Fields directly accessible, এবং object invalidভাবে initialize করা সম্ভব।

আমরা intentionally simple version দিয়ে শুরু করছি।

পরবর্তী lessons-এ আমরা এটিকে ধাপে ধাপে improve করব:

  1. Classes and objects
  2. Fields and methods
  3. Constructors
  4. Encapsulation
  5. Composition
  6. Immutability

Engineering Note: Domain Logic and Console Output

Beginner examples-এ প্রায়ই object-এর method-এর মধ্যে System.out.println() ব্যবহার করা হয়।

void displayProgress() {
    System.out.println(
            calculateProgress()
    );
}

Learning-এর জন্য এটি convenient।

তবে production application-এ domain object সাধারণত presentation format বা console output control করে না।

Better separation হতে পারে:

double progress =
        enrollment.calculateProgress();

System.out.println(
        "%.2f%%".formatted(progress)
);

এখানে:

  • Enrollment progress calculate করে
  • Console layer output format করে

এই separation object-কে web, mobile, API, test এবং console—সব context-এ reusable করে।


Design Trade-Off: Not Every Class Must Be Behavior-Rich

সব classes একই ধরনের নয়।

কিছু classes mainly data transport করতে পারে:

API request
Database projection
Configuration
Event payload

এসব object-এ extensive business behavior প্রয়োজন নাও হতে পারে।

অন্যদিকে core domain objects-এর state এবং rules থাকলে meaningful behavior valuable।

Example:

Enrollment progress
Course publication
Account balance
Payment status

তাই ruleটি এমন নয়:

Every class must contain many methods.

Better rule:

Put behavior where it naturally belongs, and avoid inventing behavior just to make a class look object-oriented.


Common Beginner Misconceptions

1. OOP Means Using Many Classes

More classes automatically better design তৈরি করে না।

Unnecessary classes code navigate এবং understand করা কঠিন করে।

একটি class তখন meaningful, যখন তার একটি coherent concept বা responsibility আছে।


2. OOP Means Getters and Setters

Fields private করে mechanical getter/setter তৈরি করলেই good OOP হয় না।

course.setPrice(-100);

যদি setter invalid value allow করে, object এখনও weak।


3. Every Real-World Noun Must Become a Class

Requirements-এর nouns possible classes identify করতে সাহায্য করে, কিন্তু সব noun class হবে না।

Example:

course title

Title আলাদা class নাও হতে পারে; এটি String field হতে পারে।


4. OOP Replaces Algorithms

Objects-এর methods-এর ভেতরে এখনও প্রয়োজন:

  • Conditions
  • Loops
  • Calculations
  • Data structures
  • Algorithms

OOP code organization-এর approach; এটি fundamental programming logic replace করে না।


5. Inheritance Is the Main Feature of OOP

Practical codebases-এ encapsulation, composition, clear responsibilities এবং stable interfaces অধিক গুরুত্বপূর্ণ হতে পারে।

Inheritance useful, কিন্তু overuse করলে coupling এবং complexity বাড়ে।


A Practical Object-Modeling Process

একটি requirement পড়লে নিচের steps ব্যবহার করুন।

Step 1: Identify Important Concepts

Requirement:

Nur enrolls in a Java course and completes lessons until the course is finished.

Possible concepts:

Learner
Course
Enrollment
Lesson

Step 2: Identify State

Learner:
name
email

Course:
title
total lessons

Enrollment:
learner
course
completed lessons
status

Step 3: Identify Behavior

Course:
publish
open enrollment

Enrollment:
complete lesson
calculate progress
cancel

Step 4: Assign Responsibility

Ask:

Who owns this information?
Who should enforce this rule?
Who should perform this operation?

Example:

Progress belongs to Enrollment.
Course title belongs to Course.
Learner email belongs to Learner.

Step 5: Check Invalid States

Examples:

Blank course title
Negative price
Completed lessons greater than total lessons
Cancelled enrollment receiving progress updates

These rules guide constructors and methods later।


Practice Exercises

Exercise 1: Identify State and Behavior

For a Course, identify:

  • Four pieces of state
  • Three behaviors
  • One possible identity

Exercise 2: Choose the Correct Owner

Match each item with the most appropriate object:

Learner email
Course title
Enrollment progress
Lesson duration
Payment status

Objects:

Learner
Course
Enrollment
Lesson
Payment

Exercise 3: Model an Enrollment

Write a conceptual design:

Class name
State
Behavior
Invalid states

Do not write complete Java code yet।


Exercise 4: Procedural or Object-Oriented?

Choose the simpler approach and explain why:

  1. Add two numbers
  2. Manage course enrollments with progress and cancellation rules
  3. Convert Celsius to Fahrenheit
  4. Track account balance with deposits, withdrawals, and overdraft rules

Exercise 5: Find the Design Problem

public class Application {

    String learnerName;
    String courseTitle;
    long paymentAmount;
    int completedLessons;

    void publishCourse() {
    }

    void processPayment() {
    }

    void completeLesson() {
    }
}

Explain why this class may have too many unrelated responsibilities।

Suggest more focused classes।


Exercise 6: Identify Invalid States

For an enrollment with:

completedLessons
totalLessons
active

List at least three invalid or suspicious states।


Knowledge Check

Question 1

Object-Oriented Programming-এর primary purpose কী?

Question 2

একটি object-এর তিনটি important characteristics কী?

Question 3

Class এবং object-এর difference কী?

Question 4

Object responsibility বলতে কী বোঝায়?

Question 5

Progress কেন Learner বা Course-এর পরিবর্তে Enrollment-এর responsibility হতে পারে?

Question 6

Encapsulation কি শুধু private fields এবং getters/setters?

Question 7

Abstraction কীভাবে caller-কে সাহায্য করে?

Question 8

Composition এবং inheritance-এর basic difference কী?

Question 9

সব software problem-এর জন্য OOP কি best choice?

Question 10

Invalid object states আগে identify করা useful কেন?


Knowledge Check Answers

Answer 1

Related state, behavior এবং rules meaningful objects-এর মধ্যে organize করা।

Answer 2

  • State
  • Behavior
  • Identity

Answer 3

Class একটি type বা definition। Object সেই class-এর actual instance, যা real state values ধারণ করে।

Answer 4

কোন object কোন state own করবে এবং কোন behavior বা rule enforce করবে।

Answer 5

Progress একটি specific learner এবং specific course-এর relationship-এর অংশ। একজন learner-এর different courses-এ different progress থাকতে পারে।

Answer 6

না। Encapsulation internal state protect করে এবং meaningful, controlled behavior expose করে।

Answer 7

Implementation details hide করে intention-revealing operations expose করে।

Example:

course.publish();

Answer 8

Inheritance সাধারণত is-a relationship represent করে। Composition সাধারণত has-a বা collaboration relationship represent করে।

Answer 9

না। Small calculations বা scripts procedural code দিয়ে simpler হতে পারে।

Answer 10

Constructors এবং methods object-কে valid state-এ রাখতে কী rules enforce করবে তা নির্ধারণ করা যায়।


Lesson Summary

এই lesson-এ আমরা শিখেছি:

  • OOP শুধু syntax নয়; এটি responsibilities এবং relationships-এর design approach
  • Object-এর state, behavior এবং identity থাকে
  • Class objects-এর structure এবং behavior define করে
  • Object একটি class-এর actual instance
  • Procedural code steps-এর ওপর focus করে
  • Object-oriented design state ownership এবং responsibility-এর ওপর focus করে
  • Related state এবং rules appropriate object-এর মধ্যে রাখা উচিত
  • Progress learner এবং course-এর relationship হওয়ায় Enrollment-এর responsibility হতে পারে
  • Encapsulation state protect করে এবং controlled behavior expose করে
  • Abstraction implementation details hide করে
  • Composition object relationships model করে
  • Inheritance useful, কিন্তু OOP-এর starting point নয়
  • More classes automatically better design তৈরি করে না
  • Getters এবং setters alone good object design তৈরি করে না
  • Domain objects এবং presentation logic আলাদা রাখা production code-এ useful
  • Not every class must be behavior-rich
  • Good object modeling begins with concepts, state, behavior, responsibility, and invalid states

Next Lesson

পরবর্তী lesson:

Classes, Objects, Fields, and Methods

আমরা শিখব:

  • Java class declaration
  • Object creation with new
  • Reference variables
  • Instance fields
  • Instance methods
  • Independent object state
  • Default field values
  • Methods reading and changing state
  • Why direct field mutation is only a temporary learning step