Logic Building & Control Flow
"The Art of Decision Making"
প্রোগ্রামিং মানেই হলো সিদ্ধান্ত নেওয়া (Decision Making)। "যদি ইউজার লগইন থাকে, ড্যাশবোর্ড দেখাও; না থাকলে লগইন পেজে পাঠাও"—এই যে লজিক, এটাই Control Flow।
জাভাস্ক্রিপ্ট বাই-ডিফল্ট ওপর থেকে নিচে (Top-to-Bottom) এক লাইন করে কোড পড়ে। Control Flow দিয়ে আমরা এই স্রোতকে নিয়ন্ত্রণ করি—কখনও থামাই, কখনও লুপে ঘোরাই, আবার কখনও স্কিপ করি।
একজন সিনিয়র ডেভেলপার শুধু if-else জানে না, সে জানে কখন if ব্যবহার করতে হবে আর কখন সেটা এড়িয়ে কোড ক্লিন রাখতে হবে।
1. Conditional Statements (সিদ্ধান্ত গ্রহণ)
A) if Statement
সবচেয়ে বেসিক কন্ডিশন। সত্য হলে ঢুকবে, মিথ্যা হলে বের হয়ে যাবে।
let age = 20;
if (age >= 18) {
console.log("Access Granted: You are an Adult");
}
B) if-else & else-if
যখন একাধিক পথ থাকে।
let marks = 85;
if (marks >= 80) {
console.log("A+");
} else if (marks >= 70) {
console.log("A");
} else {
console.log("F");
}
💡 Senior Concept: "Guard Clauses" (Early Return)
জুনিয়ররা প্রায়ই if-else এর ভেতরে if-else (Nesting) লিখে কোড জটিল করে ফেলে। সিনিয়ররা "Guard Clauses" ব্যবহার করে। অর্থাৎ, যা মিলবে না তাকে আগেই return করে বিদায় করে দাও।
❌ Junior Way (Nested & Messy):
function login(user) {
if (user) {
if (user.isVerified) {
console.log("Welcome!");
} else {
console.log("Please verify email");
}
} else {
console.log("User not found");
}
}
✅ Senior Way (Clean & Flat):
function login(user) {
if (!user) return console.log("User not found"); // আগেই বিদায়
if (!user.isVerified) return console.log("Please verify email"); // আগেই বিদায়
// মেইন কাজ এখানে
console.log("Welcome!");
}
কোড এখন অনেক ক্লিন এবং পড়তে সহজ!
2. Truthy & Falsy Values (The "Gotchas")
জাভাস্ক্রিপ্টের ইন্টারভিউতে এটি একটি হট টপিক। কন্ডিশনের ভেতরে কিছু ভ্যালু অটোমেটিক মিথ্যা (False) হিসেবে গণ্য হয়।
⚠️ Falsy List (মুখস্থ রাখো):
false0(Zero)""(Empty String)nullundefinedNaN(Not a Number)
বাকি সব কিছুই Truthy।
🚨 Real World Bug: The "0" Problem
মনে করো, ব্যাংকে কারো ব্যালেন্স 0 টাকা। তুমি চেক করছ:
let balance = 0;
if (balance) {
console.log("Your balance is: " + balance);
} else {
console.log("Account empty"); // 😲 এটা প্রিন্ট হবে!
}
কারণ: 0 হলো Falsy। তাই টাকা থাকলেও JS ভাবছে কিছুই নেই। Solution: সঠিকভাবে চেক করো if (balance >= 0)।
3. Switch Statement (Multiple Decisions)
যখন এক ভ্যালুর ওপর ভিত্তি করে অনেকগুলো কন্ডিশন থাকে, তখন switch ক্লিন অপশন।
let status = "processing";
switch (status) {
case "success":
console.log("Payment Done ✅");
break;
case "processing":
console.log("Wait a moment ⏳");
break;
case "failed":
console.log("Try again ❌");
break;
default:
console.log("Unknown Status");
}
Note: break দেওয়া বাধ্যতামূলক। না দিলে এটি পরের case-এ ঢুকে যাবে (একে Fall-through বলা হয়)।
4. Loops (Repetition Logic)
লুপ মানে কোনো কাজ বারবার করা।
A) for Loop (যখন সংখ্যা জানা থাকে)
// ১ থেকে ৫ প্রিন্ট করো
for (let i = 1; i <= 5; i++) {
console.log(`Step ${i}`);
}
B) while Loop (যখন সংখ্যা অজানা)
ধরো ডেটাবেজ থেকে ডেটা লোড হচ্ছে, তুমি জানো না কতক্ষণ লাগবে। যতক্ষণ ডেটা আসবে, ততক্ষণ লুপ চলবে।
let loading = true;
while(loading) {
// check data logic...
loading = false; // কাজ শেষ হলে থামাও, নাহলে Infinite Loop হবে!
}
C) do...while Loop (অন্তত একবার চলবেই)
কন্ডিশন চেক করার আগেই একবার বডি রান হয়।
let i = 10;
do {
console.log("I will run at least once even if condition is false");
i++;
} while (i < 5);
5. Loop Controls: Break & Continue
লুপের রাশ টেনে ধরার জন্য এই দুটো কীওয়ার্ড ব্যবহৃত হয়।
- break: "আমি পেয়ে গেছি, আর খোঁজার দরকার নেই।" (লুপ থামিয়ে দেয়)
- continue: "এটা কাজের না, স্কিপ করো, পরেরটা দেখো।" (বর্তমান ধাপ স্কিপ করে)
Example: ১ থেকে ১০ এর মধ্যে শুধু বিজোড় সংখ্যা প্রিন্ট করো, কিন্তু ৭ এর পর আর দরকার নেই।
for (let i = 1; i <= 10; i++) {
if (i % 2 === 0) continue; // জোড় হলে স্কিপ
if (i > 7) break; // ৭ এর বেশি হলে লুপ বন্ধ
console.log(i); // Output: 1, 3, 5, 7
}
6. Nested Loops (Performance Warning ⚠️)
এক লুপের ভেতরে আরেক লুপ। যেমন: ঘড়ির কাঁটা। মিনিটের কাঁটা ১ বার ঘুরলে, সেকেন্ডের কাঁটা ৬০ বার ঘোরে।
for (let minute = 1; minute <= 2; minute++) {
for (let second = 1; second <= 60; second++) {
console.log(`${minute} min : ${second} sec`);
}
}
Senior Insight:
নেস্টেড লুপ O(n²) কমপ্লেক্সিটি তৈরি করে। অর্থাৎ ডেটা একটু বাড়লেই কোড প্রচুর স্লো হয়ে যায়। ইন্টারভিউ বা বড় প্রজেক্টে যথাসম্ভব নেস্টেড লুপ এড়িয়ে চলার চেষ্টা করবে।
🧠 Logic Building Challenges (Practice)
নিচের প্রবলেমগুলো একজন সিনিয়রের মতো সলভ করার চেষ্টা করো:
🔥 Problem 1: Leap Year Check
let year = 2024;
if ((year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0)) {
console.log(year + " is a Leap Year");
} else {
console.log("Not a Leap Year");
}
🔥 Problem 2: Find the First Number Divisible by 7 (Between 1-100)
for (let i = 1; i <= 100; i++) {
if (i % 7 === 0) {
console.log("Found it: ", i);
break; // প্রথমটা পেলেই থামিয়ে দাও, এটাই এফিশিয়েন্সি
}
}
🚀 অধ্যায় ২ সারাংশ (Summary)
আমরা শিখলাম:
- ✓ Condition: if-else এর বদলে Guard Clauses ব্যবহার করে কোড ক্লিন রাখা।
- ✓ Edge Cases: 0 বা "" যে Falsy, সেটা মনে রাখা।
- ✓ Loops: for নির্দিষ্ট সীমার জন্য, while অনির্দিষ্ট সময়ের জন্য।
- ✓ Control: break দিয়ে লুপ থামানো এবং continue দিয়ে স্কিপ করা।
- ✓ Performance: নেস্টেড লুপ সাবধানে ব্যবহার করা।
এখন আমাদের হাতে লজিক আছে, কিন্তু কোডগুলো ছড়িয়ে ছিটিয়ে আছে। এগুলোকে প্যাকেট করে রি-ইউজেবল করার জন্য পরের পার্টে আমরা শিখব Functions।