আমি কেন সি ++ এ একাধিক উত্তরাধিকার এড়ানো উচিত?


167

একাধিক উত্তরাধিকার ব্যবহার করা কি ভাল ধারণা বা এর পরিবর্তে আমি অন্য জিনিসগুলি করতে পারি?

উত্তর:


259

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

সারসংক্ষেপ

  1. উত্তরাধিকারের পরিবর্তে বৈশিষ্ট্যগুলির সংমিশ্রণটি বিবেচনা করুন
  2. ভয়ঙ্কর হীরা থেকে সাবধান থাকুন
  3. বস্তুর পরিবর্তে একাধিক ইন্টারফেসের উত্তরাধিকার বিবেচনা করুন
  4. কখনও কখনও, একাধিক উত্তরাধিকার হ'ল সঠিক জিনিস। যদি এটি হয়, তবে এটি ব্যবহার করুন।
  5. কোড রিভিউগুলিতে আপনার একাধিক-উত্তরাধিকারী আর্কিটেকচার রক্ষার জন্য প্রস্তুত থাকুন

1. সম্ভবত রচনা?

এটি উত্তরাধিকারের জন্য সত্য এবং তাই, এটি একাধিক উত্তরাধিকারের জন্য আরও সত্য।

আপনার অবজেক্টটি কি অন্যের কাছ থেকে উত্তরাধিকারী হওয়া দরকার? ক এর কাজ করার জন্য, বা ক এর কাছ Carথেকে উত্তরাধিকারী হওয়ার দরকার নেই । এ এর একটি এবং চারটি রয়েছে ।EngineWheelCarEngineWheel

আপনি যদি সংস্থার পরিবর্তে এই সমস্যাগুলি সমাধান করতে একাধিক উত্তরাধিকার ব্যবহার করেন তবে আপনি কিছু ভুল করেছেন।

2. ভয়ের ডায়মন্ড

সাধারণত, আপনার একটি বর্গ থাকে A, Bএবং Cউভয়ই উত্তরাধিকার সূত্রে আসে A। এবং (আমাকে জিজ্ঞাসা করবেন কেন) কেউ তারপর সিদ্ধান্ত নেয় যে Dথেকে উভয় উত্তরাধিকারী হবে Bএবং C

আট আট বছরে আমি এই ধরণের সমস্যার মুখোমুখি হয়েছি এবং এটি দেখে মজাদার হয়:

  1. কিভাবে একটি ভুল এটা শুরুতে (উভয় ক্ষেত্রেই, থেকে অনেক Dউভয় থেকে উত্তরাধিকারসূত্রে উচিত হয়নি Bএবং C), কারণ এই খারাপ স্থাপত্য ছিল (আসলে, Cসব সময়ে বিদ্যমান ছিল করা উচিত নয় ...)
  2. রক্ষণাবেক্ষণকারীরা এর জন্য কতটা অর্থ প্রদান Aকরছিলেন , কারণ সি ++ তে পিতামাতা শ্রেণি তার নাতি-নাতনি ক্লাসে দু'বার উপস্থিত ছিল Dএবং সুতরাং, একটি প্যারেন্ট ক্ষেত্র A::fieldআপডেট করার অর্থ হয় এটি দু'বার (মাধ্যমে B::fieldএবং C::field) আপডেট করা , অথবা কিছু কিছু নীরবে ভুল এবং ক্র্যাশ হয়ে যাওয়া, পরে (নতুন পয়েন্টার ইন B::field, এবং মুছুন C::field...)

উত্তরাধিকারের যোগ্যতা অর্জনের জন্য সি ++ তে কীওয়ার্ড ভার্চুয়াল ব্যবহার করে উপরের বর্ণিত ডাবল লেআউটটি এড়ানো যায় যদি এটি আপনি চান না তবে যাইহোক, আমার অভিজ্ঞতায় আপনি সম্ভবত কিছু ভুল করছেন ...

