প্রোসিডিউরাল (Procedural) vs ডিক্লেরেটিভ (Declarative) নলেজ/প্রোগ্রামিং
এই দুটি প্যারাডাইমের পার্থক্য হলো **"কীভাবে" (How)** বনাম **"কী" (What)**। জাভাস্ক্রিপ্টে এটিימפেরেটিভ (প্রোসিডিউরাল) বনাম ফাংশনাল/ডিক্লেরেটিভ শৈলির প্রতিফলন।
প্রোসিডিউরাল নলেজ (Procedural / Imperative)
কীভাবে কাজটি করা হবে — ধাপে ধাপে নির্দেশনা দেওয়া। কন্ট্রোল ফ্লো, লুপ, কন্ডিশন, মিউটেশন ব্যবহার করে।
উদাহরণ: অ্যারে কপি করা (প্রোসিডিউরাল)
const a = [1, 2, 3, 4, 5];
const b = [];
for (let i = 0; i < a.length; i++) {
b.push(a[i]); // প্রতিটি ধাপ স্পষ্টভাবে বলা হয়েছে
}
console.log(b); // [1, 2, 3, 4, 5]
ডিক্লেরেটিভ নলেজ (Declarative / Functional)
কী করা হবে — লজিক বা ফর্মুলা ঘোষণা করা, কীভাবে হবে তা ল্যাঙ্গুয়েজ/লাইব্রেরির ওপর ছেড়ে দেওয়া।
উদাহরণ: অ্যারে কপি করা (ডিক্লেরেটিভ)
const a = [1, 2, 3, 4, 5];
const b = a.map(x => x * 1); // বা শুধু a.map(x => x) / [...a]
console.log(b); // [1, 2, 3, 4, 5]
তুলনামূলক টেবিল
| বিষয় | প্রোসিডিউরাল (Imperative) | ডিক্লেরেটিভ (Functional) |
|---|---|---|
| অন্য নাম | ইম্পেরেটিভ নলেজ | ফাংশনাল নলেজ |
| কেন্দ্রবিন্দু | How — কীভাবে করা হবে | What — কী করা হবে |
| কমিউনিকেশন | কঠিন (বিস্তারিত স্টেপ) | সহজ (উচ্চ-স্তরের অভিব্যক্তি) |
| অরিয়েন্টেশন | প্রসেস-অরিয়েন্টেড | ডেটা-অরিয়েন্টেড |
| ভ্যালিডেশন | কঠিন (স্টেপে স্টেপ চেক) | সহজ (ফাংশন কম্পোজিশন) |
| ডিবাগিং | কঠিন (স্টেট মিউটেশন ট্র্যাক) | সহজ (ইমিউটেবল ডেটা, পিউর ফাংশন) |
| রিঅডেবিলিটি | বড় লজিকে জটিল | স্পষ্ট এবং সংক্ষিপ্ত |
| পারফরম্যান্স | নিম্নস্তরে অপ্টিমাইজ করা যায় | কাঙ্কারেন্ট/পারালেল প্রসেসিং সুবিধা |
জাভাস্ক্রিপ্টে আরও উদাহরণ
ফিল্টারিং:偶数 খুঁজে বের করা
// প্রোসিডিউরাল
const evensProc = [];
for (let i = 0; i < numbers.length; i++) {
if (numbers[i] % 2 === 0) evensProc.push(numbers[i]);
}
// ডিক্লেরেটিভ
const evensDecl = numbers.filter(n => n % 2 === 0);
সাম রिडাকশন
// প্রোসিডিউরাল
let sum = 0;
for (const n of numbers) sum += n;
// ডিক্লেরেটিভ
const sum = numbers.reduce((acc, n) => acc + n, 0);
অ্যাসিঙ্ক্রোনাস: ডেটা ফেচ করে প্রসেস
// প্রোসিডিউরাল (Promise চেইন)
fetchUsers()
.then(users => users.filter(u => u.active))
.then(active => active.map(u => u.name))
.then(names => console.log(names));
// ডিক্লেরেটিভ (Async/Await - আরও পঠনযোগ্য)
const users = await fetchUsers();
const activeNames = users.filter(u => u.active).map(u => u.name);
console.log(activeNames);
কোনটি কখন ব্যবহার করবেন?
- প্রোসিডিউরাল: কমপ্লেক্স অ্যালগরিদম, লো-লেভেল অপ্টিমাইজেশন, লিগ্যাসি কোডবেস, যেখানে প্রতিটি স্টেপের নিয়ন্ত্রণ দরকার।
- ডিক্লেরেটিভ: বইজনেস লজিক, UI রেন্ডারিং (React/Vue), ডেটা ট্রান্সফরমেশন, টিম কলাবোরেশন, মেইনটেইনেবিলিটি।
আধুনিক জাভাস্ক্রিপ্টের প্রবণতা
ES6+ (arrow functions, array methods, async/await, destructuring) ডিক্লেরেটিভ শৈলিকে প্রমুখ করেছে। লাইব্রেরিগুলো (React, Redux, RxJS, Lodash/FP) ডিক্লেরেটিভ API প্রদান করে। তবে **দুইই শৈলী একসাথে ব্যবহার করা হয়** — প্রফরম্যান্স-ক্রিটিক্যাল অংশে ইম্পেরেটিভ, বাকি অংশে ডিক্লেরেটিভ।
"প্রোগ্রামগুলো মানুষ পড়তে লিখা উচিত, মেশিন এক্সিকিউট করতে লিখা অপরিহার্য।" — Harold Abelson