কম্পিউটার টিউটোরিয়াল

প্রোসিডিউরাল এবং ডিক্লেরেটিভ নলেজের পার্থক্য (জাভাস্ক্রিপ্ট উদাহরণসহ)

প্রোসিডিউরাল (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

  1. প্রসিডিউরাল (Procedural) এবং নন-প্রসিডিউরাল (Non-procedural) ল্যাঙ্গুয়েজের পার্থক্য

  2. C# এবং Visual C#-র পার্থক্য

  3. C# এবং .NET-এর পার্থক্য

  4. Go এবং Java-এর পার্থক্য