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

রুবি অন রেইলসে পলিমরফিজম (Polymorphism) মास্টার করুন: একটি প্র্যাক্টিক্যাল গাইড

আপনি যদি কোনো অবজেক্ট-অরিয়েন্টেড প্রোগ্রাম (OOP) বানাতে সময় ব্যয় করে থাকেন, তবে আপনি নিশ্চিতরূপে আপনার অ্যাপ্লিকেশনে পলিমরফিজম ব্যবহার করেছেন, অথবা কমপক্ষে শব্দটি শুনে থাকেন।

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

এই আর্টিকেল আপনাকে পলিমরফিজমের বোঝাপড়া বাড়াবে, বিশেষ করে রুবি অন রেইলসে। এটি সম্পন্ন করতে, আমরা নিচের বিষয়গুলোর ওপর গভীরে যাব:

  • বাস্তব জগতে পলিমরফিজমের ব্যবহার
  • OOP-এর মাধ্যমে প্রোগ্রামিং-এ পলিমরফিজম
  • আপনি কীভাবে আপনার রেইলস অ্যাপ্লিকেশনে এটি অন্তর্ভুক্ত করতে পারেন হাই-কোডালিটি কোড মেইনটেইন করতে

চলুন শুরু করি!

বাস্তব জগতে পলিমরফিজম

বিভিন্ন প্রেক্ষাপটে পলিমরফিজম ডিফাইন করার অনেক পদ্ধতি আছে। একটি উপযোগী ডিফিনিশন, প্রেক্ষাপট নির্বিশেষে, হল 'একটি অবজেক্টের একাধিক রূপ প্রদর্শন করার ক্ষমতা'। আসলে, শব্দটি ভাঙলে, poly মানে 'অনেক' এবং morph মানে 'রূপ'।

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

পলিমরফিজম এবং জেনেটিক্স (Genetics)

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

বাঘ (Jaguars) চিন্তা করুন। বাঘদের একাধিক জিন ভেরিয়েশন থাকতে পারে, যা তাদের লোমের রঙ প্রভাবিত করতে পারে। অধিকাংশ বাঘদের তান রঙের সাথে কালো বৃত্ত থাকে। যেদবি, পরিবর্তিত জিনের কারণে তারা হালকা বা গাড়া বৃত্তযুক্ত হতে পারে, এবং কিছু কালো লোমের রঙযুক্ত হতে পারে।

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

মোনোমরফিজম বনাম পলিমরফিজম

আমরা যদি মনোমরফিজম (Monomorphism) এর ওপর মনোযোগ দিই, তবে আমরা পলিমরফিজম আরও ভালো বুঝতে পারি। জীববিজ্ঞানের সাথে থাকুন, মনোমরফিজম ডিফাইন করা যায় 'এক রূপবিশিষ্ট একটি প্রজাতি' যা তার বিকাশের বিভিন্ন পর্যায়ে সেই একই রূপ ধরে রাখে।

পেঙ্গুইনসমনোমরফিক। বিশেষজ্ঞদের জন্য লিঙ্গ পার্থক্য করা কঠিন। পেঙ্গুইনের জিন পার্থক্য নগণ্য। অতএব, পেঙ্গুইনদের শারীরিক বৈশিষ্ট্যগুলো প্রায় অ الضفةচিহ্নে বের করা যায়, বিশেষ করে তাদের আকার এবং কালো-সাদা রঙের কারণে।

বিহেভিয়োরাল কিউস (Behavioural cues) প্রায়ই মনোমরফিক প্রজাতিতে লিঙ্গের মধ্যে পার্থক্য করার সবচেয়ে সহজ উপায়।

এখন প্রোগ্রামিং-এ পলিমরফিজমে, বিশেষ করে, মনোযোগ দিই।

OOP-এ পলিমরফিজম

আমরা যদি আমাদের প্রাথমিক পলিমরফিজমের ডিফিনিশন বিবেচনা করি — একটি অবজেক্টের একাধিক রূপ প্রদর্শন করার ক্ষমতা — তবে আমরা সহজে এটি OOP-এর সাথে সংযুক্ত করতে পারি।

