Sunday, June 11, 2017

ল্যামডা এক্সপ্রেশনঃ পর্ব তিন (Lambda Expression: Part 3) - ফাংশন বনাম মেথড

মেথড বনাম ফাংশন ( Function vs.  Method)

ল্যমাডা এক্সপ্রেশন ফাংশনাল প্রোগ্রামিংয়ের একটি মৌলিক ধারণা। অন্যদিকে জাভা একটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ল্যাংগুয়েজ। এতে ফাংশনাল প্রোগ্রামিংয়ের এই বিশেষ ধারণাটি নিয়ে আসার কারণগুলো বুঝতে হলে ও ল্যামডা কী ও এটি নিয়ে কাজ করার জন্য ফাংশনাল প্রোগ্রামিং কী তা জেনে নেওয়া জরুরী। এই অংশে ফাংশনাল প্রোগ্রামিংয়ের কতগুলো মূলনীতি নিয়ে আলোচনা করা যাক। 

যে কোনো প্রেগ্রামিং ল্যাংগুয়েজের একটি মৌলিক উপাদান হলো মেথড বা ফাংশন। ব্যবহারিক দিক থেকে অবজেক্ট ওরিয়েন্টেড ও ফাংশনাল প্রোগ্রামিং এই দুটি প্যারাডাইমেই ফাংশন বা মেথড এই শব্দ দুটি একে অপরের স্থলে ব্যবহার করা হলেও এদের মধ্যে মূলনীতিগতভাবে সামান্য পার্থক্য রয়েছে। এই প্রার্থক্যটুকু উপলব্ধি করতে হলে একটু প্রেগ্রামিং ল্যাংগুয়েজের ইতিহাস ও মূলনীতিগুলোর দিকে তাকাতে হবে। 

মেথড ও ফাংশন দুটো দিয়েই একটি ছোট কোড অংশকে বুঝানো হয় যা পুনরায় ব্যবহারযোগ্য। দুটোই আর্গুমেন্ট নেয়, এদের বডি রয়েছে যেখানে কিছু কোড লেখা থাকে যাকে রান করা যায়, এগুলো কোনো ফলাফল রিটার্ন করে বা এদের সাইড ইফেক্ট থাকে। জাভাতে মেথড কোনো একটি ক্লাসের অধিনে থাকে এবং ক্লাসের বাইরে কোনোভাবে মেথড থাকতে পারে না। একটি মেথডের ক্লাসের ডেটাগুলো পড়তে পারে এবং এগুলো পরিবর্তন করতে পারে। একটি মেথড এতে যে আর্গুমেন্টগুলো আসে সেগুলোকেও পরিবর্তন করতে পারে এবং অন্যকোনো সাইড ইফেক্ট তৈরি করতে পারে। তবে সাধারণত এটি ক্লাসের ফিল্ডগুলোকে পরিবর্তন করে এবং একটি ফলাফল তৈরি করে যা রিটার্ন করে। অন্যদিকে ফাংশন সাধারণত কোনো ডেটা পরিবর্তন করে না। এটি শুধুমাত্র আর্গুমেন্টের উপর কাজ করে এবং এগুলোকে পরির্বতন না করেই ফলাফল তৈরি করে এবং রিটার্ন করে। 

মেথডের ধারণাটি এসেছে প্রোসিডিউরাল প্রোগ্রামিং ল্যাংগুয়েজ (ফোরটার্ন, প্যাসকেল, এবং সি ইত্যাদি) থেকে। এগুলোতে মেথড বা প্রোসিডিউরগুলো একটি নির্দিষ্ট ক্রমানুসারে(order) কল করতে হয় এবং এগুলো ডেটার পরিবর্তন করতে পারে। এই পদ্ধতিতে কোনো একটি কাজ করতে হলে প্রোগ্রামারকে একটি প্রোগ্রাম ধাপে ধাপে লিখতে হয়। কীভাবে প্রোগ্রামটি এক্সিকিউট হবে, এক্সিকিউট হলে কী আউটপুট হবে, ভ্যারিয়েবলগুলোর পরিবর্তন কীভাবে হবে ইত্যাদি প্রোগ্রামারকে বিস্তারিত পুঙ্খানুপুঙ্খভাবে (in great detail) বলে দিতে হয়। এই পদ্ধতির আরেকটি নাম ইম্পারেটিভ(imperative)প্যারাডাইম। এই পদ্ধতিতে প্রোসিডিউর বা মেথডের ক্রম খুবই গুরুত্বপূর্ণ। 

অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ল্যাংগুয়েজ যেমন- সি++, স্মলটক, আইফেল এবং জাভা এই প্রোসিডিউরাল পদ্ধতি অনুসরণ করে তৈরি করা হয়েছে। এতে ডেটা এবং প্রোসিডিউর(মেথড) একটি অবজেক্টের মধ্যে আঁটি বাঁধার মতো করে সংযুক্ত করা হয়েছে। তবে মেথডের ধারণাটি একই থাকছে। এটি ডেটার (নিজস্ব ডেটা অর্থাৎ অবজেক্টের স্টেট বা ফিল্ড, অথবা আর্গুমেন্ট আকারে যে ডেটা দেওয়া হয়) উপর কাজ করে তবে ডেটা পরিবর্তনও করতে পারে। 