অবজেক্ট হায়ারার্কিতে আপনার স্তরক্রমকে বৃক্ষ হিসাবে রাখার চেষ্টা করা উচিত (কোনও নোডের একটি পিতা বা মাতা থাকে), গ্রাফ হিসাবে নয়।

ডায়মন্ড সম্পর্কে আরও (2017-05-03 সম্পাদনা করুন)

সি ++ এ ডায়মন্ড অফ ড্রেডের আসল সমস্যাটি ( ডিজাইনটি দুর্দান্ত বলে ধরে নিচ্ছেন - আপনার কোডটি পর্যালোচনা করুন! ), আপনার পছন্দ করা দরকার :

  • Aআপনার লেআউটে ক্লাসটির দু'বার অস্তিত্ব থাকা বাঞ্ছনীয় এবং এর অর্থ কী? যদি হ্যাঁ, তবে তা হ'ল দুবারই উত্তরাধিকার সূত্রে পান।
  • যদি এটি কেবল একবারই বিদ্যমান থাকে তবে তা থেকে ভার্চুয়ালভাবে উত্তরাধিকারী হন।

এই পছন্দটি সমস্যার অন্তর্নিহিত, এবং সি ++ এ অন্যান্য ভাষার মতো নয়, আপনি ভাষা পর্যায়ে আপনার নকশাকে জোর করে ছাড়াই এটি করতে পারেন।

তবে সমস্ত শক্তির মতো, সেই শক্তির সাথেই দায়িত্ব আসে: আপনার নকশাটি পর্যালোচনা করুন।

3. ইন্টারফেস

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

সাধারণত, সি এর উত্তরাধিকার সূত্রে আপনি কী বোঝাতে চেয়েছিলেন Aএবং Bতা হ'ল ব্যবহারকারীরা Cএটির মতো ব্যবহার করতে পারেন A, এবং / অথবা যেমন এটি B

সি ++ তে একটি ইন্টারফেস হ'ল একটি বিমূর্ত শ্রেণি যা:

  1. এর সমস্ত পদ্ধতি খাঁটি ভার্চুয়াল হিসাবে ঘোষণা করা হয়েছে (= 0 দ্বারা প্রত্যয়িত) (2017-05-03 সরানো হয়েছে)
  2. কোন সদস্য ভেরিয়েবল

এক বাস্তব বস্তুর শূন্যের একাধিক উত্তরাধিকার, এবং শূন্য বা আরও ইন্টারফেসকে "গন্ধযুক্ত" হিসাবে বিবেচনা করা হয় না (কমপক্ষে, ততটা নয়)।

সি ++ অ্যাবস্ট্রাক্ট ইন্টারফেস সম্পর্কে আরও জানুন (2017-05-03 সম্পাদনা করুন)

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

দ্বিতীয়ত, সি ++ এ, বিমূর্ত ইন্টারফেস থেকে কার্যত উত্তরাধিকারী হওয়া (এমনকি অতিরিক্ত ব্যয় / নির্দেশনা সহ) বোধগম্য হয়। যদি আপনি তা না করেন এবং ইন্টারফেসের উত্তরাধিকারটি আপনার শ্রেণিবিন্যাসে একাধিকবার উপস্থিত হয়, তবে আপনার দ্বিধাহীনতা থাকবে।

তৃতীয়ত, অবজেক্ট ওরিয়েন্টেশন দুর্দান্ত, তবে এটি সি -++ তে একমাত্র সত্য নয় TM সঠিক সরঞ্জামগুলি ব্যবহার করুন এবং সর্বদা মনে রাখবেন সি ++ এ বিভিন্ন ধরণের সমাধান দেওয়ার জন্য আপনার অন্যান্য দৃষ্টান্ত রয়েছে।

৪. আপনার কি একাধিক উত্তরাধিকার দরকার?

কখনও কখনও হ্যাঁ.

সাধারণত, আপনার Cশ্রেণিটি উত্তরাধিকার সূত্রে প্রাপ্ত হয় Aএবং B, এবং Aএবং Bদুটি সম্পর্কিত নয় objects

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

