Header Ads

Header ADS

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 এর মূল স্তম্ভ

সবকিছু মিলিয়ে:

  1. Meaningful Naming

  2. Small Functions

  3. Single Responsibility

  4. Avoid Over-Abstraction

  5. No Magic Numbers

  6. Minimal but Meaningful Comments

  7. Domain-Driven Structure

  8. Readability Over Cleverness

  9. Future-Proof Thinking

  10. Team Alignment


🔥 শেষ কথা (সবচেয়ে গুরুত্বপূর্ণ)

Clean Code কোনো ধর্ম না।
এটা একটা ব্যালান্স।

অতিরিক্ত কড়া হলে:

  1. Development slow

  2. Overengineering

অতিরিক্ত ঢিলা হলে:

  1. 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);
}

🚨 সমস্যা কোথায়?

  1. ফাংশনের নাম p

  2. o, u, p, q, e — কিছুই পরিষ্কার না ❌

  3. Magic number: 0.9, 1000, 50

  4. এক ফাংশনে অনেক কাজ (calculate + log + save + email) ❌

  5. 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);
}

এটা পড়েই বোঝা যাচ্ছে কী হচ্ছে।

কোনো অতিরিক্ত কমেন্ট দরকার নেই।


🧠 এখানে আমরা যেগুলো প্র্যাকটিস করলাম

  1. Meaningful naming

  2. No magic numbers

  3. Single responsibility

  4. Small functions

  5. Self-documenting code

  6. Future-friendly structure

     


 
Powered by Blogger.