Object-Oriented Programming Foundations
Introduction to Object-Oriented Design
আপনি একটি 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 থাকে:
- State
- Behavior
- 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
| Class | Object |
|---|---|
| একটি type বা definition | সেই type-এর actual instance |
| State-এর structure define করে | Actual state values রাখে |
| Behavior define করে | Behavior execute করে |
Example: Course | Example: javaCourse |
Example: Enrollment | Example: 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:
LearnerCourseEnrollmentMain
এখন 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 আছে:
- Related state এবং behavior একসঙ্গে রাখা
- 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 করব:
- Classes and objects
- Fields and methods
- Constructors
- Encapsulation
- Composition
- 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)
);
এখানে:
Enrollmentprogress 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:
- Add two numbers
- Manage course enrollments with progress and cancellation rules
- Convert Celsius to Fahrenheit
- 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