কম্পিউটার

রুবি উত্তরাধিকার ব্যাখ্যা করা হয়েছে – আজ ওওপি শিখুন!

ক্লাস ইনহেরিটেন্স হল একটি মৌলিক OOP (অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং) বৈশিষ্ট্য যা আপনাকে যেকোন ক্লাসের আরও নির্দিষ্ট এবং বিশেষায়িত সংস্করণ তৈরি করতে সাহায্য করে।

এখানে একটি উদাহরণ আছে :

খাদ্য -> ফল -> কমলা

এই শ্রেণীর মধ্যে একটি সম্পর্ক আছে!

আমরা বলতে পারি যে একটি কমলা একটি ফল, তবে ফলগুলিও খাদ্য।

অভিভাবক শ্রেণী (একে সুপার ক্লাসও বলা হয় অথবা বেস ক্লাস ) সর্বদা সাবক্লাসের চেয়ে বেশি সাধারণ।

Fruit (আরো জেনেরিক) হল Orange এর মূল শ্রেণী (আরো নির্দিষ্ট)।

রুবিতে এটি এইরকম দেখায়৷ :

<প্রি>ক্লাস ফুডএন্ডক্লাস ফ্রুট <ফুডএন্ডক্লাস কমলা <ফ্রুটেন্ড

উত্তরাধিকার এর একটি প্রভাব রুবিতে Food-এ সংজ্ঞায়িত প্রতিটি পদ্ধতি এবং প্রতিটি ধ্রুবক Fruit-এ পাওয়া যাবে , এবং এছাড়াও Orange-এ .

পদ্ধতিগুলি বেস ক্লাস থেকে নিচে পাস করা হয়, কিন্তু অন্যভাবে নয়।

উত্তরাধিকারের উদ্দেশ্য কী?

আপনি ভাবতে পারেন যে একটি অবজেক্ট হায়ারার্কি তৈরি করা আপনার কোডের জন্য একধরনের "ভালো বোধ" সংস্থা প্রদান করে, তবে এটিতে আরও অনেক কিছু রয়েছে৷

উত্তরাধিকার একটি অভিভাবক শ্রেণীর একটি ভিন্ন সংস্করণ তৈরি করতে ব্যবহৃত হয় যা একটি নির্দিষ্ট উদ্দেশ্যে উপযুক্ত। হতে পারে এটির কিছু অতিরিক্ত বৈশিষ্ট্য বা পদ্ধতির প্রয়োজন যা অভিভাবক শ্রেণীতে বোঝা যায় না।

এখানে একটি উদাহরণ আছে :

সব ফলের একটি রং, একটি ওজন এবং একটি নাম আছে।

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

স্পেশালাইজেশন বলতে আমি এটাই বুঝি।

আরেকটি উদাহরণ :

আপনার একটি ক্লাস আছে যেটি একটি ডাটাবেসে লেখে, কিন্তু আপনি ক্লাসের অন্য সংস্করণ চান (সম্ভবত ডিবাগিংয়ের উদ্দেশ্যে) যা সমস্ত ডাটাবেস ক্রিয়াকলাপ লগ করে৷

এই ক্ষেত্রে, আপনি ডেকোরেটর প্যাটার্ন চান।

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

আসল পরিবর্তন না করেই!

রিয়েল ওয়ার্ল্ডে উত্তরাধিকার

ঠিক আছে।

আমরা উত্তরাধিকার সম্পর্কে শিখেছি, কিন্তু আপনি কি জানেন যে আপনি এটি প্রতিদিন একজন রুবি বিকাশকারী হিসাবে ব্যবহার করছেন?

রুবি নিজেই উত্তরাধিকার ব্যবহার করে পদ্ধতি সক্রিয় করতে যেমন:

  • puts
  • class
  • super

এর কারণ হল সমস্ত রুবি বস্তু Object থেকে উত্তরাধিকার সূত্রে প্রাপ্ত ডিফল্টভাবে ক্লাস।

তাই যদি আপনি এরকম একটি ক্লাস তৈরি করেন :

ক্লাস অ্যাপলেন্ড

এর মূল শ্রেণী হল Object :

Apple.superclass# অবজেক্ট

সেজন্য আপনি উপরে উল্লিখিত পদ্ধতিগুলি ব্যবহার করতে পারবেন।

উদাহরণস্বরূপ, যখন আপনি puts কল করেন রুবি আপনার ক্লাসে এই পদ্ধতিটি খুঁজছে।

তারপর :

  • এটি প্যারেন্ট ক্লাসের একটিতে পদ্ধতির সন্ধান করে
  • না পাওয়া গেলে, এটি আবার বস্তু থেকে শুরু হয় এবং এটি method_missing খোঁজার চেষ্টা করবে
  • না পাওয়া গেলে, এটি একটি NoMethodError উত্থাপন করবে , অথবা NameError যদি পদ্ধতিটি একটি স্পষ্ট বস্তু ছাড়া কল করা হয় (a.size বনাম size , যেখানে a স্পষ্ট বস্তু)

আপনি রেলে উত্তরাধিকারের আরও উদাহরণ পেতে পারেন।

এখানেই :

ক্লাস অ্যাপ্লিকেশন কন্ট্রোলার  

নিয়ন্ত্রক :

<প্রি>ক্লাস সেশন কন্ট্রোলার <অ্যাপ্লিকেশন কন্ট্রোলারেন্ড

মডেল :

শ্রেণীর মন্তব্য  