আপনার নিজের ইতিমধ্যে দুটি লাইব্রেরিতে অ্যাক্সেস রয়েছে, প্রত্যেকটির নিজস্ব নিজস্ব স্থানের সাথে (নেমস্পেসগুলি ব্যবহার করার আরেকটি কারণ ... তবে আপনি নামস্থান ব্যবহার করেন, তাই না?), একটি সত্তা geoএবং অন্যটি সত্তাai

তাই আপনি যদি আপনার নিজের আছে own::Nodeউভয় থেকে আহরণ করা ai::Agentএবং geo::Point

এটি সেই মুহুর্তে যখন নিজেকে জিজ্ঞাসা করা উচিত যে পরিবর্তে আপনার রচনাটি ব্যবহার করা উচিত নয়। own::Nodeসত্যিই যদি এ ai::Agentএবং এ দুটোই হয় geo::Pointতবে রচনাটি আর করবে না।

তারপরে আপনার own::Nodeঅন্যান্য এজেন্টদের সাথে 3 ডি স্পেসে অবস্থান অনুসারে যোগাযোগ করার জন্য একাধিক উত্তরাধিকারের প্রয়োজন হবে ।

(আপনি এটি লক্ষ্য করুন ai::Agentএবং geo::Pointসম্পূর্ণরূপে, সম্পূর্ণরূপে সম্পূর্ণরূপে নিরুক্ত

অন্যান্য কেস (2017-05-03 সম্পাদনা করুন)

অন্যান্য মামলা রয়েছে:

কখনও কখনও আপনি রচনা ব্যবহার করতে পারেন, এবং কখনও কখনও এমআই ভাল হয়। কথাটি হ'ল: আপনার একটি পছন্দ আছে। এটি দায়িত্বপূর্ণভাবে করুন (এবং আপনার কোডটি পর্যালোচনা করুন)।

৫. সুতরাং, আমার একাধিক উত্তরাধিকার করা উচিত?

বেশিরভাগ সময় আমার অভিজ্ঞতা, না। এমআই ডান টুল, যদিও তা কাজ বলে মনে হয় কারণ এটি গাদা অলস দ্বারা ব্যবহার করা যেতে পারে পরিণতি (ক উপার্জন মত বুঝতে ছাড়া একসঙ্গে অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে নয় Carউভয় Engineএবং একটি Wheel)।

তবে মাঝে মাঝে হ্যাঁ এবং সেই সময়, এমআই এর চেয়ে ভাল কিছু আর কাজ করবে না।

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


4
আমি যুক্তি দিয়ে বলব যে এটি কখনই প্রয়োজনীয় এবং এত বিরল কার্যকর নয় যে প্রতিনিধিদের চেয়ে বেশি পরিমাণে সঞ্চালন যদি এটির ব্যবহারে ব্যবহৃত প্রোগ্রামারদের বিভ্রান্তির ক্ষতিপূরণ দেয় না, তবে অন্যথায় ভাল সংক্ষিপ্তসার।
বিল কে

2
আমি পয়েন্ট 5 এ যুক্ত করব, যে এমআই ব্যবহার করে এমন কোডটির কারণটির ব্যাখ্যা দেওয়ার ঠিক পাশেই একটি মন্তব্য থাকা উচিত, যাতে আপনাকে কোড পর্যালোচনাতে এটি মৌখিকভাবে ব্যাখ্যা করতে হবে না। এটি না করে যদি কেউ আপনার পর্যালোচক না হয় তারা আপনার কোডটি দেখলে আপনার ভাল বিচার সম্পর্কে প্রশ্ন করতে পারে এবং আপনার পক্ষে এটির পক্ষে কোনও প্রতিরক্ষা দেওয়ার সুযোগ নাও থাকতে পারে।
টিম আবেল

" কারণ আপনি উপরে বর্ণিত ডায়মন্ডের মুখোমুখি হবেন না " "কেন নয়?
কৌতূহলী

1
আমি পর্যবেক্ষক প্যাটার্নের জন্য এমআই ব্যবহার করি।
কলমারিয়াস

13
@ বিল্ক: অবশ্যই এটি প্রয়োজনীয় নয়। আপনার যদি এমআই ছাড়াই টার্নিংয়ের সম্পূর্ণ ভাষা থাকে তবে আপনি এমআই দিয়ে যে কোনও ভাষা করতে পারেন। সুতরাং হ্যাঁ, এটি প্রয়োজনীয় নয়। কখনো। এটি বলেছিল, এটি একটি খুব দরকারী সরঞ্জাম এবং তথাকথিত ড্রেডড ডায়মন্ড হতে পারে ... "ভয়ঙ্কর" শব্দটি কেন আছে তা আমি সত্যিই বুঝতে পারি না। এটি যুক্তিযুক্ত পক্ষে যুক্তিযুক্ত মোটামুটি সহজ এবং সাধারণত কোনও সমস্যা নয়।
থমাস এডিং

145

বাজার্ন স্ট্রস্ট্রপের সাথে একটি সাক্ষাত্কার থেকে :

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


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

24
+1: নিখুঁত উত্তর: আপনি যদি এটি ব্যবহার করতে না চান, তবে এটি ব্যবহার করবেন না।
থমাস এডিং

38

এটি এড়ানোর কোনও কারণ নেই এবং এটি পরিস্থিতিতে এটি খুব কার্যকর হতে পারে। আপনার সম্ভাব্য সমস্যাগুলি সম্পর্কে সচেতন হওয়া দরকার।

সবচেয়ে বড়টি হ'ল মৃত্যুর হীরা:

class GrandParent;
class Parent1 : public GrandParent;
class Parent2 : public GrandParent;
class Child : public Parent1, public Parent2;

আপনার এখন সন্তানের মধ্যে গ্র্যান্ডপ্যারেন্টের দুটি "অনুলিপি" রয়েছে।

সি ++ এ সম্পর্কে চিন্তাভাবনা করেছে এবং সমস্যাগুলি ঘটার জন্য আপনাকে ভার্চুয়াল উত্তরাধিকার করতে দেয়।

class GrandParent;
class Parent1 : public virtual GrandParent;
class Parent2 : public virtual GrandParent;
class Child : public Parent1, public Parent2;

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


21
এবং যদি আপনি উত্তরাধিকার নিষিদ্ধ করেন এবং পরিবর্তে কেবল রচনাটি ব্যবহার করেন তবে আপনার সর্বদা দু'একটি GrandParentথাকে Child। এমআই-এর একটি ভয় রয়েছে, কারণ লোকেরা কেবলমাত্র তারা মনে করে যে তারা ভাষার বিধিগুলি বুঝতে পারে না। তবে যে কেউ এই সাধারণ নিয়মগুলি পেতে পারে না সেও একটি তুচ্ছ প্রোগ্রাম লিখতে পারে না।
কৌতূহলী

1
এটি কঠোর মনে হচ্ছে, চারদিকে সি ++ বিধিগুলি খুব বিস্তৃত। ঠিক আছে, সুতরাং স্বতন্ত্র বিধিগুলি সাধারণ হলেও, তাদের মধ্যে অনেকগুলি রয়েছে যা অন্ততপক্ষে কোনও মানুষের অনুসরণ করার জন্য পুরো বিষয়টিকে সহজ নয়।
জেব্রাফিশ 21

11

ডাব্লু দেখুন: একাধিক উত্তরাধিকার

একাধিক উত্তরাধিকার সমালোচনা পেয়েছে এবং যেমনটি অনেক ভাষায় প্রয়োগ হয় না। সমালোচনার মধ্যে রয়েছে:

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

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

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

আমি কি এই জায়গায় অন্য জিনিস করতে পারি?

হ্যা, তুমি পারো. আমি জিওএফ থেকে চুরি করতে যাচ্ছি ।

  • একটি ইন্টারফেসে প্রোগ্রাম, বাস্তবায়ন নয়
  • উত্তরাধিকারের তুলনায় রচনা পছন্দ করুন

8

সর্বজনীন উত্তরাধিকার একটি আইএস-এ সম্পর্ক, এবং কখনও কখনও শ্রেণি বিভিন্ন ধরণের বিভিন্ন শ্রেণির হয়ে থাকে এবং কখনও কখনও এটি প্রতিফলিত করা গুরুত্বপূর্ণ important

"মিক্সিনস" কখনও কখনও দরকারী। এগুলি সাধারণত ছোট শ্রেণি, সাধারণত কোনও কিছু থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় না, দরকারী কার্যকারিতা সরবরাহ করে।

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

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


6

আপনার একাধিক উত্তরাধিকার "এড়ানো" উচিত নয় তবে 'ডায়মন্ড সমস্যা' ( http://en.wikedia.org/wiki/Diamond_problem ) এর মতো উদ্ভূত সমস্যাগুলি সম্পর্কে আপনার সচেতন হওয়া উচিত এবং আপনাকে প্রদত্ত ক্ষমতার যত্ন সহকারে আচরণ করুন আপনার যেমন সমস্ত ক্ষমতা থাকা উচিত।


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

1
আমি রাজী. এটি "এড়ানো" করবেন না, তবে সমস্যাটি পরিচালনা করার সর্বোত্তম উপায়টি জানেন। সম্ভবত আমি বরং কম্পোজিশনাল বৈশিষ্ট্যগুলি ব্যবহার করব তবে সি ++ এর তেমন কিছু নেই। সম্ভবত আমি বরং 'হ্যান্ডলস' স্বয়ংক্রিয় প্রতিনিধি ব্যবহার করতাম, তবে সি ++ থাকে না। তাই আমি এমআই এর সাধারণ এবং ভোঁতা সরঞ্জামটি বেশ কয়েকটি বিভিন্ন উদ্দেশ্যে সম্ভবত একইসাথে ব্যবহার করি।
জেডিগোগস

3

কিছুটা বিমূর্ত হওয়ার ঝুঁকিতে আমি বিভাগ তত্ত্বের ফ্রেমের মধ্যে উত্তরাধিকার সম্পর্কে চিন্তা করা আলোকিত করে দেখি।

যদি আমরা আমাদের সমস্ত শ্রেণি এবং তীরগুলির মধ্যে উত্তরাধিকারের সম্পর্ককে বোঝায় তবে তা এরকম কিছু

A --> B

এর অর্থ যে class Bথেকে এসেছে class A। নোট করুন যে, দেওয়া

A --> B, B --> C

আমরা বলি যে সি বি থেকে উদ্ভূত হয় যা এ থেকে উদ্ভূত হয়, তাই সি এটিকেও এ থেকে প্রাপ্ত বলা হয়

A --> C

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

এটি কিছুটা সেটআপ, তবে এর সাথে আসুন আমরা আমাদের ডায়মন্ড অফ ডুমের দিকে একবার দেখে নিই:

C --> D
^     ^
|     |
A --> B

এটি ছায়াময় চেহারার ডায়াগ্রাম, তবে তা করবে। সুতরাং Dসমস্ত উত্তরাধিকারী A, Bআর C। তদ্ব্যতীত, এবং ওপি-র প্রশ্নের সমাধানের কাছাকাছি হওয়া, Dযে কোনও সুপারক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত A। আমরা একটি চিত্র আঁকতে পারি

C --> D --> R
^     ^
|     |
A --> B
^ 
|
Q

এখন, মৃত্যুর ডায়মন্ডের সাথে সম্পর্কিত সমস্যাগুলি হ'ল যখন Cএবং Bকিছু সম্পত্তি / পদ্ধতির নাম এবং জিনিসগুলি অস্পষ্ট হয়ে যায়; তবে, যদি আমরা কোনও ভাগ করা আচরণকে এর মধ্যে নিয়ে যাইA অস্পষ্টতা অদৃশ্য হয়ে যায়।

শ্রেণীগত দিক থেকে বললে, আমরা চাই A, Bএবং Cএই ধরনের হতে যে যদি Bএবং Cথেকে উত্তরাধিকারী Qতারপর Aএর উপশ্রেণী হিসেবে পুনর্লিখিত করা যেতে পারে Q। এটি Aএকটি ধাক্কা বলে কিছু তোলে ।

Dএকটি পুলব্যাক নামে পরিচিত একটি প্রতিসম নির্মাণও রয়েছে । এই মূলত সবচেয়ে সাধারণ দরকারী বর্গ আপনি গঠন করা যেতে পারে যা উভয় থেকে উত্তরাধিকারী Bএবং C। এটি হ'ল, যদি আপনার অন্য কোনও শ্রেণি Rথেকে উত্তরাধিকারসূত্রে উত্তীর্ণ হয় Bএবং Cতারপরে Dএমন একটি শ্রেণি যেখানে Rসাবক্লাস হিসাবে পুনরায় লেখা যেতে পারেD

আপনার হীরার টিপসটি পুলব্যাক এবং পুশআউটগুলি তা নিশ্চিত করা আমাদের নাম-সংঘর্ষ বা রক্ষণাবেক্ষণ সম্পর্কিত সমস্যাগুলি সাধারণভাবে পরিচালনা করার জন্য একটি দুর্দান্ত উপায় দেয় যা অন্যথায় উত্থাপিত হতে পারে।

নোট Paercebal এর উত্তর এই অনুপ্রাণিত হিসেবে তাঁর বুঝালে দেওয়া যে, আমরা সব সম্ভব ক্লাস পূর্ণ বিভাগ ক্লাস কাজ উপরে মডেল প্রযোজ্য।

আমি তার যুক্তিকে এমন কিছুতে সাধারণীকরণ করতে চেয়েছিলাম যা দেখায় যে একাধিক উত্তরাধিকারের সম্পর্ক কীভাবে শক্তিশালী এবং অ-সমস্যাযুক্ত হতে পারে complicated

টিএল; ডিআর আপনার প্রোগ্রামে উত্তরাধিকারের সম্পর্কগুলি একটি বিভাগ গঠন হিসাবে ভাবেন। তারপরে আপনি ডায়মন্ড অফ ডুমের সমস্যাগুলি বহুগুণ-উত্তরাধিকারী ক্লাস পুশআউট এবং প্রতিসাম্যিকভাবে তৈরি করে একটি সাধারণ প্যারেন্ট ক্লাস তৈরি করে এড়াতে পারবেন যা একটি পুলব্যাক is


3

আমরা আইফেল ব্যবহার করি। আমাদের চমৎকার এমআই আছে। কোন চিন্তা করো না. কোন কারণ নাই. সহজেই পরিচালিত এমআই ব্যবহার না করার সময় রয়েছে। তবে এটি লোকেদের উপলব্ধি করার চেয়ে বেশি কার্যকর কারণ তারা হলেন: ক) এমন একটি বিপজ্জনক ভাষায় যা এটি ভালভাবে পরিচালনা করে না-বা- খ) এমআই এর আশেপাশে তারা কীভাবে বছরের পর বছর কাজ করেছে - সন্তুষ্ট) অন্যান্য কারণে () তালিকার জন্য অনেকগুলি আমি যথেষ্ট নিশ্চিত - উপরে উত্তরগুলি দেখুন)।

