কোন শ্রেণীর তার সাবক্লাস সম্পর্কে জানতে হবে?


24

কোন শ্রেণীর তার সাবক্লাস সম্পর্কে জানতে হবে? একটি শ্রেণীর উদাহরণস্বরূপ প্রদত্ত সাবক্লাসের জন্য নির্দিষ্ট কিছু করা উচিত?

আমার প্রবৃত্তিগুলি আমাকে বলে যে এটি একটি খারাপ নকশা, এটি কোনও ধরণের বিরোধী-প্যাটার্নের মতো বলে মনে হচ্ছে।


6
সাধারণত না, তবে বিশেষ ক্ষেত্রে এটি কার্যকর।
কোডসইনচাউস

এটা তোলে হয় "Liskov উপকল্পন নীতি" বা কখনও কখনও LSP এ এটি সম্পর্কে পড়ুন: বিরোধী প্যাটার্ন, একটি সুপরিচিত এক নামক en.wikipedia.org/wiki/Liskov_substitution_principle
জিমি Hoffa

5
@ জিমিহোফা - "লিসকভ সাবস্টিটিউশন নীতি" কোনও বিরোধী-প্যাটার্নের নাম নয়। একটি অ্যান্টি-প্যাটার্নটি এলএসপিকে লঙ্ঘন করতে পারে, তবে এটি এখানেও সত্য হবে তা এখনও নিশ্চিত নয়। এটি সম্ভব যে কোনও ধরণের এটি সাব টাইপগুলি জানলেও, উপ-প্রকারগুলি এখনও পিতামাতার পক্ষে বৈপরীত্য এবং স্ববিরোধের সাথে প্রতিস্থাপিত হতে পারে।
ম্যাথু ফ্লিন

4
@ ম্যাথেজফ্লিন সম্ভবত আমি এলএসপিকে কিছুটা আলগাভাবে ব্যবহার করছি তবে আমার সংজ্ঞায় এ বিষয়টি সত্য নয় যে তারা সকলেই এলএসপির সাথে সম্মতিযুক্ত প্রত্যেকের প্রয়োজনীয়তা পূরণ করে, এটি তাদের প্রয়োজনীয়তা যে কেবল তাদের সাথেই একমত হয় না কেবল আপনি অন্য একটি সাবক্লাস প্রয়োগ করতে পারেন যা এলএসপি লঙ্ঘন করে না। শ্রেণিবদ্ধতা যদি স্ব-সচেতন হয় তবে একটি বাহ্যিক বাস্তবায়ন বেস ক্লাসটি পরিবর্তন না করেই সম্ভবত এলএসপির সাথে সাক্ষাত করতে পারে না। সম্ভবত এটি কঠোরভাবে এলএসপি নয় তবে এটি শক্তিশালী। এবং হ্যাঁ আমার বলা উচিত ছিল যে এলএসপি লঙ্ঘনটি প্যাটার্নবিরোধী
জিমি হোফা

2
কয়েকবার আমি এর মুখোমুখি হয়েছি, আমি সেই জ্ঞানটিকে এমন একটি পদ্ধতিতে রিফ্যাক্ট করেছিলাম যা একটি সাবক্লাসে ওভাররাইড করা যেতে পারে (হয় এটি বিমূর্ত বা খাঁটি ভার্চুয়াল তৈরির দ্বারা বাধ্য করা হয়েছে, বা একটি বুদ্ধিমান ডিফল্ট বাস্তবায়ন যা ওভাররাইড করা যেতে পারে) সরবরাহ করে।

উত্তর:


32

ক্লাসগুলির ধারণার দ্বারা বোঝানো উত্তরটি হ'ল "না"।

হয় আপনি যে কোনও পদক্ষেপ, ডেটা বা সম্পর্ক পরিচালনা করছেন তা হ'ল সমস্ত সাবক্লাসের অংশ - তবে এটি প্রকৃত প্রকারটি পরীক্ষা না করেই সুপারক্লাসে পরিচালনা করা উচিত। বা এটি কেবলমাত্র কিছু সাবক্লাসে প্রযোজ্য - তারপরে সঠিক কাজটি করার জন্য আপনাকে রান-টাইম ধরণের চেক করতে হবে, যখনই অন্য কেউ উত্তরাধিকার সূত্রে আসে তখনই সুপারক্লাসটি পরিবর্তন করতে হবে (অথবা এটি নিঃশব্দে ভুল কাজটি করতে পারে), উদ্ভূত শ্রেণীর পরিবর্তনগুলি অপরিবর্তিত সুপারক্লাস, ইত্যাদি ভাঙতে পারে etc.

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


4
এই নিয়মের একটি ব্যতিক্রম: ক্লাসের ডকুমেন্টেশনের স্থানীয় সাবক্লাসগুলি তার নিজস্ব লাইব্রেরিতে তালিকাভুক্ত করা উচিত।
কিভেলি

3
@ কিভেলি ... যতক্ষণ না ডকুমেন্টেশন আপ টু ডেট থাকে।
mouviciel

14
যে কোনও ব্যবহারযোগ্য ডকুমেন্টেশন সরঞ্জামটি উত্তরাধিকারী গাছগুলি আঁকতে সক্ষম হওয়া উচিত ...
জোহান্নস

13
আমি এটি ব্যতিক্রম বলে মনে করি না। ক্লাস এখনও কিছু জানে না। ডকুমেন্টেশন জানে।
হনজা ব্র্যাবেক

4
@ কিভেলি উহ আমি সম্পূর্ণরূপে একমত নই
জিমি হোফা