OOP-এ, আমরা একই মেথড ব্যবহার করে ভিন্ন ফলাফল প্রাপ্য করতে পারি আলাদা আলাদা অবজেক্ট পাস করে। আমরা কন্ডিশনালস ব্যবহার করে এটা অর্জন করতে পারি। যেদবি, এটি চাঙ্কি কোড তৈরি করতে পারে এবং DRY প্রিন্সিপল থেকে দূরে নিতে পারে। ক্লিন এবং লজিক্যাল OOP অ্যাপ্লিকেশন তৈরি করতে পলিমরফিজম অপরিহার্য।

রুবি মতো একটি OOP ল্যাঙ্গুয়েজে পলিমরফিজম কীভাবে ইমপ্লিমেন্ট করা যায় সেটি দেখতে দুটি উদাহরণ দেখি: ইনহেরিটেন্স (Inheritance) এবং ডাক-টাইপিং (Duck-typing) এর মাধ্যমে।

রুবিতে পলিমরফিজম এবং ইনহেরিটেন্স

ইনহেরিটেন্স হল যেখানে একটি চাইল্ড ক্লাস প্যারেন্ট ক্লাসের প্রোপার্টিগুলো ইনহেরিট করে।

নিচে ইনহেরিটেন্সের মাধ্যমে পলিমরফিজম ইমপ্লিমেন্ট করার একটি উদাহরণ:


উপরের কোডে দুটি চাইল্ড ক্লাস আছে — Stringed এবং Percussion — যা প্যারেন্ট ক্লাস Instrument থেকে ইনহেরিট করা। এই উদাহরণটি পলিমরফিক, কারণ আমরা একটি মেথড কল করছি: instrument_example — এবং এটি একাধিক রূপ আউটপুট দিচ্ছে: Saxophone, Guitar, এবং Drums।

ইনহেরিটেন্সের মাধ্যমে পলিমরফিজম অর্জনের এই উদাহরণটি মূলত একটি মেথড ওভাররাইড করা, কিন্তু OOP ল্যাঙ্গুয়েজে পলিমরফিজমের বোঝাপড়া স্পষ্ট করতে সাহায্য করে।

রুবিতে ডাক-টাইপিং (Duck-Typing) এবং পলিমরফিজম

OOP-এ পলিমরফিজমের একটি আরও প্র্যাক্টিক্যাল উদাহরণ হল ডাক-টাইপিং, নিচে রেফারেন্স দেওয়া হলো।


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

আবার, ডাক-টাইপিং পলিমরফিক কারণ আমরা একটি মেথড কল করছি — brand — এবং একাধিক রূপে আউটপুট জেনারেট হচ্ছে: Gibson, Pearl, Fender, এবং Casio। অবশ্য, এই ফলাফল প্রাপ্য করার জন্য ডাক-টাইপিং এবং পলিমরফিজম আবশ্যক নয়। যেদবি, ক্লিন এবং লজিক্যাল কোড ইমপ্লিমেন্ট করার জন্য এটি খুব উপযোগী।

রুবি অন রেইলসে পলিমরফিজম

পলিমরফিজম রুবি অন রেইলসে একটি Active Record অ্যাসোসিয়েশন হিসেবে ভালো কাজ করে। যদি মডেলগুলো মূলত একই কাজ করে, তবে আমরা সেগুলোকে একটি একক মডেলে পরিবর্তন করে একটি পলিমরফিক রিলেশনশিপ তৈরি করতে পারি।

ইনস্ট্রুমেন্ট থিমের সাথে থাকি, একটি অ্যাপ্লিকেশন বিবেচনা করুন যেখানে ব্যবহারকারীরা ইনস্ট্রুমেন্ট পোস্ট, কমেন্ট, এবং রিভিউ করতে পারে। নিচের Entity-Relationship Diagram (ERD) পরীক্ষা করুন:

রুবি অন রেইলসে পলিমরফিজম (Polymorphism) মास্টার করুন: একটি প্র্যাক্টিক্যাল গাইড

এই উদাহরণে, আমাদের একটি অ্যাপ্লিকেশনের ERD আছে যেখানে একজন ব্যবহারকারী একটি ইনস্ট্রুমেন্ট তার ডিটেইলসহ পোস্ট করতে পারে। একজন ব্যবহারকারী সেই পোস্ট করা ইনস্ট্রুমেন্ট সম্পর্কে কমেন্টও দিতে পারে।

