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

শুরু করা যাক
গাণিতিক ধারণার সাথে এতে আলোচনা করি। উপরের ডায়াগ্রামে, "f" এবং "g" হলো দুটি ফাংশন। আমরা ফাংশনগুলোকে নিচে উপস্থাপন করতে পারি:
f: A -> Bg: B -> Cযদি আমরা এই দুটি ফাংশনের কম্পোজিশন করি, তবে আমরা এটিকে "g o f" (আপনি বলতে পারেন g of f) হিসেবে উপস্থাপন করতে পারি।
(g o f): A -> C such that (g o f)(a) = g(f(a)) for all a in Aএকটি সহজ উদাহরণ দিয়ে আরও এক্সপ্লোর করি:
Let f(a) = 2a + 3 & g(a) = 3a + 5, then function composition(g o f)(a) = g(f(a)) = 3(f(a)) + 5 = 3(2a + 3) + 5 = 6a + 14এই ধারণা শুধু গাণিতিকেই প্রযোজ্য নয় - প্রোগ্রামিং ল্যাঙ্গুয়েজেও প্রযোজ্য। এই ল্যাঙ্গুয়েজগুলোকে ফাংশনাল প্রোগ্রামিং ল্যাঙ্গুয়েজ বলা হয়। এই ধারণা বুঝলে আপনার কোডের রিডেবিলিটি বাড়ে এবং অন্য প্রোগ্রামারদের জন্য বোঝা সহজ হয়।
ফাংশনাল প্রোগ্রামিং ল্যাঙ্গুয়েজ হিসেবে Swift-এ পরিচিতি
খুশির খবর হলো Swift-ও একটি ফাংশনাল প্রোগ্রামিং ল্যাঙ্গুয়েজ। Swift প্রোগ্রামিং-এ ফাংশন সবচেয়ে গুরুত্বপূর্ণ ভূমিকা পালন করে, তাই আপনি প্রতিদিন এর সাথে ইন্টারঅ্যাক্ট করবেন। একটি Swift ফাংশন একটি ভ্যালু রিটার্ন করতে পারে, এবং তারপর আমরা রিটার্ন করা ভ্যালুকে অন্য একটি ফাংশনে ইনপুট হিসেবে ব্যবহার করতে পারি। এটি একটি সাধারণ প্রোগ্রামিং প্র্যাকটিস।
Swift-এ ফাংশন কম্পোজিশন বাস্তবায়ন
ধরুন আমাদের একটি ইন্টিজার অ্যারে আছে, এবং আমরা আউটপুট চাই ইউনিক ইভেন ইন্টিজারের স্কোয়ারড অ্যারে। সাধারণত আমরা নিচের মত ফাংশন বাস্তবায়ন করতাম:
এই কোড আমাদের সঠিক আউটপুট দেয়, কিন্তু আপনি দেখতে পাচ্ছেন কোডের রিডেবিলিটি ভালো নয়। এছাড়া, ফাংশন কলিং অর্ডার আমরা যা চাই তার বিপরীত দেখাচ্ছে, এবং নতুন প্রোগ্রামারদের বিভ্রান্ত করতে পারে। এই কোড ব্লক বিশ্লেষণ করা কঠিন।
এখানে ফাংশন কম্পোজিশন আমাকে উপরের সব সমস্যা থেকে রক্ষা করতে আসে। আমরা জেনেরিক্স, ক্লোজার, এবং ইনফিক্স অপারেটর využয় করে ফাংশন কম্পোজিশন অর্জন করতে পারি।
উপরের কোড ব্লকে কী হচ্ছে তা দেখি:
- আমরা একটি কাস্টম ইনফিক্স অপারেটর ">>>" ডিক্লেয়ার করেছি। এর লেফ্ট অ্যাসোসিয়েটিভিটি এবং প্রেসিডেন্স অর্ডার + অপারেটরের মতো।
- ইনফিক্স অপারেটরের মতো একই নামে একটি ফাংশন ডিক্লেয়ার করেছি। ফাংশনটি তিনটি জেনেরিক T, U, V ব্যবহার করে এবং দুটি ক্লোজার ইনপুট প্যারামিটার হিসেবে নেয়।
- লেফ্ট প্যারামিটার একটি ক্লোজার, যা টাইপ T ইনপুট নেয় এবং টাইপ U আউটপুট রিটার্ন করে।
- রাইট প্যারামিটারও একটি ক্লোজার, যা টাইপ U ইনপুট নেয় এবং টাইপ V আউটপুট রিটার্ন করে।
- এখন, >>> ফাংশন একটি ফাংশন বা ক্লোজার রিটার্ন করে, যার টাইপ (T) → V। আউটপুট ক্লোজার টাইপ T ইনপুট নেয় এবং টাইপ V আউটপুট রিটার্ন করে। এখানে লেফ্ট প্যারামিটারের আউটপুট রাইট প্যারামিটারের ইনপুট।
left : (T) -> U right: (U) -> VOutput Type: (T) -> Vআপনি যদি ফাংশন কম্পোজিশনের গাণিতিক উপস্থাপনা বুঝেন, তবে আপনি দেখবেন এটি Swift-এর বাস্তবায়নের সাথে একদম একই।
৬. ফাংশন বডিতে, এটি রাইট প্যারামিটারের রেজাল্ট রিটার্ন করে লেফ্ট প্যারামিটারের ওপর।
এখন একই রেজাল্ট (ইভেন ইন্টিজারের স্কোয়ারড ইউনিক অ্যারে) পেতে চাইলে, আমরা ফাংশন কম্পোজিশন দিয়ে এটি করতে পারি।
এটি ফাংশনদের একটি চেইন যা একই রেজাল্ট রিটার্ন করে। ফাংশন অর্ডার এখন মানুষের চিন্তার মতো দেখায়। এর রিডেবিলিটি ভালো এবং সবার জন্য বোঝা সহজ।
পড়ার জন্য ধন্যবাদ!