Clean Code
🔥 Clean Code
1️⃣ Code হচ্ছে ভাষা (Code is Communication)
কোড শুধু কম্পিউটারের জন্য না — মানুষের জন্যও।
❌ খারাপ
function addTSToMD(d) { ... }
বোঝা যাচ্ছে না।
✅ ভালো
function addTimestampToMetadata(metadata) { ... }
✔ নাম দেখে কাজ বোঝা যাচ্ছে
✔ কমেন্ট দরকার নেই
✔ ৬ মাস পরে নিজেও বুঝবেন
👉 Rule: If you need to explain the name, rename it.
2️⃣ Meaningful Variable Name ব্যবহার করুন
❌ খারাপ
let data;
let result;
✅ ভালো
let userProfile;
let paymentResponse;
👉 Variable নামেই intent বোঝা উচিত।
3️⃣ ছোট ফাংশন লিখুন (Single Responsibility)
যদি একটা ফাংশন ২০০ লাইন হয় — নিশ্চিত সে অনেক কাজ করছে।
❌ খারাপ
function processOrder(order) {
// validate
// calculate
// discount
// save
// email
}
✅ ভালো
function processOrder(order) {
validateOrder(order);
const total = calculateTotal(order);
saveOrder(order, total);
sendConfirmation(order);
}
✔ পড়তে সহজ
✔ টেস্ট করা সহজ
✔ Debug সহজ
👉 Rule: One Function = One Responsibility
4️⃣ Copy-Paste দেখলে ভাবুন → Function বানাবেন?
যদি একই লজিক বারবার লিখেন:
let total1 = price1 * qty1 * 0.1;
let total2 = price2 * qty2 * 0.1;
তাহলে:
function calculateTax(price, quantity) {
return price * quantity * 0.1;
}
✔ DRY
✔ Maintainable
5️⃣ কিন্তু DRY অতিরিক্ত ব্যবহার করবেন না ⚠️
Users আর Products — আজকে একইরকম দেখালেও ভবিষ্যতে আলাদা হবে।
❌ Over-Abstract
function processItems(items) { ... }
সবকিছু এক mega-function এ ঢুকিয়ে ফেললেন।
✅ Balanced Approach
// userService.js
users.sort().filter().map()
// productService.js
products.sort().filter().map()
✔ Domain আলাদা
✔ ভবিষ্যৎ পরিবর্তন সহজ
👉 Rule: Premature abstraction করবেন না।
6️⃣ Magic Number ব্যবহার করবেন না
❌
total = price * 0.15;
✅
const TAX_RATE = 0.15;
total = price * TAX_RATE;
✔ পরিষ্কার
✔ এক জায়গায় পরিবর্তন
7️⃣ Enum ব্যবহার করুন (Meaningful Values)
❌
if (status === 1) { ... }
✅
const Status = {
PENDING: 0,
APPROVED: 1,
REJECTED: 2
};
if (status === Status.APPROVED) { ... }
✔ 1 দেখে কিছু বোঝা যায় না
✔ Status.APPROVED পরিষ্কার
8️⃣ Null ব্যবহার করুন, Fake Value না
❌
let userId = -1;
✅
let userId = null;
✔ “Nothing” স্পষ্টভাবে বোঝায়
9️⃣ Comment লিখুন — কিন্তু বুদ্ধি করে
❌ খারাপ কমেন্ট
// gets user profile
getUserProfile();
অপ্রয়োজনীয়।
✅ ভালো কমেন্ট
// preserve insertion order for reporting
👉 “What” না, “Why” ব্যাখ্যা করুন।
🔟 Self-Documenting Code
ভালো naming + ছোট function = কম কমেন্ট
আপনার কোড এমন হওয়া উচিত:
পড়েই বোঝা যায় কী হচ্ছে।
1️⃣1️⃣ File Structure & Discipline
আপনার C স্কুলের নিয়মগুলো:
২৫ লাইনের বেশি ফাংশন না
৫টার বেশি ফাংশন প্রতি ফাইল না
Naming convention strict
এগুলো আপনাকে শিখিয়েছে:
✔ Modular thinking
✔ Structure awareness
✔ Lazy coding থেকে বের হওয়া
1️⃣2️⃣ Clean Code মানে “Short” না, “Clear”
খুব clever এক লাইনের কোড:
arr.sort().filter(x=>x.a).map(x=>({...x,id:uuid()}));
হয়তো ছোট।
কিন্তু সবসময় readable না।
👉 Clever ≠ Clean
👉 Clear = Clean
1️⃣3️⃣ Testing Friendly Code লিখুন
ছোট ফাংশন = আলাদা unit test সম্ভব।
calculateDiscount()
validateUser()
Test isolation সহজ।
1️⃣4️⃣ Future Change মাথায় রাখুন
Senior developer ভাবে:
যখন এটা বদলাবে, তখন কত কষ্ট হবে?
Junior ভাবে:
এখন কাজ করছে।
Clean Code = Future-friendly Code
1️⃣5️⃣ Linter & Automation ব্যবহার করুন
ESLint
Prettier
SonarLint
Pre-commit hooks
Small issues automation দিয়ে enforce করুন।
🧠 Clean Code এর মূল স্তম্ভ
সবকিছু মিলিয়ে:
Meaningful Naming
Small Functions
Single Responsibility
Avoid Over-Abstraction
No Magic Numbers
Minimal but Meaningful Comments
Domain-Driven Structure
Readability Over Cleverness
Future-Proof Thinking
Team Alignment
🔥 শেষ কথা (সবচেয়ে গুরুত্বপূর্ণ)
Clean Code কোনো ধর্ম না।
এটা একটা ব্যালান্স।
অতিরিক্ত কড়া হলে:
Development slow
Overengineering
অতিরিক্ত ঢিলা হলে:
Spaghetti code
👉 লক্ষ্য হওয়া উচিত:
Readable
Maintainable
Testable
Scalable
একটা খারাপ কোড নেবো, তারপর ধাপে ধাপে সেটাকে Clean Code এ রিফ্যাক্টর করবো।
ধরি এটা একটা ছোট Order Processing System।
❌ Step 1: খারাপ কোড (Unclean Version)
function p(o) {
let t = 0;
if (o.u === 1) {
t = o.p * o.q * 0.9;
} else {
t = o.p * o.q;
}
if (t > 1000) {
t = t - 50;
}
console.log("Total: " + t);
saveToDb(o, t);
sendMail(o.e, t);
}
🚨 সমস্যা কোথায়?
ফাংশনের নাম
p❌o,u,p,q,e— কিছুই পরিষ্কার না ❌Magic number:
0.9,1000,50❌এক ফাংশনে অনেক কাজ (calculate + log + save + email) ❌
Self-documenting না ❌
এখন আমরা ধাপে ধাপে এটা ঠিক করবো।
✅ Step 2: Meaningful Naming
function processOrder(order) {
let total = 0;
if (order.userType === 1) {
total = order.price * order.quantity * 0.9;
} else {
total = order.price * order.quantity;
}
if (total > 1000) {
total = total - 50;
}
console.log("Total: " + total);
saveToDb(order, total);
sendMail(order.email, total);
}
✔ এখন অন্তত বোঝা যাচ্ছে কী হচ্ছে
কিন্তু এখনও সমস্যা আছে।
✅ Step 3: Magic Number সরানো
const PREMIUM_DISCOUNT = 0.9;
const BULK_THRESHOLD = 1000;
const BULK_DISCOUNT = 50;
const USER_TYPE_PREMIUM = 1;
function processOrder(order) {
let total = 0;
if (order.userType === USER_TYPE_PREMIUM) {
total = order.price * order.quantity * PREMIUM_DISCOUNT;
} else {
total = order.price * order.quantity;
}
if (total > BULK_THRESHOLD) {
total = total - BULK_DISCOUNT;
}
console.log("Total: " + total);
saveToDb(order, total);
sendMail(order.email, total);
}
✔ এখন সংখ্যাগুলোর মানে পরিষ্কার
✔ ভবিষ্যতে পরিবর্তন সহজ
✅ Step 4: Single Responsibility (ফাংশন ভাগ করা)
function processOrder(order) {
const total = calculateTotal(order);
logOrderTotal(total);
persistOrder(order, total);
notifyCustomer(order.email, total);
}
এখন ছোট ফাংশনগুলো:
function calculateTotal(order) {
let total = order.price * order.quantity;
if (order.userType === USER_TYPE_PREMIUM) {
total *= PREMIUM_DISCOUNT;
}
if (total > BULK_THRESHOLD) {
total -= BULK_DISCOUNT;
}
return total;
}
function logOrderTotal(total) {
console.log("Total: " + total);
}
function persistOrder(order, total) {
saveToDb(order, total);
}
function notifyCustomer(email, total) {
sendMail(email, total);
}
🎯 এখন কী উন্নতি হলো?
✔ পড়তে সহজ
processOrder() এখন গল্পের মতো পড়া যায়।
✔ টেস্ট করা সহজ
calculateTotal() আলাদা করে unit test করা যায়।
✔ Maintainable
Email logic বদলালে শুধু notifyCustomer() বদলাতে হবে।
✔ Clean Structure
🔥 Final Clean Version (Self-Documenting)
এখন processOrder() পড়লে:
function processOrder(order) {
const total = calculateTotal(order);
logOrderTotal(total);
persistOrder(order, total);
notifyCustomer(order.email, total);
}
এটা পড়েই বোঝা যাচ্ছে কী হচ্ছে।
কোনো অতিরিক্ত কমেন্ট দরকার নেই।
🧠 এখানে আমরা যেগুলো প্র্যাকটিস করলাম
Meaningful naming
No magic numbers
Single responsibility
Small functions
Self-documenting code
- Future-friendly structure