অন্য ব্যবহারকারীরা তারপর ইনস্ট্রুমেন্টের রেটিং দিতে পারে এবং কমেন্টগুলোর রেটিং দিতে পারে তাদের usefulness বা validity নির্ধারণ করতে। এই Active Record অ্যাসোসিয়েশনগুলো ঠিকমতো কাজ করে এবং আমাদের অ্যাপ্লিকেশনের উদ্দেশ্য সার্ভ করে।

কি হবে যদি আমরা আমাদের অ্যাপ্লিকেশনে অন্যান্য অ্যাসোসিয়েশন যোগ করতে চাই? আমাদের ডুপ্লিকেট অ্যাসোসিয়েশন যোগ এবং রিপিট করতে হবে।

উদাহরণস্বরূপ, যদি আমরা একটি user_rating মডেল যোগ করতে চাই একজন ব্যবহারকারীর विश्वসনীয়তা রেট করার জন্য, আমাদের একটি আলাদা টেবিল তৈরি করতে হবে তার নিজস্ব অ্যাসোসিয়েশনসহ। এর মানে user এবং user_rating মডেলের মধ্যে একটি নতুন রিলেশনশিপ যোগ করা। ERD তখন কিছুটা এর মতো দেখাবে:

রুবি অন রেইলসে পলিমরফিজম (Polymorphism) মास্টার করুন: একটি প্র্যাক্টিক্যাল গাইড

এখন আমাদের তিনটি মডেল আছে যা মূলত একই কাজ করছে: একটি অবজেক্ট রেট করা, কিন্তু ভিন্ন প্রেক্ষাপটে। এই অ্যাসোসিয়েশনগুলো পলিমরফিক অ্যাসোসিয়েশনের জন্য পাকা।

রেটিং মডেলগুলো পলিমরফিক হিসেবে ERD-তে একটি নজর দেই:

রুবি অন রেইলসে পলিমরফিজম (Polymorphism) মास্টার করুন: একটি প্র্যাক্টিক্যাল গাইড

যেহেতু আমাদের একটি rating কলাম আছে, আমি মডেলের নাম reviews রেখেছি ratings এর বদলে বিভ্রান্তি এড়াতে। এখানে, non-review মডেলগুলো অন্য মডেলের সাথে অ্যাসোসিয়েশন রাখে, কিন্তু আলাদা রেটিং মডেলগুলো একটি একক review মডেলে মার্জ করা হয়েছে।

reviewable_type এবং reviewable_id এখন আলাদা রেটিং মডেলগুলোর একই ভূমিকা পালন করে প্রতিনিধিত্ব করে যে রিভিউটি কোন মডেলের সাথে অ্যাসোসিয়েটেড।

reviewable_type কলামটি মডেল ক্লাসের নাম সংরক্ষণ করে (user, instrument_post, বা comment), এবং reviewable_id সেই মডেলের সংশ্লিষ্ট ID সংরক্ষণ করে।

আমরা এখন এই দুটি কলাম ব্যবহার করতে পারি রেটিং ইন্টিজারকে একটি নির্দিষ্ট user, post, বা comment-এর সাথে Active Record কোয়েরি এবং/অথবা কন্ডিশনাল স্টেটমেন্টের মাধ্যমে লিংক করার জন্য। ফরেন কি user_id রিভিউ মডেলে থাকে, কারণ এটি আমাদের ট্র্যাক করতে দেয় কোন ইউজার রিভিউ দিয়েছে।

এখন, আমাদের পলিমরফিক মডেলে '-able' টার্ম অদ্ভুত লাগতে পারে, কিন্তু এর উদ্দেশ্য শীঘ্রই স্পষ্ট হবে যখন আমরা কিছু রেইলস ম্যাজিক করব।

রিভিউ মডেলটিকে পলিমরফিক মনে করা হয় কারণ আমাদের একটি মডেল বা অবজেক্ট আছে যা একাধিক রূপে রিপ্রেজেন্ট করতে পারে এবং নিতে পারে: user, comment, এবং instrument post রিভিউ।

রুবি অন রেইলসে পলিমরফিজম ইমপ্লিমেন্টেশন

রেইলস অ্যাপ্লিকেশনে পলিমরফিজম ইমপ্লিমেন্ট করার সময়! যদি আমরা যেন আমরা ইতিমধ্যে আমাদের user, instrument_post, এবং comment মডেল তৈরি করে ফেলেছি, তবে আমরা আমাদের পলিমরফিক মডেল: reviews নিয়ে কাজ শুরু করতে পারি।

