উত্তরাধিকার ভুল হয়ে গেছে


12

আমার কিছু কোড রয়েছে যেখানে উত্তম উত্তরাধিকারের মডেলটি উতরাইয় গিয়েছে এবং কেন এবং কীভাবে এটি ঠিক করতে হয় তা বোঝার চেষ্টা করছি। মূলত, কল্পনা করুন আপনার সাথে একটি চিড়িয়াখানার শ্রেণিবিন্যাস রয়েছে:

class Animal  
class Parrot : Animal 
class Elephant : Animal 
class Cow : Animal

প্রভৃতি

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

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

ধন্যবাদ!


@ জেমস: তারপরে আপনাকে হাত দিয়ে পার্সার লিখতে হবে। : এস
মাত্তেও ইটালিয়া

5
স্পষ্টতই এটি হাস্যকর-গ্রাহক-প্রয়োজনের একটি ঘটনা। আফ্রিকার কোনও বাইসন নেই। আপনি অবজেক্ট মডেলগুলি ডিজাইন করতে পারবেন না যার বাস্তবতার সাথে কোনও সংযোগ নেই। যদি না বাস্তবতা ডলার পূর্ণ হাতে তৈরি হয়। যা সমস্যার সমাধান করে।
হ্যানস প্যাস্যান্ট

1
সব বাইসন খাই? [আমি এটি আগে পোস্ট করেছি তবে এটি কোনও কারণে মুছে ফেলা হয়েছিল, সম্ভবতঃ হাস্যাহীন জ্যাকাসেসগুলি দ্বারা।]
জেমস ম্যাকনেলিস

কেজবিল্ডারের কি নিজস্ব ক্লাস দরকার? যদি কোনও ডিফল্ট মেককেজ পদ্ধতি থাকে তবে যা প্রতিটি পৃথক শ্রেণীর দ্বারা ওভাররাইড করা যায়।
কাজ

1
আপনি যদি কল-কলটারকে কলকারীদের একটি অপূর্ণতা হিসাবে উল্লেখ করেন তবে কলররা যত তাড়াতাড়ি isAfricanBizon () ব্যবহার শুরু করেন তারা অন্যথায় যদি স্বয়ংক্রিয়ভাবে কোডটি বিশৃঙ্খলা করে। সুতরাং এটি হয় যদি হয়-তবে-অন্যথায় হ'ল isAfricanBizon () এর সাথে বা যদি-তবে-ডায়নামিক ক্যাস্টের সাথে অন্য কোলাহল।
davidk01

উত্তর:


13

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


1
-1: কেবল কি করতে হবে তা বলে না। ওপি ইতিমধ্যে জানে যে এটি একটি খারাপ ধারণা, সুতরাং প্রশ্ন।
স্টিভেন ইভার্স

12

isAfricanBizon () জেনেরিক নয়। মনে করুন আপনি একটি হাইপোপটেমাস দিয়ে আপনার পশু খামার প্রসারিত করেন যা খুব শক্তিশালী তবে ইস্রাফিজানবিজন () থেকে সঠিক প্রভাব ফেলতে সত্য ফিরে আসা কেবল নির্বোধ হবে।

আপনি সর্বদা ইন্টারফেসে এমন পদ্ধতি যুক্ত করতে চান যা নির্দিষ্ট প্রশ্নের উত্তর দেয়, এক্ষেত্রে এটি শক্তির মতো কিছু হবে ()


+1: এই নির্দিষ্ট ব্যবহার-কেসটি সামঞ্জস্য করার জন্য অন্য প্রত্যেকে ক্লাসের ধারণাগত মডেলটি (যা কেবলমাত্র বিভিন্ন ধরণের প্রাণীর বৈশিষ্ট্যগুলিকে সজ্জিত করে) ভঙ্গ করছে বলে মনে হচ্ছে। একটি strengthপদ্ধতির দ্বারা অনুসন্ধান করা যেতে পারে material.canHold(animal), এর চেয়ে বিভিন্ন ধরণের উপাদানকে সমর্থন করার একটি পরিষ্কার উপায় ConcreteWall
এইডান জুলি

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

