এতক্ষণ সবকিছু ছিল কোড কাজ করানো নিয়ে। এই পাঠ ঠিক ততটাই গুরুত্বপূর্ণ একটি বিষয় নিয়ে: এমন কোড তৈরি করা যা অন্যরা — আর ছয় মাস পরের আপনি নিজেও — এখনও বুঝতে পারে।
যে কোড একবার লিখে আর কখনো ছোঁয়া হয় না তা এলোমেলো হলেও কিছু আসে যায় না। বাস্তব প্রোগ্রাম প্রথমবার লেখার চেয়ে অনেক বেশিবার পড়া, পরিবর্তন করা, আর ডিবাগ করা হয়। এখন সামান্য শৃঙ্খলা পরে অনেক বিভ্রান্তি বাঁচায়।
এগুলোর কোনোটার জন্যই নতুন সিনট্যাক্স লাগে না — এগুলো শুধু অভ্যাস।
| অভ্যাস | কেন গুরুত্বপূর্ণ |
|---|---|
| কমেন্টের চেয়ে অর্থবহ নাম | daysUntilExpiry নামের একটি ভেরিয়েবল নিজেই নিজেকে ব্যাখ্যা করে। d নামের একটি ভেরিয়েবল পাশে কমেন্ট থাকলেও কমেন্টের সাথে অসামঞ্জস্যপূর্ণ হয়ে যেতে পারে — নাম কখনো পারে না। |
| ফাংশন ছোট রাখুন | একটি স্পষ্ট কাজ করা ফাংশন টেস্ট করা, পুনরায় ব্যবহার করা, আর বোঝা সহজ। পাঁচটি কাজ করা একটি ফাংশন আসলে পাঁচটি ফাংশন এক কোটের ভেতরে লুকিয়ে। |
| সামঞ্জস্যপূর্ণ থাকুন | একটি নামকরণ স্টাইল আর একটি ইনডেন্টেশন স্টাইল বেছে নিয়ে পুরো প্রোজেক্ট জুড়ে সেটা মেনে চলুন — সামঞ্জস্যতা কোডকে পূর্বাভাসযোগ্য করে তোলে, এমনকি এমন অংশেও যা আপনি আগে কখনো দেখেননি। |
| DRY — নিজেকে পুনরাবৃত্তি করবেন না | একই লজিক তিন জায়গায় কপি-পেস্ট করা থাকলে, একটি বাগ ঠিক করতে তিন জায়গায়ই করতে হয়, আর একটা মিস হওয়া সহজ। |
| YAGNI — এটা আপনার লাগবে না | হয়তো কখনো না আসা এক ভবিষ্যতের জন্য নমনীয়তা বা ফিচার তৈরি করবেন না — এটা আজ জটিলতা যোগ করে এমন একটা "হয়তো"-র জন্য যা কখনো নাও ঘটতে পারে। |
একই ধারণার এই দুটি ভার্সন তুলনা করুন:
// অনুসরণ করা কঠিন
function calc(a, b, t) {
return t === 1 ? a + b : a - b;
}
// পরিষ্কার
function combineAmounts(amountA, amountB, operation) {
return operation === 'add'
? amountA + amountB
: amountA - amountB;
}একই লজিক, একই দৈর্ঘ্য — কিন্তু দ্বিতীয় ভার্সন কোনো কমেন্ট ছাড়াই বলে দেয় এটা কী করে।
অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) হলো একটি লম্বা ধাপের তালিকা লেখার বদলে "অবজেক্ট" — সম্পর্কিত ডেটা আর সেই ডেটার উপর কাজ করা ফাংশনের বান্ডেল — এর চারপাশে কোড সংগঠিত করার একটি উপায়। বেশিরভাগ আধুনিক ভাষা (JavaScript, Python, Java, C#) এটি সমর্থন করে।
একটা Car অবজেক্ট ভাবুন: এর ডেটা (রং, গতি, জ্বালানির পরিমাণ) আর আচরণ (গতি বাড়ানো, ব্রেক করা, জ্বালানি ভরা) একসাথে বান্ডেল করা, ডেটা আলাদাভাবে ভাসতে থাকা আর দূর থেকে একগাদা আলাদা ফাংশন সেটার উপর কাজ করার বদলে।
| ধারণা | এর অর্থ কী |
|---|---|
| এনক্যাপসুলেশন | একটা অবজেক্টের ডেটা তার উপর কাজ করা ফাংশনের সাথে বান্ডেল করা, আর অন্য কোডের দেখার দরকার নেই এমন অভ্যন্তরীণ বিবরণ লুকিয়ে রাখা। |
| অ্যাবস্ট্রাকশন | কিছু ব্যবহার করার জন্য শুধু যা দরকার তা প্রকাশ করা, ভেতরে এটা কীভাবে কাজ করে তা লুকিয়ে রাখা — ইঞ্জিন কীভাবে তৈরি তা না জেনেই আপনি একটা গাড়ি চালাতে পারেন। |
| ইনহেরিটেন্স | একটা নতুন অবজেক্ট টাইপ একটা বিদ্যমান টাইপ পুনরায় ব্যবহার আর সম্প্রসারিত করতে পারে — একটা SportsCar একটা Car-এর সবকিছু ইনহেরিট করতে পারে, আর নিজের অতিরিক্ত কিছু যোগ করতে পারে। |
| পলিমরফিজম | ভিন্ন অবজেক্ট টাইপ একই নির্দেশনায় নিজের মতো করে সাড়া দিতে পারে — car.makeSound() আর truck.makeSound() দুটোই আছে, কিন্তু ভিন্ন কাজ করে। |
class Car {
constructor(brand) {
this.brand = brand;
this.speed = 0;
}
accelerate() {
this.speed += 10;
}
}
class SportsCar extends Car { // inheritance
accelerate() { // polymorphism — নিজস্ব ভার্সন
this.speed += 25;
}
}
const civic = new Car('Honda');
const ferrari = new SportsCar('Ferrari');
civic.accelerate();
ferrari.accelerate();
console.log(civic.speed, ferrari.speed); // 10, 25এটা সবসময় ব্যবহার করার দরকার নেই
প্রোডাক্টিভ হতে OOP আয়ত্ত করার দরকার নেই — অনেক বাস্তব, কার্যকর কোড ক্লাস ছাড়াই লেখা হয়। কিন্তু এই চারটি শব্দ যখন আসে (একটা চাকরির ইন্টারভিউতে, অন্য একটা ভাষার ডকুমেন্টেশনে, আপনি যোগ দেওয়া একটা কোডবেসে) তখন চিনতে পারা প্রথম দিকেই জানার মতো।
ক্লিন কোড অভ্যাস আর বেসিক OOP একটা প্রোগ্রাম ভিন্নভাবে চালাবে না — কম্পিউটার আপনার ভেরিয়েবলের নাম নিয়ে চিন্তা করে না। এগুলো পার্থক্য তৈরি করে পরের ব্যক্তির জন্য যে কোডটা পড়বে, যে প্রায়ই আসলে আপনি নিজেই।