হয়তো আপনি এইমাত্র কার্যকরী প্রোগ্রামিং সম্পর্কে শুনেছেন এবং কিছু প্রশ্ন আছে।
লাইক…
- ফাংশনাল প্রোগ্রামিং আসলে কি?
- এটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের সাথে কীভাবে তুলনা করে?
- আপনার কি রুবিতে কার্যকরী প্রোগ্রামিং ব্যবহার করা উচিত?
আমাকে আপনার জন্য এই প্রশ্নগুলির উত্তর দিন যাতে আপনি এটি কীভাবে কাজ করে সে সম্পর্কে আরও ভাল ধারণা পেতে পারেন৷
ফাংশনাল প্রোগ্রামিং কি?
এটি কেবল একটি ফ্যাড বা অভিনব শব্দ নয়, এটি একটি বাস্তব প্রোগ্রামিং দৃষ্টান্ত যা দীর্ঘকাল ধরে চলে আসছে তবে এটি সম্প্রতি জনপ্রিয়তা ফিরে পেয়েছে৷
এবং এই দৃষ্টান্তের পিছনের মূল ধারণাগুলি আপনার ধারণার চেয়ে বোঝা সহজ৷
কার্যকরী প্রোগ্রামিং-এ আমরা স্থিতি পরিবর্তন এড়াই এবং আমরা "শুদ্ধ" ফাংশন লেখার চেষ্টা করি .
স্টেট পরিবর্তন এড়ানোর অর্থ হল এই ফাংশনগুলি ফাংশনের বাইরে কিছু পরিবর্তন করে না, কোনো ইনস্ট্যান্স ভেরিয়েবল, কোনো বস্তু পরিবর্তন করে না যা পাস করা হয়েছিল…
এর কোনোটিই নয়!
একটি কার্যকরী প্রোগ্রামিং ভাষায় (হাস্কেলের মতো) সমস্ত ডেটা অপরিবর্তনীয়।
ভেরিয়েবলের মত জিনিস আছে, কিন্তু তারা গাণিতিক জগতের মত আচরণ করে। একবার একটি ভেরিয়েবলকে একটি মান দেওয়া হলে, কম্পাইলার আপনাকে এই ভেরিয়েবলটিকে অন্য মান দিয়ে পুনরায় সংজ্ঞায়িত করার অনুমতি দেবে না।
ফাংশনাল প্রোগ্রামিং এর উপকারিতা
অপরিবর্তনীয়তা হল কার্যকরী প্রোগ্রামিংয়ের প্রধান সুবিধা কারণ পরিবর্তনযোগ্য ডেটা সূক্ষ্ম ত্রুটির কারণ হতে পারে যা ট্র্যাক করা কঠিন।
উদাহরণ :
def all_different_from_first?(arr) first = arr.shift arr.all? { |n| n != first } end arr = [1,3,5,7,9] p all_different_from_first?(arr) # true
এই উদাহরণে আমি জানতে চাই অ্যারের সমস্ত উপাদান প্রথম উপাদান থেকে আলাদা কিনা৷
৷এই কাজটি করার জন্য আমাদের অ্যারে থেকে প্রথম উপাদানটি সরাতে হবে এবং একই সাথে এই উপাদানটিকে সংরক্ষণ করতে হবে যাতে আমরা এটিকে বাকিগুলির সাথে তুলনা করতে পারি৷
আমরা এটা কিভাবে করতে পারি?
আমরা একটি অ্যারের সাথে কাজ করছি এবং আপনি যদি উপলব্ধ পদ্ধতির তালিকাটি দেখেন তবে আপনি দেখতে পাবেন যে অ্যারে#শিফ্ট পদ্ধতিটি আমরা যা চাই তা ঠিক করে৷
এটি ঠিকঠাক কাজ করে যতক্ষণ না…
…আপনি arr
এর মান দেখুন পদ্ধতিটি একবার কল করার পরে:
all_different_from_first?(arr) # true arr # [3,5,7,9]
আশ্চর্য!
অ্যারে একটি উপাদান হারিয়েছে (1
) এবং আমরা লক্ষ্য করিনি।
এই ধরনের পরিবর্তনশীলতা বাগগুলি কতটা গোপন হতে পারে।
স্থির সংস্করণ :
def all_different_from_first?(arr) arr[1..-1].all? { |n| n != arr.first } end
কার্যকর বনাম OOP
আমাদের কি শুধু কার্যকরী প্রোগ্রামিং গ্রহণ করা উচিত?
মনে হতে পারে যে এই সমস্ত অপরিবর্তনীয় অবস্থা কার্যকরী প্রোগ্রামিংকে OOP এর সম্পূর্ণ বিপরীত করে তোলে, এবং এক অর্থে এটি, তবে এখনও একটি উপায় আছে যে দুটি প্রোগ্রামিং দৃষ্টান্ত একসাথে কাজ করতে পারে .
তাই না, তাড়াহুড়ো করে ফুল-অন ফাংশনাল প্রোগ্রামিংয়ে যাওয়ার দরকার নেই। রুবি যেভাবেই হোক OOP-এর জন্য ডিজাইন করা হয়েছে, তাই আপনি শস্যের বিরুদ্ধে লড়াই করবেন।
সুসংবাদ :
আপনি এখনও কার্যকরী প্রোগ্রামিং থেকে সেরা ধারণাগুলি ব্যবহার করতে পারেন এবং সেগুলিকে আপনার রুবি কোডে প্রয়োগ করতে পারেন৷
৷আসুন এটি কীভাবে করবেন সে সম্পর্কে কথা বলি।
যতটা সম্ভব পরিবর্তনশীলতা হ্রাস করুন
এটি করার একটি উপায় হল attr_accessor
ব্যবহার করে বন্ধ করা , শুধুমাত্র attr_reader
এ লেগে থাকুন .
এটি করার পরে আপনাকে স্ট্রিং, অ্যারে এবং হ্যাশের উপর নজর রাখতে হবে।
এমন পদ্ধতি আছে যা এই বস্তুগুলিকে পরিবর্তন করবে:
- অধিকাংশ পদ্ধতির শেষ
!
(যেমনgsub!
) - মুছুন
- আপডেট
- পরিষ্কার
- shift / unshift / pop / push
প্রথম ধাপ হল এই পদ্ধতিগুলো সম্পর্কে সচেতন হওয়া।
যদি আপনাকে এই পদ্ধতিগুলির মধ্যে একটি ব্যবহার করতে হয় তবে আপনি একটি সদৃশ বস্তুতে কাজ করতে পারেন৷
একটি স্ট্রিং এবং সেই স্ট্রিংয়ের একটি ক্লোন দেওয়া হয়েছে :
str = "abcd" dup = str.dup
যখন আমরা clear
করি তখন আমরা এই ফলাফলগুলি পাই সদৃশ স্ট্রিং:
dup.clear # str => "abcd" # dup => ""
এটি মূল স্ট্রিংটিকে নিরাপদ রাখে৷
৷আংশিক আবেদন
অপরিবর্তনীয় ডেটা এবং বিশুদ্ধ ফাংশনের চেয়ে কার্যকরী প্রোগ্রামিংয়ের আরও অনেক কিছু রয়েছে৷
ফাংশনগুলির আংশিক প্রয়োগের মতো, যা "কারি করা" নামেও পরিচিত৷
৷উদাহরণ :
def add(a,b) a + b end add_five = method(:add).curry[5] add_five.call(5) # 10 add_five.call(20) # 25
কিভাবে add
লক্ষ্য করুন পদ্ধতি দুটি আর্গুমেন্ট নেয়, কিন্তু curry
ব্যবহার করে পদ্ধতিতে আমরা একটি আর্গুমেন্ট "প্রিলোড" করতে পারি।
তারপরে আমরা একটি ল্যাম্বডা পাই যাকে আমরা শুধুমাত্র ২য় যুক্তি দিয়ে কল করতে পারি।
এখানে আরেকটি উদাহরণ আছে :
list = (1..10) greater_than = ->(x,y) { y > x }.curry list.select(&greater_than.(5)) # [6, 7, 8, 9, 10] list.select(&greater_than.(8)) # [9, 10]
আরো একটি উদাহরণ :
divisible_by = ->(x,y) { y % x == 0 }.curry list.select(&divisible_by.(5)) # [5, 10] list.select(&divisible_by.(2)) # [2, 4, 6, 8, 10]
সারাংশ
আপনি কার্যকরী প্রোগ্রামিং সম্পর্কে শিখেছেন, এর মূল বিষয় হল বিশুদ্ধ ফাংশন এবং অপরিবর্তনীয় ডেটা, এটি আপনার কোড সম্পর্কে চিন্তা করার একটি উপায় এবং OOP এর সাথে সম্পূর্ণরূপে বেমানান নয়৷
পড়ার জন্য ধন্যবাদ, নিউজলেটার সাবস্ক্রাইব করতে ভুলবেন না যদি আপনি এখনও না করেন! 🙂