অন্যদিকে ফাংশনের ধারণাটি এসেছে ফাংশনাল প্রোগ্রামিং ল্যাংগুয়েজ যেমন- লিস্প, হাস্কেল, ক্লোজার ও স্কেলা। এই ল্যাংগুয়েজগুলোতে পিওর ফাংশন বলে একটি ধারণা রয়েছে। পিওর ফাংশন ডেটার পরিবর্তন করে না, বরং এটি এতে আর্গুমেন্ট হিসেবে যে ডেটা দেওয়া হয় তার উপর কাজ করে ফলাফল রিটার্ন করে। এতে একটি ফাংশনও আর্গুমেন্ট হিসেবে পাস করা যায়, কিংবা একটি ফাংশন অন্য একটি ফাংশন রিটার্ন করতে পারে। ফাংশনাল প্রোগ্রামিংয়ে একটি নিদিষ্ট্য কোডকে ডেটার মতো করে পাস করা যায়। 

ফাংশনাল ল্যাংগুয়েজ গুলো ডিক্লেয়ারেটিভ(declarative) হয়। এতে একটি প্রোগ্রাম কী কাজ করবে তা লেখা হয়, কীভাবে নয়। এতে প্রোগ্রামের ফাংশন কলের ক্রম গুরুত্বপূর্ণ নয়। এদে দুটি বিষয়, অর্থাৎ কী এবং কীভাবে, আলাদা থাকে। এতে একজন প্রোগ্রামার কী করতে চায় তা বর্ণনা করে। এই চাওয়ার ইমপ্লিমেন্টেশন অন্য জায়গায় থাকে (ইমপ্লিমেন্টেশন প্রোগ্রামিং ল্যাংগুয়েজে ইন-বিল্ট থাকতে পারে কিংবা প্রোগ্রামার নিজেও লিখতে পারে)। যেহেতু ফাংশনগুলো ডেটার পরিবর্তন করে না, তাই এদের ক্রম যেকোনো রকম হতে পারে। এতে করে একটি প্রোগ্রাম লিখে কী সম্পাদন করা যাচ্ছে তা আলাদা করা যাচ্ছ। 

উপরের আলোচনা থেকে তাহলে আমরা এতটুকু বুঝতে পারি যে, জাভাতে আমরা মেথড লিখি। এগুলো ডেটা পরিবর্তন করতে পারে, এবং এরা যেহেতু ডেটার পরিবর্তন করতে পারে, তাই এদের ক্রম গুরুত্বপূর্ণ (মেথড কল আগে পরে কল করলে ডেটার পরিবর্তনের ক্রম পরিবর্তন হয়ে যেতে পারে, বিভিন্ন বিন্যাসে বিভিন্ন ফলাফল হতে পারে)। এতে কী সম্পাদন করতে চাই তার সঙ্গে কীভাবে তা সম্পাদিত হবে তাও লিখে দিতে হয়। অন্যদিকে আমরা পিওর ফাংশনও জাভাতে লিখতে পারি। জাভা ৮ এর আগে এই পিওর ফাংশনগুলো অ্যানোনিমাস ইনার ক্লাসের মাধ্যমে লেখা হতো। তবে এখন এগুলো ল্যামডা এক্সপ্রেশনের মাধ্যমে লেখা যায়। ল্যামডা এক্সপ্রেশন যদি ডেটার পরির্বতন না করে, তাহলে এগুলোকে পিউর ফাংশন বলা যায়। 

তবে জাভা যেহেতু এখন একটি হাইব্রিড ল্যাংগুয়েজ তাই ফাংশনাল ল্যাংগুয়েজের এই বৈশিষ্টগুলো এখানে স্পষ্ট নয়। একটি মেথড ডেটার পরিবর্তন না করেও কাজ করতে পারে। এক্ষেত্রে একে পিওর ফাংশন বলতে আপত্তি করার কারণ নেই। তেমনভাবে একটি ফাংশনও জাভাতে চাইলে ডেটার পরির্বতন করতে পারে। তবে এই আলদাকরণটুকু মনে রাখা গেলে ল্যামডা এক্সপ্রেশন নিয়ে কাজ করাটুকু আরও সহজতর হবে। 

সাইড ইফেক্ট

প্রোগ্রামের একটি স্টেট(state) থাকে। অবজেক্ট ওরিয়েন্টেট প্রোগ্রামিংয়ে একটি ক্লাসের বেশ কতগুলো ফিল্ড থাকে। স্ট্রাকচারড প্রোগ্রামিংয়ে গ্লোবাল ভ্যারিয়েবল থাকে। কোনো একটি ফাংশন কলের ফলে যদি এই ফিল্ড বা গ্লােবাল ভ্যারিয়েবলের কোনো পরিবর্তন হয় তাহালে সেই ঘটনাকে সাইড ইফেক্ট বলা হয়। একটি ফাংশন বা মেথডের নিজস্ব স্কোপ থাকে। ফাংশন বা মেথডের নামের পর কার্লি ব্রেস শুরু থেকে শেষ পর্যন্ত এর স্কোপ। এই স্কোপের বাইরে কোনো কিছর পরিবর্তন করলেই তা সাইড ইফেক্ট হিসেবে গণ্য হবে। উদাহরণ- কোন ফাংশন বা মেথড চলাকলিন সময়ে কোনো কিছু স্ক্রিনে প্রিন্ট করতে পারে। 

এই সাইড ইফেক্ট না থাকার অনেকগুলো অর্থ হয়। কোনো ফাংশন কলের ফলে নিচের কাজগুলো হবে না - 
১. কোনো ভ্যারিয়েবল পরিবর্তন হবে না। 
২. কনসোল বা স্ক্রিনে কোনো কিছু প্রিন্ট হবে না। 
৩. ডাটাবেইজ, নেটওয়ার্ক বা অন্যকোনো ডিভাইসে ডেটা রাইট হবে না। 
৪. কোনোরকম এক্সেপশন থ্রু করবে না। 
ইত্যাদি



-->