প্রথমে, টার্মিনাল থেকে একটি টেবিল তৈরি করুন এবং মডেল জেনারেট করুন, নিচের মত:


এটি মাইগ্রেশন ফাইল তৈরি করে:


schema.rb ফাইল মাইগ্রেশন রান হলে আপডেট হয়। পলিমরফিক অপশন reviewable কলামকে reviewable_type এবং reviewable_id কলামে রূপান্তরিত করে:



ইনস্টল করার সময় আমরা '-able' টার্মের কথা বলেছিলাম? এটি রেইলসের একটি নামকরণ কনভেনশন আমাদের পলিমরফিক অ্যাসোসিয়েশন ডিজাইনেট করার জন্য, যা আমাদের দেয় ক্ষমতা একটি user, instrument post, এবং comment কে 'reviewable' 만드는।

এই রেইলস ম্যাজিক কাজ করার জন্য, আমাদের নিশ্চিত করতে হবে যে আমাদের অন্যান্য মডেলগুলো সঠিকভাবে আমাদের পলিমরফিক মডেলের সাথে অ্যাসোসিয়েটেড।




user, instrument_post, এবং comment মডেলগুলো এখন রিভিউ করা যাবে এবং রেটিং দেওয়া যাবে।

যদি আমাদের ইতিমধ্যে কমপক্ষে দুজন ইউজার, একটি কমেন্ট, এবং একটি ইনস্ট্রুমেন্ট পোস্ট থাকে, তবে আমরা Active Record কোয়েরি ব্যবহার করে বিভিন্ন উপায়ে রিভিউ তৈরি এবং অ্যাক্সেস করতে পারি, নিচের মত:





reviews মডেলের সাথে ইন্টারঅ্যাক্ট করার আরও অনেক উপায় আছে, আপনার কী ডেটা রেন্ডার করতে চান তার উপর নির্ভর করে। প্যারেন্ট মডেলগুলো কীভাবে একটি রিভিউ তৈরি করতে পারে সেটি শেয়ার করা গুরুত্বপূর্ণ। যতক্ষণ না রিভিউ একটি ইউজার এবং একটি reviewable মডেলের সাথে অ্যাসোসিয়েটেড, Active Record স্বয়ংক্রিয়ভাবে reviewable_id এবং reviewable_type কে অ্যাসোসিয়েটেড মডেলের সাথে লিংক করে দেবে।

আমাদের রেইলস উদাহরণগুলিতে পলিমরফিজম ছাড়া, অনেক বেশি টেবিল, অপ্রয়োজনীয় ডুপ্লিকেট কলাম, belongs_to, এবং has_many অ্যাসোসিয়েশনগুলো আমাদের মডেলে থাকত। পলিমরফিজম টেবিল জয়েন করার প্রয়োজন কমিয়ে দিয়েছে, সহজ এবং দ্রুত Active Record কোয়েরি এবং অ্যাসোসিয়েশন অনুমতি দিয়েছে।

সমাপন: ক্লিন এবং লজিক্যাল রুবি কোডের জন্য পলিমরফিজম ব্যবহার করুন

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

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

পলিমরফিজম আপনাকে ক্লিন এবং লজিক্যাল কোড লিখতে সাহায্য করতে পারে। আমার লক্ষ্য হল আপনাকে এই অপরিহার্য OOP কনসেপ্টটি আপনার টুলবেল্টে যোগ করতে সাহায্য করা আপনার বর্তমান, ভবিষ্যৎ, এবং হয়তো অতীত অ্যাপ্লিকেশনগুলোর জন্য।

খুশি কোডিং!

P.S. আপনি যদি রুবি ম্যাজিক পোস্টগুলো প্রেস থেকে বের होतेই পড়তে চান, আমাদের রুবি ম্যাজিক নিউজলেটার সাবস্ক্রাইব করুন এবং একক পোস্টও মিস করবেন না!


  1. বিগ ওমেগা (Ω) এবং বিগ থেটা (θ) নোটেশন

  2. জাভাস্ক্রিপ্ট Promises - অ্যাসিঙ্ক্রোনাস অপারেশন

  3. HTML DOM Style borderRightColor প্রপার্টি

  4. HTML DOM Style isolation প্রপার্টি