আমাদের জন্য, আইফেল ব্যবহার করে, এমআই অন্য কোনও কিছুর মতোই প্রাকৃতিক এবং টুলবক্সে অন্য একটি দুর্দান্ত সরঞ্জাম tool সত্যই, আমরা যথেষ্ট উদ্বিগ্ন যে কেউ কেউ আইফেল ব্যবহার করছে না। কোন চিন্তা করো না. আমাদের যা আছে তাতে আমরা খুশি এবং আপনাকে দেখার জন্য আপনাকে আমন্ত্রণ জানাই।

আপনি যখন খুঁজছেন: অকার্যকর-সুরক্ষা এবং নাল পয়েন্টারকে নির্ধারণের নির্মূলকরণের বিশেষ নোট নিন। যখন আমরা সবাই এমআই এর চারপাশে নাচছিলাম তখন আপনার পয়েন্টারগুলি হারিয়ে যাচ্ছে! :-)


2

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

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

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

class CounterMixin {
    int count;
public:
    CounterMixin() : count( 0 ) {}
    virtual ~CounterMixin() {}
    virtual void increment() { count += 1; }
    virtual int getCount() { return count; }
};

class Foo : public Bar, virtual public CounterMixin { ..... };

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

নোট করুন যে এখানে আমার "মিক্স-ইন" শব্দটির ব্যবহার প্যারামিটারাইজড টেম্পলেট শ্রেণীর মতো নয় ( ভাল ব্যাখ্যা করার জন্য এই লিঙ্কটি দেখুন ) তবে আমি মনে করি এটি পরিভাষাটির যথাযথ ব্যবহার।