3

আমি মনে করি আপনার সমস্যাটি হ'ল: আপনার কাছে লাইব্রেরির বিভিন্ন ক্লায়েন্ট রয়েছে যা কেবল শ্রেণিবদ্ধের একটি সাবসেটে আগ্রহী তবে সেগুলি বেস ক্লাসের একটি পয়েন্টার / রেফারেন্স পাশ করেছে। এটি আসলে ডাইনামিক_কাস্ট <> সমস্যাটি সমাধান করার আছে।

ডায়ামিক_কাস্ট <> এর ব্যবহার কমানোর জন্য এটি ক্লায়েন্টদের ডিজাইনের বিষয়; বস্তুর বিশেষ চিকিত্সার প্রয়োজন আছে কিনা তা নির্ধারণ করার জন্য তাদের এটি ব্যবহার করা উচিত এবং যদি তা ডাউন-কাস্টেড রেফারেন্সে সমস্ত ক্রিয়াকলাপ করে।

আপনার যদি "মিক্স-ইন" টাইপের সংগ্রহের কার্যকারিতা রয়েছে যা বেশ কয়েকটি পৃথক সাব-হায়ারার্কিতে প্রয়োগ করা হয়, আপনি জাভা এবং সি # এর ইন্টারফেস প্যাটার্নটি ব্যবহার করতে পারেন; একটি ভার্চুয়াল বেস ক্লাস যা একটি খাঁটি-ভার্চুয়াল শ্রেণি রয়েছে এবং ডায়ামিক_কাস্ট <> ব্যবহার করুন কোনও উদাহরণ এটির জন্য বাস্তবায়ন সরবরাহ করে কিনা তা নির্ধারণ করতে।


1

একটা জিনিষ আপনি কি করতে পারেন মত ধরনের স্পষ্ট পরীক্ষণ প্রতিস্থাপন হয় isAfricanBison()বৈশিষ্ট্য আপনি আসলে এ, অর্থাত আগ্রহী হন পরীক্ষা দিয়ে isTooStrong()


1
#TooStrong () কিসের জন্য? আপনি প্রাণী শ্রেণিতে খাঁচা নির্দিষ্ট কোড যুক্ত করছেন।
স্টিভেন এভার্স

1

প্রাণীদের কংক্রিটের দেয়াল সম্পর্কে যত্ন নেওয়া উচিত নয়। সম্ভবত আপনি এটিকে সাধারণ মান সহ প্রকাশ করতে পারেন।

class Animal {
public:
  virtual ~Animal() {}
  virtual size_t height() const = 0;
  virtual size_t weight() const = 0;
  virtual bool isStrong() const = 0;
};

Cage *CreateCageFromSQL(Animal &a);
Cage *CreateCageFromOrangePeelsAndSticks(Animal &a);

আমি সন্দেহ করি যে এটি কার্যকর নয়। খেলনা উদাহরণগুলির সাথে যদিও এটি সমস্যা।

আমি প্রয়োজনের কনক্রিটওয়ালস () বা কোনও হারে গতিশীল পয়েন্টার কাস্টের রেখাগুলি এবং লাইন দেখতে চাই না।

এটি সাধারণত একটি সস্তা সমাধান। এটি বজায় রাখা এবং ধারণা করা সহজ। এবং সত্যই, সমস্যাটি বলে যে এটি যাইহোক প্রাণীর টাইপের সাথে আবদ্ধ।

class Animal {
public:
  virtual ~Animal() {}
  virtual CageBuilder *getCageBuilder() = 0;
};

এটি আপনাকে ভাগ করা কোড ব্যবহার করা থেকে বিরত রাখে না, কেবলমাত্র প্রাণীকে কিছুটা দূষিত করে।