16

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

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

স্কালায়, এটি বদ্ধ বীজগণিত ডেটা ধরণের মডেল করতে ব্যবহৃত হয়, সুতরাং প্রথাগত হাস্কেল Listপ্রকার:

data List a = Nil | Cons a (List a)

স্কালায় এভাবে মডেল করা যায়:

sealed trait List[+A]

case object Nil extends List[Nothing]

final case class Cons[+A] extends List[A]

আর তুমি যে নিশ্চিত করতে পারে না শুধুমাত্র ঐ দুই উপ-"ক্লাস" বিদ্যমান কারণ Listহয় sealedএবং এইভাবে ফাইলের বর্ধিত বাহিরে হতে পারে না, Consহয় finalএবং এইভাবে সব সময়ে বাড়ানো যাবে না এবং Nilএকটি হয় objectযা যাহাই হউক না কেন বাড়ানো যাবে না।

তবে এটি একটি নির্দিষ্ট ব্যবহারের কেস (উত্তরাধিকারের মাধ্যমে বীজগণিত ডেটা ধরণের মডেলিং) এবং এমনকি এই ক্ষেত্রে, সুপারক্লাসটি আসলে তার সাবক্লাসগুলি সম্পর্কে জানে না। এই ধরণের ব্যবহারকারীর পক্ষে এটি আরও গ্যারান্টিযুক্ত Listযে তিনি যদি কেসকে বৈষম্যমূলক আচরণ করেন Nilএবং তার পিছনে পিছনে অন্যCons কোনও বিকল্প থাকবে না ।


বহু ভাষায় যা কাজ করে তা abstract internalসদস্যের কিছু রূপ যুক্ত করে ।
কোডসইনচাউস

4

সহজ উত্তরটি হ'ল না No.

এটি কোড ভঙ্গুর করে তোলে এবং অবজেক্ট অরিয়েন্টেড প্রোগ্রামিংয়ের দুটি মূল নীতিকে ভায়োলেট করে।

  • লিসকভ সাবস্টিটিউশন নীতি
  • বন্ধ নীতি খুলুন

1

হ্যা মাঝেমাঝে. উদাহরণস্বরূপ, যখন সীমিত সংখ্যক সাবক্লাস উপস্থিত থাকে। একজন পরিদর্শক প্যাটার্ন এই পদ্ধতির উপযোগিতা একজন চিত্রণ।

উদাহরণ: কিছু ভাল-সংজ্ঞায়িত ব্যাকরণের একটি বিমূর্ত সিনট্যাক্স ট্রি (এএসটি) নোডগুলি Nodeসমস্ত নোডের প্রকারগুলি পরিচালনা করতে দর্শনার্থী প্যাটার্ন প্রয়োগ করে একক শ্রেণীর কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে ।


9
না, না এবং না। এটি দরকারী নয় এবং কখনও ভাল সমাধান নয়।
সুলতান

@ সুলতান আমি ক্লাসরুমের বাইরে এএসটিসের সাথে কাজ করেছি এবং আমি বিশ্বাস করি যে লোরাস এই প্রশ্নটি সত্যই বুঝতে পারে না। ভিজিটর কোনও এএসটিতে নোডের ধরণের নয়, এটি একটি পৃথক অবজেক্ট। এটি ব্যাকরণ বস্তু সম্পর্কে জানতে এবং জানতে হবে। তবে একটি উচ্চ স্তরের এএসটি নোডের উচিত নয়।

1
শব্দ "জানে" শব্দটি আমাকে বিভ্রান্ত করে। বেস Nodeক্লাসে অবশ্যই এর সাবক্লাসের কোনও সরাসরি উল্লেখ নেই। তবে এতে প্যারামিটার acceptসহ একটি পদ্ধতি রয়েছে Visitor। এবং প্রতিটি সাবক্লাস প্রতি Visitorএকটি visitপদ্ধতি রয়েছে । সুতরাং, Nodeএর সাবক্লাসের সরাসরি কোনও রেফারেন্স না থাকলেও Visitorইন্টারফেসের মাধ্যমে পরোক্ষভাবে তাদের সম্পর্কে এটি "জানে" । তারা সকলেই এর মাধ্যমে একত্রে মিলিত হয়েছিল।
লরুস

1
@ সুলতান কখনও বলবেন না। যখন সুপারপ্লাস বংশধরদের সম্পর্কে জানে তখন অপশন প্রকারটি মামলার একটি বৈধ উদাহরণ। তবে জর্জি বলেছিল এটি সিল হিসাবে চিহ্নিত করা হবে।
পাভেল ভোরোনিন

তারপরে সম্মত হচ্ছেন: একজন দর্শনার্থী এটি কী দেখছেন তা জানতে হবে।

1

আমি যদি ফার্মের জন্য কোনও উপাদান লিখি এবং পরে, আমি চলে যাওয়ার পরে, কেউ নিজের উদ্দেশ্যে এটি বাড়িয়ে দেয় তবে আমাকে সে সম্পর্কে অবহিত করা উচিত?

না!

ক্লাস সঙ্গে একই। আপনার প্রবৃত্তি বিশ্বাস।


কাজের নিরাপত্তা???
ষাট ফুটেরসুডে

আপনার ষাট ফুট উঁচু তাই আমি আপনার সাথে তর্ক করব না :-) তবে আমি আশা করি আমার চলে যাওয়ার পরে আর একটি কাজ পাওয়ার পরে আমার অর্থটি ছিল।
ড্যানিয়েল হোলিনরাকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.