এখন আমি এই ধারণাটি দিতে চাই না যে নিরাপদে একাধিক উত্তরাধিকার ব্যবহারের একমাত্র উপায়। এটি কেবলমাত্র একটি উপায় যা চেক করা মোটামুটি সহজ।


2

আপনার এটি সাবধানে ব্যবহার করা উচিত, ডায়মন্ড সমস্যা যেমন কিছু বিষয় রয়েছে যখন জিনিসগুলি জটিল হতে পারে।

বিকল্প পাঠ
(উত্স: Learncpp.com )


12
এটি একটি খারাপ উদাহরণ, কারণ একটি অনুলিপি স্ক্যানার এবং একটি মুদ্রক সমন্বিত হওয়া উচিত, তাদের কাছ থেকে উত্তরাধিকারসূত্রে নয়।
সোভান্তে

2
যাইহোক, একটি Printerএমনকি একটি হওয়া উচিত নয় PoweredDevice। এ Printerমুদ্রণের জন্য, শক্তি পরিচালনার জন্য নয়। নির্দিষ্ট প্রিন্টারের প্রয়োগে কিছুটা পাওয়ার ম্যানেজমেন্ট করতে হতে পারে, তবে এই পাওয়ার ম্যানেজমেন্ট কমান্ডগুলি প্রিন্টারের ব্যবহারকারীদের কাছে সরাসরি প্রকাশ করা উচিত নয়। এই শ্রেণিবিন্যাসের আসল বিশ্বের ব্যবহার আমি কল্পনা করতে পারি না।
কৌতূহলী


