Tuesday, June 20, 2017

ফাংশন কম্পোজিশন (Function Composition)

ফাংশন কম্পোজিশন (Function Composition)

অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ে একটি অবজেক্টের সঙ্গে এক বা একাধিক অবজেক্ট যুক্ত করে (অ্যাসোসিয়েশন বা ইনহেরিটেন্সের মাধ্যমে) নতুন অবজেক্ট তৈরি করা যায়। একইভাবে জাভাতে java.util.function.Function ফাংশনাল ইন্টারফেস একাধিক ফাংশন কম্বাইন করে নতুন পুনঃব্যবহারযোগ্য (reusable) ফাংশন তৈরি করা যায়। একেই ফাংশন কম্পোজিশন বলে।

ফাংশন কম্পোজিশনের জন্য এই ফাংশন ইন্টারফেসে দুটি ডিফল্ট মেথড রয়েছে। এগুলো হলো - compose() এবং
andThen()

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

ফাংশন মূলত এক ধরণের ম্যাপিং। এটি এক বা একাধিক ইনপুট নিয়ে অন্য একটি ভ্যালু আউটপুট হিসেবে দেয়। মনে করি একটি ফাংশন-




তাহলে যে কোনো ইন্টিজার ইনপুটের জন্য এর ম্যাপিং হবে -



















এখন মনে করি আরেকটি ফাংশন -




যে কোনো ইন্টিজার ইনপুটের জন্য এর ম্যাপিং হবে -



















এখন আমরা দুটি ফাংশনের ম্যাপিং জানি। এই দুটি ফাংশন কম্বাইন করে আমরানির্ণয় করতে পারি।


একে আমরা এভাবে লিখতে পারি -


এটি বের করার স্টেপগুলো নিচে সহজভাবে দেওয়া হলো-












তাহলে প্রথমে আমাদের g(1) বের করতে হবে। এটি আমরা উপরের প্রথম ফাংশনের চার্ট থেকে বের করতি পারি কিংবা অংক করেও বের করতে পারি -



এখন


h(-3) এর মান আমরা দ্বিতীয় ফাংশনের চার্ট থেকে বের করতে পারি কিংবা অংক করেও বের করতে পারি। -




এভাবে আমরা দুটি ফাংশন কম্বাইন করে একটি ফলাফল পেলাম।

একইভাবে এই দুটি ফাংশনকে যদি আমরা ল্যমাডা এক্সপ্রেশন দিয়ে প্রকাশ করি তাহলে হবে -


Function g = x -> (int) (Math.pow(x, 2)) - 4;
Function h = y -> 3 * (int) (Math.pow(y - 1, 2)) - 5;


এই দুটি ফাংশনকে কম্বাইন করার জন্য আমরা ফাংশন ইন্টারফেসের ডিফল্ট মেথড compose()
ব্যবহার করে আরেকটি নতুন ফাংশন তৈরি করতে পারি।


Function hog = h.compose(g);

এখন এই ফাংশনে যদি 1 ইনপুট দেওয়া হয়, তাহলে আউটপুট আসবে 43

Integer result = hog.apply(1);
System.out.println(result);

output : 
43 


এভাবে আমরা গাণিতিক ফাংশনের মতো জাভার ফাংশনাল ইন্টারফেস Function ব্যবহার করতে পারি।

এই ফাংশনে দুটি ডিফল্ট মেথডই এই ফাংশনের কম্পোজিশনের জন্য ব্যবহার করা হয়। তবে এদের কাজ করার ক্রমের পার্থ্ক্য রয়েছে।


Function hog = h.compose(g);
Function hAndThenG = h.andThen(g);


উপরের দুটি উদাহরণের মধ্যে প্রথমটিতে compose() মেথড এবং দ্বিতীয়টিতে andThen() ব্যবহার করা হয়েছে। প্রথমটির ক্ষেত্রে আগে g ল্যামডা এক্সপ্রেশনটি ইভ্যালুয়েট হবে এবং এর আউটপুট h এর ল্যামডা এক্সপ্রেশনে আর্গুমেন্ট হিসেবে দেওয়া হবে। দ্বিতীয়টির ক্ষেত্রে প্রথমে h এর ল্যামডা এক্সপ্রেশনটি ইভ্যালুয়েট হবে এবং এর আউটপুট g এর ল্যামডা এক্সপ্রেশনে আর্গুমেন্ট হিসেবে যাবে।
-->