তবে খাঁচাটি কীভাবে তৈরি করা হয় তা অন্য কোনও সিস্টেমের নীতি হতে পারে এবং আপনার প্রতি প্রাণী প্রতি একাধিক ধরণের খাঁচা নির্মাতা থাকতে পারে। অনেকগুলি অদ্ভুত এবং সংশ্লেষিত সমন্বয় আপনি সামনে আসতে পারেন।

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

ডাবল ডিসপ্যাচ হ'ল আরেকটি বিকল্প, যদিও আমি সর্বদা এতে ঝাঁপিয়ে পড়ার জন্য চুপ করে থাকি।

এর বাইরে সমস্যাটি অনুমান করা শক্ত।


0

আচ্ছা অবশ্যই সমস্ত প্রাণীর অন্তর্নিহিত সম্পত্তি রয়েছে attemptEscape()। যদিও কিছু পদ্ধতিতে falseসমস্ত পরিস্থিতিতে ফলাফল তৈরি হতে পারে অন্যদের মধ্যে যেমন তাদের অন্যান্য স্বতন্ত্র বৈশিষ্ট্য যেমন sizeএবং এর তাত্পর্যপূর্ণ ভিত্তিতে একটি সুযোগ থাকতে পারে weight। তবে অবশ্যই কোনও সময়ে attemptEscape()তুচ্ছ হয়ে উঠবে কারণ এটি অবশ্যই ফিরে আসবে true

আমি ভীত আমি আপনার প্রশ্নটি পুরোপুরি বুঝতে পারি না যদিও ... সমস্ত প্রাণীর সাথে সম্পর্কিত ক্রিয়া এবং বৈশিষ্ট্য রয়েছে। প্রাণীর সাথে নির্দিষ্ট ব্যক্তিদের যেখানে এটি মানানসই সেখানে প্রবর্তন করা উচিত। বাইসনের সাথে সরাসরি তোতার সাথে সম্পর্ক স্থাপনের চেষ্টা করা ভাল অনুমানের সেটআপ না এবং যথাযথ নকশার ক্ষেত্রে সত্যই সমস্যা হওয়া উচিত নয়।


-1

অন্য বিকল্পটি হ'ল একটি কারখানা ব্যবহার করা যা প্রতিটি প্রাণীর জন্য খাঁচা তৈরি করে। আমি মনে করি এটির ক্ষেত্রে আরও ভাল হতে পারে যদি তাদের প্রত্যেকের জন্য পরিস্থিতি খুব আলাদা হয়। তবে এটি যদি কেবলমাত্র একটি শর্ত থাকে তবে উপরের উল্লিখিত RequiresConcreteWall()পদ্ধতিটি এটি করবে।


-1

কীভাবে সুপারিশকেজটাইপ () এর প্রয়োজন হয় কনক্রিটওয়াল () এর বিরোধিতা হিসাবে


-2

কেন এমন কিছু করবেন না

class Animals { /***/ } class HeavyAnimals{} : Animals //The basic class for animals like the African Bison

হেভিআনিমালস শ্রেণীর সাহায্যে আপনি হেভিআনিমালস ক্লাসটি বাড়িয়ে আফ্রিকান বাইসন শ্রেণি তৈরি করতে পারেন।

সুতরাং এখন আপনি প্যারেন্ট ক্লাস (প্রাণী) যা হেভিআনিমাল ক্লাসের মতো অন্যান্য বেস ক্লাস তৈরি করতে ব্যবহার করতে পারবেন তা আফ্রিকান বাইসন ক্লাস এবং অন্যান্য ভারী প্রাণীর তৈরিতে ব্যবহার করা যেতে পারে। সুতরাং আফ্রিকান বাইসনের সাহায্যে আপনার কাছে এখন অ্যানিম্যাল ক্লাসের পদ্ধতি এবং সম্পত্তি (এটি সমস্ত প্রাণীর জন্য বেস) এবং ভারী অ্যানিমালস শ্রেণিতে অ্যাক্সেস রয়েছে (এটি ভারী প্রাণীর ভিত্তি)


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