1

হীরা প্যাটার্নের বাইরেও একাধিক উত্তরাধিকার অবজেক্টের মডেলটিকে বোঝা আরও শক্ত করে তোলে, যার ফলে রক্ষণাবেক্ষণের ব্যয় আরও বেড়ে যায়।

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

এছাড়াও, রক্ষণাবেক্ষণের ক্ষেত্রে, "হীরা সমস্যা" অ-আক্ষরিক উত্তরাধিকারের উদাহরণগুলিতেও আসে। উদাহরণস্বরূপ, আপনার যদি A এবং B থাকে এবং আপনার শ্রেণি C এর উভয় প্রসারিত করে এবং A এর একটি 'মেকজুইস' পদ্ধতি থাকে যা কমলার রস তৈরি করে এবং আপনি চুনের মোড় দিয়ে কমলা জুস তৈরি করতে প্রসারিত করেন: যখন ডিজাইনার ' বি 'একটি' মেকজুইস 'পদ্ধতি যুক্ত করে যা উত্পন্ন করে বৈদ্যুতিক বর্তমান? 'এ' এবং 'বি' এই মুহুর্তে "পিতামাতার" সাথে সামঞ্জস্যপূর্ণ হতে পারে তবে এর অর্থ এই নয় যে তারা সর্বদা তাই থাকবে!

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