উত্তরাধিকার রুবিতে সর্বত্র রয়েছে, কিন্তু কখনও কখনও এটি সঠিক সমাধান নয়৷

কম্পোজিশন:উত্তরাধিকারের একটি বিকল্প

উত্তরাধিকারের কিছু সীমাবদ্ধতা আছে।

উদাহরণস্বরূপ :

আপনি যন্ত্রাংশ থেকে একটি কম্পিউটার তৈরি করতে চান৷

আমরা বলি যে কম্পিউটারের যন্ত্রাংশ আছে, কিন্তু স্বতন্ত্র অংশগুলি নিজেরাই কম্পিউটার নয়।

আপনি যদি তাদের আলাদা করেন তবে তারা তাদের কাজ করতে পারবে না।

আমাদের অন্য কিছু দরকার...

আমাদের রচনা দরকার!

কম্পোজিশন ক্লাস তৈরি করে যেখানে বিভিন্ন অংশ একত্রিত হয়ে একটি ফাংশন সম্পাদন করে।

ঠিক একটা কম্পিউটারের মত।

এখানে কম্পোজিশন ইন অ্যাকশনের একটি উদাহরণ :

ক্লাস কম্পিউটার ডিফ ইনিশিয়ালাইজ (মেমরি, ডিস্ক, সিপিইউ) @মেমরি =মেমরি @ডিস্ক =ডিস্ক @cpu =cpu শেষ হয়

কম্পিউটারকে কাজ করার জন্য প্রয়োজনীয় যন্ত্রাংশ দেওয়া হয়।

এটি রচনা।

লিসকভ প্রতিস্থাপন নীতি

উত্তরাধিকার শক্তিশালী হয় যখন সঠিক পরিস্থিতিতে ব্যবহার করা হয়।

কিন্তু সমস্ত সরঞ্জামের মত এটি অপব্যবহার করা যেতে পারে!

প্রকৃতপক্ষে, মূল ডিজাইন প্যাটার্নস বই থেকে একটি জনপ্রিয় উদ্ধৃতি রয়েছে যা এভাবে যায়:

"উত্তরাধিকারের চেয়ে রচনাকে অগ্রাধিকার দিন।"
ডিজাইন প্যাটার্নস:পুনঃব্যবহারযোগ্য অবজেক্ট-ওরিয়েন্টেড সফটওয়্যারের উপাদান

আপনি উত্তরাধিকার সঠিকভাবে ব্যবহার করছেন তা নিশ্চিত করতে আপনি একটি নীতি অনুসরণ করতে পারেন, L SOLID থেকে।

এটি "লিসকভ সাবস্টিটিউশন প্রিন্সিপল" এর জন্য দাঁড়িয়েছে।

এটি বলে যে আপনার সাবক্লাসগুলি অবশ্যই আপনার বেস ক্লাসের জায়গায় ব্যবহার করতে সক্ষম হবে।

অন্য কথায় :

যদি আপনি Fruit থেকে উত্তরাধিকারী হন এবং color একটি স্ট্রিং, আপনি color পরিবর্তন করতে চান না একটি সাবক্লাসে একটি প্রতীক ফেরত দিতে।

উদাহরণ :

Fruit ব্যবহারকারী color উপর নির্ভর করে একটি স্ট্রিং ফেরত দিচ্ছে।

ক্লাস ফ্রুট ডিফ রঙ "কমলা" এন্ডএন্ড

এটি LSP ভঙ্গ করে :

শ্রেণীর কমলা <ফলের ডিফ রঙ :কমলা এন্ডএন্ড

আপনি যদি color পরিবর্তন করেন একটি প্রতীক ফেরত দিতে, তাহলে আপনি একটি Fruit প্রতিস্থাপন করতে পারবেন না একটি Orange সহ বস্তু .

কেন?

কারণ যদি আপনি split এর মত একটি পদ্ধতি কল করেন একটি প্রতীকে আপনি একটি ত্রুটি পাবেন৷

এটি এমন একটি পদ্ধতি যা প্রতীকে নেই।

কিন্তু স্ট্রিং করে।

আরেকটি লাল পতাকা হল যখন আপনার সাবক্লাসটি পিতামাতার ক্লাসের সত্যিকারের বিশেষীকরণ নয় এবং আপনি কেবল ইউটিলিটি পদ্ধতিগুলি ভাগ করার জন্য অভিভাবক শ্রেণি ব্যবহার করছেন৷

সারাংশ

আপনি রুবিতে উত্তরাধিকার এবং রচনা সম্পর্কে শিখেছেন!

আপনি উত্তরাধিকার ব্যবহার করতে পারেন৷ একটি অভিভাবক শ্রেণীর একটি বিশেষ সংস্করণ তৈরি করতে, এবং কম্পোজিশন একটি সম্পূর্ণ মধ্যে উপাদান একসঙ্গে করা. LSP অনুসরণ করতে ভুলবেন না নীতি যদি আপনি একটি জগাখিচুড়ি করতে না চান.

এখন আপনি আরও ভাল অবজেক্ট-ওরিয়েন্টেড কোড লিখতে পারেন 🙂

পড়ার জন্য ধন্যবাদ।


  1. রুবিতে কাস্টম ব্যতিক্রম

  2. রুবি বিকাশকারীদের জন্য র্যাক ব্যাখ্যা করা হয়েছে

  3. মৌলিক ওওপি নীতিগুলির সাথে আপনার রুবি কোডকে কীভাবে নাটকীয়ভাবে উন্নত করবেন

  4. রুবিতে ডেকোরেটর ডিজাইন প্যাটার্ন