উত্তর:
একাধিক উত্তরাধিকার (এমআই হিসাবে সংক্ষিপ্ত) গন্ধ গন্ধ , যার অর্থ সাধারণত এটি খারাপ কারণে করা হয়েছিল, এবং এটি রক্ষণাবেক্ষণকারীর মুখের দিকে ফিরে যাবে।
এটি উত্তরাধিকারের জন্য সত্য এবং তাই, এটি একাধিক উত্তরাধিকারের জন্য আরও সত্য।
আপনার অবজেক্টটি কি অন্যের কাছ থেকে উত্তরাধিকারী হওয়া দরকার? ক এর কাজ করার জন্য, বা ক এর কাছ Car
থেকে উত্তরাধিকারী হওয়ার দরকার নেই । এ এর একটি এবং চারটি রয়েছে ।Engine
Wheel
Car
Engine
Wheel
আপনি যদি সংস্থার পরিবর্তে এই সমস্যাগুলি সমাধান করতে একাধিক উত্তরাধিকার ব্যবহার করেন তবে আপনি কিছু ভুল করেছেন।
সাধারণত, আপনার একটি বর্গ থাকে A
, B
এবং C
উভয়ই উত্তরাধিকার সূত্রে আসে A
। এবং (আমাকে জিজ্ঞাসা করবেন কেন) কেউ তারপর সিদ্ধান্ত নেয় যে D
থেকে উভয় উত্তরাধিকারী হবে B
এবং C
।
আট আট বছরে আমি এই ধরণের সমস্যার মুখোমুখি হয়েছি এবং এটি দেখে মজাদার হয়:
D
উভয় থেকে উত্তরাধিকারসূত্রে উচিত হয়নি B
এবং C
), কারণ এই খারাপ স্থাপত্য ছিল (আসলে, C
সব সময়ে বিদ্যমান ছিল করা উচিত নয় ...)A
করছিলেন , কারণ সি ++ তে পিতামাতা শ্রেণি তার নাতি-নাতনি ক্লাসে দু'বার উপস্থিত ছিল D
এবং সুতরাং, একটি প্যারেন্ট ক্ষেত্র A::field
আপডেট করার অর্থ হয় এটি দু'বার (মাধ্যমে B::field
এবং C::field
) আপডেট করা , অথবা কিছু কিছু নীরবে ভুল এবং ক্র্যাশ হয়ে যাওয়া, পরে (নতুন পয়েন্টার ইন B::field
, এবং মুছুন C::field
...)উত্তরাধিকারের যোগ্যতা অর্জনের জন্য সি ++ তে কীওয়ার্ড ভার্চুয়াল ব্যবহার করে উপরের বর্ণিত ডাবল লেআউটটি এড়ানো যায় যদি এটি আপনি চান না তবে যাইহোক, আমার অভিজ্ঞতায় আপনি সম্ভবত কিছু ভুল করছেন ...
অবজেক্ট হায়ারার্কিতে আপনার স্তরক্রমকে বৃক্ষ হিসাবে রাখার চেষ্টা করা উচিত (কোনও নোডের একটি পিতা বা মাতা থাকে), গ্রাফ হিসাবে নয়।
সি ++ এ ডায়মন্ড অফ ড্রেডের আসল সমস্যাটি ( ডিজাইনটি দুর্দান্ত বলে ধরে নিচ্ছেন - আপনার কোডটি পর্যালোচনা করুন! ), আপনার পছন্দ করা দরকার :
A
আপনার লেআউটে ক্লাসটির দু'বার অস্তিত্ব থাকা বাঞ্ছনীয় এবং এর অর্থ কী? যদি হ্যাঁ, তবে তা হ'ল দুবারই উত্তরাধিকার সূত্রে পান।এই পছন্দটি সমস্যার অন্তর্নিহিত, এবং সি ++ এ অন্যান্য ভাষার মতো নয়, আপনি ভাষা পর্যায়ে আপনার নকশাকে জোর করে ছাড়াই এটি করতে পারেন।
তবে সমস্ত শক্তির মতো, সেই শক্তির সাথেই দায়িত্ব আসে: আপনার নকশাটি পর্যালোচনা করুন।
শূন্য বা একটি কংক্রিট শ্রেণীর একাধিক উত্তরাধিকার, এবং শূন্য বা আরও ইন্টারফেস সাধারণত ঠিক আছে, কারণ আপনি উপরে বর্ণিত ডায়মন্ডের মুখোমুখি হবেন না। আসলে জাভাতে জিনিসগুলি এভাবেই করা হয়।
সাধারণত, সি এর উত্তরাধিকার সূত্রে আপনি কী বোঝাতে চেয়েছিলেন A
এবং B
তা হ'ল ব্যবহারকারীরা C
এটির মতো ব্যবহার করতে পারেন A
, এবং / অথবা যেমন এটি B
।
সি ++ তে একটি ইন্টারফেস হ'ল একটি বিমূর্ত শ্রেণি যা:
এক বাস্তব বস্তুর শূন্যের একাধিক উত্তরাধিকার, এবং শূন্য বা আরও ইন্টারফেসকে "গন্ধযুক্ত" হিসাবে বিবেচনা করা হয় না (কমপক্ষে, ততটা নয়)।
প্রথমত, এনভিআই প্যাটার্নটি একটি ইন্টারফেস তৈরি করতে ব্যবহার করা যেতে পারে, কারণ আসল মানদণ্ডের কোনও রাজ্য (অর্থাত্ কোনও সদস্য ভেরিয়েবলগুলি ব্যতীত 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
সম্পূর্ণরূপে, সম্পূর্ণরূপে সম্পূর্ণরূপে নিরুক্ত
অন্যান্য মামলা রয়েছে:
this
)কখনও কখনও আপনি রচনা ব্যবহার করতে পারেন, এবং কখনও কখনও এমআই ভাল হয়। কথাটি হ'ল: আপনার একটি পছন্দ আছে। এটি দায়িত্বপূর্ণভাবে করুন (এবং আপনার কোডটি পর্যালোচনা করুন)।
বেশিরভাগ সময় আমার অভিজ্ঞতা, না। এমআই ডান টুল, যদিও তা কাজ বলে মনে হয় কারণ এটি গাদা অলস দ্বারা ব্যবহার করা যেতে পারে পরিণতি (ক উপার্জন মত বুঝতে ছাড়া একসঙ্গে অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে নয় Car
উভয় Engine
এবং একটি Wheel
)।
তবে মাঝে মাঝে হ্যাঁ এবং সেই সময়, এমআই এর চেয়ে ভাল কিছু আর কাজ করবে না।
তবে এমআই দুর্গন্ধযুক্ত, কোড পর্যালোচনায় আপনার আর্কিটেকচারটি রক্ষার জন্য প্রস্তুত থাকুন (এবং এটির পক্ষে রক্ষা করা ভাল জিনিস, কারণ আপনি যদি এটির পক্ষে সুরক্ষিত করতে না পারেন তবে আপনার এটি করা উচিত নয়)।
বাজার্ন স্ট্রস্ট্রপের সাথে একটি সাক্ষাত্কার থেকে :
লোকেরা বেশ সঠিকভাবে বলেছে যে আপনার একাধিক উত্তরাধিকারের প্রয়োজন নেই, কারণ একাধিক উত্তরাধিকার নিয়ে আপনি যা কিছু করতে পারেন তা একক উত্তরাধিকারের সাথেও করতে পারেন। আপনি উল্লিখিত প্রতিনিধি দলটি ব্যবহার করুন। তদুপরি, আপনার কোনও উত্তরাধিকারের প্রয়োজন নেই, কারণ একক উত্তরাধিকার নিয়ে যা কিছু করুন আপনি বর্গের মাধ্যমে ফরওয়ার্ড করেও উত্তরাধিকার ছাড়াই করতে পারেন। আসলে, আপনার কোনও ক্লাসের দরকার নেই, কারণ আপনি এটি পয়েন্টার এবং ডেটা স্ট্রাকচারের সাহায্যে করতে পারেন। তবে আপনি কেন এটি করতে চান? ভাষার সুবিধা কখন ব্যবহার করা যায়? আপনি কখন একটি workaround পছন্দ করবেন? আমি একাধিক উত্তরাধিকার উপযোগী এমন কেসগুলি দেখেছি এবং এমনকি এমন জটিল ঘটনাও দেখেছি যেখানে বেশ কয়েকটি জটিল উত্তরাধিকার দরকারী। সাধারণত, আমি ভাষা দ্বারা প্রদত্ত সুবিধাগুলি কাজের ক্ষেত্রগুলিতে ব্যবহার করতে পছন্দ করি
const
- যখন ক্লাসে সত্যিকারের পরিবর্তনীয়- এবং অপরিবর্তনীয়-রূপগুলি থাকা দরকার তখন আমাকে ক্লানকি ওয়ার্করাউন্ডগুলি (সাধারণত ইন্টারফেস এবং রচনা ব্যবহার করে) লিখতে হত। যাইহোক, আমি একবারে একাধিক উত্তরাধিকার হারিয়ে ফেলিনি, এবং কখনও কখনও অনুভব করি নি যে এই বৈশিষ্ট্যটির অভাবের কারণে আমাকে একটি কার্যনির্বাহী লিখতে হয়েছিল। এটাই পার্থক্য। প্রতিটি ক্ষেত্রেই আমি দেখেছি, এমআই ব্যবহার না করা আরও ভাল ডিজাইনের পছন্দ, কার্যকারণ নয়।
এটি এড়ানোর কোনও কারণ নেই এবং এটি পরিস্থিতিতে এটি খুব কার্যকর হতে পারে। আপনার সম্ভাব্য সমস্যাগুলি সম্পর্কে সচেতন হওয়া দরকার।
সবচেয়ে বড়টি হ'ল মৃত্যুর হীরা:
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;
সর্বদা আপনার নকশা পর্যালোচনা করুন, নিশ্চিত করুন যে আপনি ডেটা পুনঃব্যবহারের সংরক্ষণের জন্য উত্তরাধিকার ব্যবহার করছেন না। যদি আপনি একই জিনিসকে সংমিশ্রণের সাথে প্রতিনিধিত্ব করতে পারেন (এবং সাধারণত আপনি পারেন) তবে এটি আরও উন্নততর পদ্ধতির।
GrandParent
থাকে Child
। এমআই-এর একটি ভয় রয়েছে, কারণ লোকেরা কেবলমাত্র তারা মনে করে যে তারা ভাষার বিধিগুলি বুঝতে পারে না। তবে যে কেউ এই সাধারণ নিয়মগুলি পেতে পারে না সেও একটি তুচ্ছ প্রোগ্রাম লিখতে পারে না।
ডাব্লু দেখুন: একাধিক উত্তরাধিকার ।
একাধিক উত্তরাধিকার সমালোচনা পেয়েছে এবং যেমনটি অনেক ভাষায় প্রয়োগ হয় না। সমালোচনার মধ্যে রয়েছে:
- জটিলতা বৃদ্ধি পেয়েছে
- শব্দার্থক অস্পষ্টতা প্রায়শই হীরকের সমস্যা হিসাবে সংক্ষিপ্ত হয়ে যায় ।
- একক শ্রেণী থেকে একাধিকবার সুস্পষ্টভাবে উত্তরাধিকারী হতে সক্ষম হচ্ছি না
- বংশানুক্রমিক শ্রেণীর শব্দার্থ পরিবর্তনের আদেশ।
সি ++ / জাভা স্টাইল কনস্ট্রাক্টর সহ ভাষাগুলিতে একাধিক উত্তরাধিকারী নির্মাণকারী এবং নির্মাণকারী চেইনগুলির উত্তরাধিকারের সমস্যাটিকে আরও বাড়িয়ে তোলে, যার ফলে এই ভাষাগুলিতে রক্ষণাবেক্ষণ এবং এক্সটেনসিবিলিটি সমস্যা তৈরি হয়। ব্যাপকভাবে বিভিন্ন নির্মাণ পদ্ধতির সাথে উত্তরাধিকারের সম্পর্কের অবজেক্টগুলি কনস্ট্রাক্টর শৃঙ্খলিত দৃষ্টান্তের অধীনে কার্যকর করা শক্ত।
সিওএম এবং জাভা ইন্টারফেসের মতো ইন্টারফেস (খাঁটি অ্যাবস্ট্রাক্ট শ্রেণি) ব্যবহার করার জন্য এটি সমাধানের আধুনিক উপায়।
আমি কি এই জায়গায় অন্য জিনিস করতে পারি?
হ্যা, তুমি পারো. আমি জিওএফ থেকে চুরি করতে যাচ্ছি ।
সর্বজনীন উত্তরাধিকার একটি আইএস-এ সম্পর্ক, এবং কখনও কখনও শ্রেণি বিভিন্ন ধরণের বিভিন্ন শ্রেণির হয়ে থাকে এবং কখনও কখনও এটি প্রতিফলিত করা গুরুত্বপূর্ণ important
"মিক্সিনস" কখনও কখনও দরকারী। এগুলি সাধারণত ছোট শ্রেণি, সাধারণত কোনও কিছু থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় না, দরকারী কার্যকারিতা সরবরাহ করে।
যতদিন উত্তরাধিকারের শ্রেণিবিন্যাস মোটামুটি অগভীর হয় (এটি প্রায় সর্বদা হওয়া উচিত) এবং ভালভাবে পরিচালিত হয়, আপনি ভয়ঙ্কর হীরার উত্তরাধিকার পাওয়ার সম্ভাবনা কম। একাধিক উত্তরাধিকার ব্যবহার করে এমন সমস্ত ভাষায় হীরা কোনও সমস্যা নয়, তবে এটির সি ++ এর চিকিত্সা প্রায়শই বিশ্রী এবং মাঝে মাঝে চমকপ্রদ হয়।
আমি একাধিক উত্তরাধিকার সূক্ষ্ম হ'ল কেসগুলিতে চলে এসেছি, সেগুলি আসলে বেশ বিরল। এটি সম্ভবত কারণ যখন আমি সত্যিই একাধিক উত্তরাধিকারের প্রয়োজন হয় না তখন আমি অন্যান্য ডিজাইন পদ্ধতি ব্যবহার করতে পছন্দ করি। আমি বিভ্রান্তিকর ভাষা নির্মাণগুলি এড়াতে পছন্দ করি না এবং উত্তরাধিকারের ক্ষেত্রে এমনটি নির্মাণ করা সহজ যেখানে আপনাকে ম্যানুয়ালটি সত্যিই ভালভাবে পড়তে হবে যা চলছে তা নির্ধারণ করার জন্য।
আপনার একাধিক উত্তরাধিকার "এড়ানো" উচিত নয় তবে 'ডায়মন্ড সমস্যা' ( http://en.wikedia.org/wiki/Diamond_problem ) এর মতো উদ্ভূত সমস্যাগুলি সম্পর্কে আপনার সচেতন হওয়া উচিত এবং আপনাকে প্রদত্ত ক্ষমতার যত্ন সহকারে আচরণ করুন আপনার যেমন সমস্ত ক্ষমতা থাকা উচিত।
কিছুটা বিমূর্ত হওয়ার ঝুঁকিতে আমি বিভাগ তত্ত্বের ফ্রেমের মধ্যে উত্তরাধিকার সম্পর্কে চিন্তা করা আলোকিত করে দেখি।
যদি আমরা আমাদের সমস্ত শ্রেণি এবং তীরগুলির মধ্যে উত্তরাধিকারের সম্পর্ককে বোঝায় তবে তা এরকম কিছু
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
আমরা আইফেল ব্যবহার করি। আমাদের চমৎকার এমআই আছে। কোন চিন্তা করো না. কোন কারণ নাই. সহজেই পরিচালিত এমআই ব্যবহার না করার সময় রয়েছে। তবে এটি লোকেদের উপলব্ধি করার চেয়ে বেশি কার্যকর কারণ তারা হলেন: ক) এমন একটি বিপজ্জনক ভাষায় যা এটি ভালভাবে পরিচালনা করে না-বা- খ) এমআই এর আশেপাশে তারা কীভাবে বছরের পর বছর কাজ করেছে - সন্তুষ্ট) অন্যান্য কারণে () তালিকার জন্য অনেকগুলি আমি যথেষ্ট নিশ্চিত - উপরে উত্তরগুলি দেখুন)।
আমাদের জন্য, আইফেল ব্যবহার করে, এমআই অন্য কোনও কিছুর মতোই প্রাকৃতিক এবং টুলবক্সে অন্য একটি দুর্দান্ত সরঞ্জাম tool সত্যই, আমরা যথেষ্ট উদ্বিগ্ন যে কেউ কেউ আইফেল ব্যবহার করছে না। কোন চিন্তা করো না. আমাদের যা আছে তাতে আমরা খুশি এবং আপনাকে দেখার জন্য আপনাকে আমন্ত্রণ জানাই।
আপনি যখন খুঁজছেন: অকার্যকর-সুরক্ষা এবং নাল পয়েন্টারকে নির্ধারণের নির্মূলকরণের বিশেষ নোট নিন। যখন আমরা সবাই এমআই এর চারপাশে নাচছিলাম তখন আপনার পয়েন্টারগুলি হারিয়ে যাচ্ছে! :-)
প্রতিটি প্রোগ্রামিং ল্যাঙ্গুয়েজে প্রোফেস এবং কনসের সাথে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের কিছুটা আলাদা চিকিত্সা রয়েছে। সি ++ এর সংস্করণে পারফরম্যান্সের উপর জোর দেওয়া হয়েছে এবং এর সাথে খারাপ দিক রয়েছে যে অবৈধ কোডটি লিখতে অসুবিধাজনকভাবে সহজ - এবং এটি একাধিক উত্তরাধিকারের ক্ষেত্রে সত্য। ফলস্বরূপ প্রোগ্রামারদের এই বৈশিষ্ট্য থেকে দূরে নিয়ে যাওয়ার প্রবণতা রয়েছে।
অন্যান্য লোকেরা কী একাধিক উত্তরাধিকার উত্তম নয় এই প্রশ্নে সম্বোধন করেছেন। তবে আমরা বেশ কয়েকটি মন্তব্য দেখেছি যা কম-বেশি বোঝায় যে এটিকে এড়ানোর কারণ এটি নিরাপদ নয়। ভাল, হ্যাঁ এবং না।
সি ++ এর ক্ষেত্রে প্রায়শই সত্য, আপনি যদি কোনও মৌলিক নির্দেশিকা অনুসরণ করেন তবে আপনি নিয়মিত "আপনার কাঁধের উপর নজর না রেখে" নিরাপদে ব্যবহার করতে পারেন। মূল ধারণাটি হ'ল আপনি একটি বিশেষ ধরণের শ্রেণিবদ্ধতাকে "মিক্স-ইন" বলে আলাদা করেন; শ্রেণীর একটি মিক্স-ইন হয় যদি এর সমস্ত সদস্য ফাংশন ভার্চুয়াল (বা খাঁটি ভার্চুয়াল) হয়। তারপরে আপনাকে একক একটি প্রধান শ্রেণি এবং আপনার পছন্দ মতো অনেকগুলি "মিক্স-ইনস" উত্তরাধিকারী করার অনুমতি দেওয়া হয়েছে - তবে আপনার "ভার্চুয়াল" কীওয়ার্ডের সাথে মিক্সিং উত্তরাধিকারী হওয়া উচিত। যেমন
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 { ..... };
আমার পরামর্শ হ'ল আপনি যদি ক্লাসকে মিক্স-ইন ক্লাস হিসাবে ব্যবহার করতে চান তবে আপনি কোডটি পড়ার পক্ষে কী ঘটছে তা সহজেই দেখতে এবং আপনি যে মৌলিক গাইডলাইনটির নিয়ম অনুসারে খেলছেন তা যাচাই করার জন্য নামকরণের কনভেনশনও গ্রহণ করেন । এবং আপনি যদি দেখতে পান যে আপনার মিশ্র-ইনগুলিতেও ডিফল্ট কনস্ট্রাক্টর রয়েছে তবে এটি আরও বেশি ভাল কাজ করে, কেবল ভার্চুয়াল বেস ক্লাসগুলি কাজ করার কারণে। এবং মনে রাখবেন যে সমস্ত ডিস্ট্রাক্টরগুলিকেও ভার্চুয়াল করে তুলবেন।
নোট করুন যে এখানে আমার "মিক্স-ইন" শব্দটির ব্যবহার প্যারামিটারাইজড টেম্পলেট শ্রেণীর মতো নয় ( ভাল ব্যাখ্যা করার জন্য এই লিঙ্কটি দেখুন ) তবে আমি মনে করি এটি পরিভাষাটির যথাযথ ব্যবহার।
এখন আমি এই ধারণাটি দিতে চাই না যে নিরাপদে একাধিক উত্তরাধিকার ব্যবহারের একমাত্র উপায়। এটি কেবলমাত্র একটি উপায় যা চেক করা মোটামুটি সহজ।
আপনার এটি সাবধানে ব্যবহার করা উচিত, ডায়মন্ড সমস্যা যেমন কিছু বিষয় রয়েছে যখন জিনিসগুলি জটিল হতে পারে।
(উত্স: Learncpp.com )
Printer
এমনকি একটি হওয়া উচিত নয় PoweredDevice
। এ Printer
মুদ্রণের জন্য, শক্তি পরিচালনার জন্য নয়। নির্দিষ্ট প্রিন্টারের প্রয়োগে কিছুটা পাওয়ার ম্যানেজমেন্ট করতে হতে পারে, তবে এই পাওয়ার ম্যানেজমেন্ট কমান্ডগুলি প্রিন্টারের ব্যবহারকারীদের কাছে সরাসরি প্রকাশ করা উচিত নয়। এই শ্রেণিবিন্যাসের আসল বিশ্বের ব্যবহার আমি কল্পনা করতে পারি না।
উত্তরাধিকারের ব্যবহার এবং অপব্যবহার।
নিবন্ধটি উত্তরাধিকার ব্যাখ্যা করার জন্য দুর্দান্ত কাজ করে এবং এটি বিপদজনক।
হীরা প্যাটার্নের বাইরেও একাধিক উত্তরাধিকার অবজেক্টের মডেলটিকে বোঝা আরও শক্ত করে তোলে, যার ফলে রক্ষণাবেক্ষণের ব্যয় আরও বেড়ে যায়।
রচনাটি অন্তর্ভুক্তভাবে বোঝা, বোঝা এবং ব্যাখ্যা করা সহজ। কোডটি লেখার জন্য এটি ক্লান্তিকর হতে পারে তবে একটি ভাল আইডিই (ভিজ্যুয়াল স্টুডিওর সাথে কাজ করার কয়েক বছর হয়ে গেছে, তবে অবশ্যই জাভা আইডিই-র সকলের দুর্দান্ত রচনা শর্টকাট স্বয়ংক্রিয় সরঞ্জাম রয়েছে) আপনাকে এই বাধাটি কাটিয়ে উঠতে হবে।
এছাড়াও, রক্ষণাবেক্ষণের ক্ষেত্রে, "হীরা সমস্যা" অ-আক্ষরিক উত্তরাধিকারের উদাহরণগুলিতেও আসে। উদাহরণস্বরূপ, আপনার যদি A এবং B থাকে এবং আপনার শ্রেণি C এর উভয় প্রসারিত করে এবং A এর একটি 'মেকজুইস' পদ্ধতি থাকে যা কমলার রস তৈরি করে এবং আপনি চুনের মোড় দিয়ে কমলা জুস তৈরি করতে প্রসারিত করেন: যখন ডিজাইনার ' বি 'একটি' মেকজুইস 'পদ্ধতি যুক্ত করে যা উত্পন্ন করে বৈদ্যুতিক বর্তমান? 'এ' এবং 'বি' এই মুহুর্তে "পিতামাতার" সাথে সামঞ্জস্যপূর্ণ হতে পারে তবে এর অর্থ এই নয় যে তারা সর্বদা তাই থাকবে!
সামগ্রিকভাবে, উত্তরাধিকার এবং বিশেষত একাধিক উত্তরাধিকার এড়ানোর জন্য সর্বাধিক উত্তোলন যথাযথ। সমস্ত সর্বাধিক হিসাবে, ব্যতিক্রমগুলি রয়েছে, তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনার কোডগুলি যে কোনও ব্যতিক্রমকে চিহ্নিত করে একটি ফ্ল্যাশিং সবুজ নিয়ন চিহ্ন রয়েছে (এবং আপনার মস্তিষ্ককে প্রশিক্ষণ দিন যাতে যে কোনও সময় আপনি নিজের ঝলকানো সবুজ নিয়নটিতে আঁকেন এমন উত্তরাধিকারী গাছগুলি দেখেন স্বাক্ষর করুন) এবং আপনি এটি একবারে একবারে সমস্ত কিছু বোধগম্য হয়েছে তা নিশ্চিত করে পরীক্ষা করে দেখুন।
what happens when the designer for 'B' adds a 'makeJuice' method which generates and electrical current?
আহ, আপনি অবশ্যই একটি সংকলন ত্রুটি পাবেন (যদি ব্যবহারটি অস্পষ্ট হয়)।
কংক্রিট অবজেক্টগুলির এমআইয়ের মূল সমস্যাটি হ'ল আপনার কাছে খুব কমই এমন একটি বিষয় রয়েছে যা বৈধভাবে "একটি এ এবং বি হতে হবে" হওয়া উচিত, সুতরাং এটি খুব কমই যৌক্তিক ভিত্তিতে সঠিক সমাধান হতে পারে। আরও প্রায়ই, আপনার কাছে একটি অবজেক্ট সি রয়েছে যা "সি একটি এ বা বি হিসাবে কাজ করতে পারে", যা আপনি ইন্টারফেসের উত্তরাধিকার ও রচনার মাধ্যমে অর্জন করতে পারেন obe তবে কোনও ভুল করবেন না - একাধিক ইন্টারফেসের উত্তরাধিকার এখনও এমআই, এটির কেবল একটি উপসেট।
বিশেষত সি ++ এর জন্য, বৈশিষ্ট্যের মূল দুর্বলতা একাধিক উত্তরাধিকারের প্রকৃত উপস্থিতি নয়, তবে কিছু নির্মাণ এটির প্রায়শই ত্রুটিযুক্ত হতে দেয়। উদাহরণস্বরূপ, একই বস্তুর একাধিক অনুলিপি উত্তরাধিকারসূত্রে প্রাপ্ত:
class B : public A, public A {};
সংজ্ঞা দ্বারা ত্রুটিযুক্ত। ইংরেজী অনূদিত এটি হ'ল "B is an A and an A" A সুতরাং, এমনকি মানুষের ভাষায় একটি গুরুতর অস্পষ্টতা রয়েছে। আপনার অর্থ কি "B এর 2 As" আছে বা "B is A" ?. উত্তরোত্তর ভাষাগুলিতে বৈশিষ্ট্যটি রক্ষার জন্য কেস করার বিষয়টি যখন এ জাতীয় রোগতাত্ত্বিক কোডকে আরও খারাপ ব্যবহারের এবং আরও খারাপ ব্যবহারের উদাহরণ হিসাবে গড়ে তোলা হয়েছে তখন সেটিকে সমর্থন করে না।
উত্তরাধিকারের অগ্রাধিকারে আপনি রচনাটি ব্যবহার করতে পারেন।
সাধারণ অনুভূতিটি হ'ল রচনাটি আরও ভাল এবং এটি খুব ভালভাবে আলোচিত।
The general feeling is that composition is better, and it's very well discussed.
এর অর্থ এই নয় যে কম্পোজিশনটি আরও ভাল।
এতে জড়িত প্রতি ক্লাসে 4/8 বাইট লাগে। (প্রতি ক্লাসে এই পয়েন্টার)।
এটি কখনই উদ্বেগের বিষয় নাও হতে পারে তবে যদি একদিন আপনার কাছে একটি মাইক্রো ডেটা কাঠামো থাকে যা বিলিয়ন বিলিয়ন সময় হতে পারে।