what happens when the designer for 'B' adds a 'makeJuice' method which generates and electrical current?আহ, আপনি অবশ্যই একটি সংকলন ত্রুটি পাবেন (যদি ব্যবহারটি অস্পষ্ট হয়)।
টমাস এডিং

1

কংক্রিট অবজেক্টগুলির এমআইয়ের মূল সমস্যাটি হ'ল আপনার কাছে খুব কমই এমন একটি বিষয় রয়েছে যা বৈধভাবে "একটি এ এবং বি হতে হবে" হওয়া উচিত, সুতরাং এটি খুব কমই যৌক্তিক ভিত্তিতে সঠিক সমাধান হতে পারে। আরও প্রায়ই, আপনার কাছে একটি অবজেক্ট সি রয়েছে যা "সি একটি এ বা বি হিসাবে কাজ করতে পারে", যা আপনি ইন্টারফেসের উত্তরাধিকার ও রচনার মাধ্যমে অর্জন করতে পারেন obe তবে কোনও ভুল করবেন না - একাধিক ইন্টারফেসের উত্তরাধিকার এখনও এমআই, এটির কেবল একটি উপসেট।

বিশেষত সি ++ এর জন্য, বৈশিষ্ট্যের মূল দুর্বলতা একাধিক উত্তরাধিকারের প্রকৃত উপস্থিতি নয়, তবে কিছু নির্মাণ এটির প্রায়শই ত্রুটিযুক্ত হতে দেয়। উদাহরণস্বরূপ, একই বস্তুর একাধিক অনুলিপি উত্তরাধিকারসূত্রে প্রাপ্ত:

class B : public A, public A {};

সংজ্ঞা দ্বারা ত্রুটিযুক্ত। ইংরেজী অনূদিত এটি হ'ল "B is an A and an A" A সুতরাং, এমনকি মানুষের ভাষায় একটি গুরুতর অস্পষ্টতা রয়েছে। আপনার অর্থ কি "B এর 2 As" আছে বা "B is A" ?. উত্তরোত্তর ভাষাগুলিতে বৈশিষ্ট্যটি রক্ষার জন্য কেস করার বিষয়টি যখন এ জাতীয় রোগতাত্ত্বিক কোডকে আরও খারাপ ব্যবহারের এবং আরও খারাপ ব্যবহারের উদাহরণ হিসাবে গড়ে তোলা হয়েছে তখন সেটিকে সমর্থন করে না।


0

উত্তরাধিকারের অগ্রাধিকারে আপনি রচনাটি ব্যবহার করতে পারেন।

সাধারণ অনুভূতিটি হ'ল রচনাটি আরও ভাল এবং এটি খুব ভালভাবে আলোচিত।


4
-1: The general feeling is that composition is better, and it's very well discussed.এর অর্থ এই নয় যে কম্পোজিশনটি আরও ভাল।
টমাস এডিং

এটি বাদে, আসলে, আরও ভাল।
আলী আফশার

12
মামলাগুলি বাদে যেখানে ভাল হয় না।
টমাস এডিং

0

এতে জড়িত প্রতি ক্লাসে 4/8 বাইট লাগে। (প্রতি ক্লাসে এই পয়েন্টার)।

এটি কখনই উদ্বেগের বিষয় নাও হতে পারে তবে যদি একদিন আপনার কাছে একটি মাইক্রো ডেটা কাঠামো থাকে যা বিলিয়ন বিলিয়ন সময় হতে পারে।


1
সে সম্পর্কে নিশ্চিত? সাধারণত, কোনও গুরুতর উত্তরাধিকারের জন্য প্রতিটি শ্রেণীর সদস্যের একটি পয়েন্টার লাগবে, তবে প্রয়োজনীয় উত্তরাধিকার সূত্রে প্রাপ্ত শ্রেণিগুলি কী স্কেল করে? আরও লক্ষণীয় বিষয়, আপনি কোটি বার কিশোরী ডেটা কাঠামোটি কতবার করেছেন?
ডেভিড থর্নলি

3
@ ডেভিডথর্নলে " আপনি কতবার কোটি কোটি টিনে ডাটা স্ট্রাকচার করেছেন? " আপনি যখন এমআইয়ের বিরুদ্ধে তর্ক করছেন।
কৌতূহলী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.