উত্তরাধিকারের চেয়ে রচনা কেন পছন্দ করবেন? প্রতিটি পদ্ধতির জন্য কি ট্রেড অফ রয়েছে? কখন আপনি রচনা উত্তরাধিকার চয়ন করা উচিত?
উত্তরাধিকারের চেয়ে রচনা কেন পছন্দ করবেন? প্রতিটি পদ্ধতির জন্য কি ট্রেড অফ রয়েছে? কখন আপনি রচনা উত্তরাধিকার চয়ন করা উচিত?
উত্তর:
উত্তরাধিকারের তুলনায় রচনাটিকে পছন্দ করুন কারণ এটি পরে আরও সংশোধনযোগ্য / সহজলভ্য, তবে একটি রচনা-সর্বদা ব্যবহার করবেন না। রচনা দিয়ে, নির্ভরতা ইনজেকশন / সেটারগুলির সাথে ফ্লাইতে আচরণ পরিবর্তন করা সহজ। উত্তরাধিকার হ'ল আরও কঠোর কারণ বেশিরভাগ ভাষা আপনাকে একাধিক প্রকারের থেকে বের করতে দেয় না। আপনি একবার টাইপএ থেকে নেমে এলে হংস কম বেশি রান্না হয়।
উপরেরগুলির জন্য আমার অ্যাসিড পরীক্ষাটি হ'ল:
টাইপবি যেখানে টাইপএ প্রত্যাশিত যেখানে টাইপবি ব্যবহার করা যেতে পারে তেমন টাইপএর সম্পূর্ণ ইন্টারফেস (সমস্ত পাবলিক পদ্ধতি কম নয়) প্রকাশ করতে চায়? উত্তরাধিকার সূচিত করে ।
টাইপবি কি টাইপএ দ্বারা প্রকাশিত আচরণের কিছু / অংশ চান? সংমিশ্রণের প্রয়োজনীয়তা নির্দেশ করে ।
আপডেট: সবেমাত্র আমার জবাব ফিরে এসেছিল এবং এখন মনে হচ্ছে বার্বারা লিসকভের লিসকোভ সাবস্টিটিউশন নীতিমালার 'আমার কি এই ধরণের উত্তরাধিকার হতে হবে?' এর পরীক্ষা হিসাবে নির্দিষ্ট উল্লেখ করা ছাড়া এটি অসম্পূর্ণ ?
একটি সম্পর্ক আছে হিসাবে ধারক সম্পর্কে ভাবেন । একটি গাড়ীর একটি "ইঞ্জিন" থাকে, একজন ব্যক্তির "নাম" থাকে ইত্যাদি has
উত্তরাধিকার চিন্তা হিসাবে একটি একটি হল সম্পর্ক। একটি গাড়ী "একটি" যানবাহন, একটি ব্যক্তি "একটি" স্তন্যপায়ী ইত্যাদি "is
আমি এই পদ্ধতির জন্য কোনও কৃতিত্ব গ্রহণ করি না। স্টিভ ম্যাককনেল , বিভাগ 6.3 দ্বারা সম্পূর্ণ কোডের দ্বিতীয় সংস্করণ থেকে আমি এটিকে সরাসরি গ্রহণ করেছি ।
আপনি যদি পার্থক্যটি বুঝতে পারেন তবে এটি ব্যাখ্যা করা সহজ।
এর উদাহরণ ক্লাস ব্যবহার না করে পিএইচপি (বিশেষত পিএইচপি 5 এর আগে)। সমস্ত যুক্তি ফাংশনের একটি সেট এ এনকোড করা হয়। আপনি সহায়তাকারী ফাংশন সমেত অন্যান্য ফাইলগুলি অন্তর্ভুক্ত করতে পারেন এবং ফাংশনগুলির চারপাশে ডেটা পাস করে আপনার ব্যবসায় যুক্তি পরিচালনা করতে পারেন। অ্যাপ্লিকেশন বাড়ার সাথে সাথে এটি পরিচালনা করা খুব কঠিন হতে পারে। পিএইচপি 5 আরও অবজেক্ট ওরিয়েন্টড ডিজাইন দিয়ে এটি প্রতিকার করার চেষ্টা করে।
এটি ক্লাসের ব্যবহারকে উত্সাহ দেয়। উত্তরাধিকার হ'ল ওও ডিজাইনের তিনটি ধারার একটি (উত্তরাধিকার, পলিমারফিজম, এনক্যাপসুলেশন)।
class Person {
String Title;
String Name;
Int Age
}
class Employee : Person {
Int Salary;
String Title;
}
এটি কর্মক্ষেত্রে উত্তরাধিকার। কর্মচারী "একজন ব্যক্তি" বা ব্যক্তি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত। সমস্ত উত্তরাধিকারের সম্পর্কগুলি "এটি-এ" সম্পর্ক। কর্মচারী ব্যক্তি থেকে শিরোনাম সম্পত্তিটির ছায়াও দেয় যার অর্থ কর্মচারী। শিরোনাম ব্যক্তিটির জন্য নয় কর্মচারীর জন্য উপাধি ফিরিয়ে দেবে।
উত্তরাধিকারের তুলনায় রচনা পছন্দসই। এটিকে খুব সহজভাবে বলতে গেলে আপনার এই হবে:
class Person {
String Title;
String Name;
Int Age;
public Person(String title, String name, String age) {
this.Title = title;
this.Name = name;
this.Age = age;
}
}
class Employee {
Int Salary;
private Person person;
public Employee(Person p, Int salary) {
this.person = p;
this.Salary = salary;
}
}
Person johnny = new Person ("Mr.", "John", 25);
Employee john = new Employee (johnny, 50000);
রচনা সাধারণত "একটি" বা "ব্যবহার" একটি সম্পর্ক আছে। এখানে কর্মী শ্রেণীর একজন ব্যক্তি রয়েছে। এটি ব্যক্তির কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় না তবে পরিবর্তে ব্যক্তি বস্তু এটিতে প্রেরণ করে, এ কারণেই এটির একজন "ব্যক্তি" রয়েছে।
এখন বলুন যে আপনি কোনও ম্যানেজারের ধরন তৈরি করতে চান যাতে আপনার এটি শেষ হয়:
class Manager : Person, Employee {
...
}
এই উদাহরণটি ঠিক কাজ করবে, তবে ব্যক্তি এবং কর্মচারী উভয়ই ঘোষণা করলে Title
কী হবে? ম্যানেজার.টাইটেলকে "ম্যানেজার অফ অপারেশনস" বা "মিঃ" ফিরিয়ে দেওয়া উচিত? রচনা অনুসারে এই অস্পষ্টতা আরও ভালভাবে পরিচালনা করা হয়:
Class Manager {
public string Title;
public Manager(Person p, Employee e)
{
this.Title = e.Title;
}
}
ম্যানেজার অবজেক্টটি একজন কর্মচারী এবং একজন ব্যক্তি হিসাবে রচিত। শিরোনাম আচরণটি কর্মচারীর কাছ থেকে নেওয়া হয়। এই সুস্পষ্ট রচনাটি অন্যান্য জিনিসের মধ্যে অস্পষ্টতা দূর করে এবং আপনি কম বাগের মুখোমুখি হবেন।
উত্তরাধিকার সূত্রে প্রদত্ত সমস্ত অনস্বীকার্য সুবিধা সহ এর কিছু অসুবিধা এখানে রয়েছে।
উত্তরাধিকারের অসুবিধা:
অন্যদিকে অবজেক্ট কম্পোজিশনটি অন্যান্য অবজেক্টের রেফারেন্স অর্জনকারী বস্তুর মাধ্যমে রানটাইম সংজ্ঞায়িত হয়। এরকম ক্ষেত্রে এই বস্তুগুলি কখনই একে অপরের সুরক্ষিত ডেটাতে পৌঁছাতে সক্ষম হবে না (কোনও এনক্যাপসুলেশন বিরতি নেই) এবং একে অপরের ইন্টারফেসকে সম্মান করতে বাধ্য হবে। এবং এই ক্ষেত্রেও, উত্তরাধিকারের ক্ষেত্রে বাস্তবায়ন নির্ভরতা অনেক কম হবে।
আরেকটি, খুব যুক্তিযুক্ত কারণ, উত্তরাধিকারের চেয়ে রচনাটি পছন্দ করা আপনার ডোমেন মডেলটির সাথে সম্পর্কিত এবং এটি একটি সম্পর্কিত ডেটাবেসে ম্যাপিং। এসকিউএল মডেলটির উত্তরাধিকার মানচিত্র করা সত্যিই শক্ত (আপনি সব ধরণের হ্যাকি ওয়ার্করাউন্ডস দিয়ে শেষ করেছেন, যেমন কলামগুলি তৈরি করা হয় যা সবসময় ব্যবহৃত হয় না, ভিউ ইত্যাদি ব্যবহার করে)। কিছু ওআরএমএল এটি নিয়ে কাজ করার চেষ্টা করে তবে এটি সবসময় দ্রুত জটিল হয়ে ওঠে। দুটি টেবিলের মধ্যে একটি বিদেশী-কী সম্পর্কের মাধ্যমে রচনাটি সহজেই মডেল করা যায় তবে উত্তরাধিকারটি আরও শক্ত।
যদিও সংক্ষিপ্ত ভাষায় আমি "উত্তরাধিকারের চেয়ে বেশি রচনাটি পছন্দ করি" এর সাথে একমত হব, আমার জন্য প্রায়শই এটি "কোকাকোলা তুলনায় আলু পছন্দ করে" বলে মনে হয়। উত্তরাধিকারের জন্য জায়গা এবং রচনার জন্য জায়গা রয়েছে। আপনার পার্থক্য বুঝতে হবে, তাহলে এই প্রশ্নটি অদৃশ্য হয়ে যাবে। এটি আমার পক্ষে আসলে যা বোঝায় তা হ'ল "যদি আপনি উত্তরাধিকার ব্যবহার করতে চলেছেন - আবার চিন্তা করুন, আপনার কি সংমিশ্রণের দরকার আছে"।
আপনি খেতে চাইলে আপনার কোকাকোলা থেকে আলু পছন্দ করা উচিত এবং আপনি যখন পান করতে চান তখন আলুর চেয়ে কোকাকোলা।
সাবক্লাস তৈরির অর্থ সুপারক্লাস পদ্ধতিগুলি কল করার জন্য কোনও সুবিধাজনক উপায়ের চেয়ে বেশি হওয়া উচিত। যখন সাবক্লাসটি "হ'ল" সুপার ক্লাস কাঠামোগত এবং কার্যকরীভাবে উভয় ক্ষেত্রেই ব্যবহার করা উচিত, যখন এটি সুপারক্লাস হিসাবে ব্যবহার করা যায় এবং আপনি এটি ব্যবহার করতে যাচ্ছেন। যদি এটি না হয় - এটি উত্তরাধিকার নয়, তবে অন্য কিছু। সংমিশ্রণটি যখন আপনার বস্তুগুলির সাথে অন্য থাকে বা তাদের সাথে কিছু সম্পর্ক থাকে।
সুতরাং আমার কাছে দেখে মনে হচ্ছে কেউ যদি জানতে না পারে যে তার উত্তরাধিকার বা রচনা দরকার কিনা, আসল সমস্যা হ'ল তিনি জানেন না তিনি পান করতে চান বা খেতে চান কিনা। আপনার সমস্যা ডোমেন সম্পর্কে আরও চিন্তা করুন, এটি আরও ভাল করে বুঝতে।
InternalCombustionEngine
উত্পন্ন শ্রেণীর সাথে একটি বেস শ্রেণি বিবেচনা করুন GasolineEngine
। পরেরটি স্পার্ক প্লাগের মতো জিনিস যুক্ত করে, যা বেস ক্লাসের অভাব রয়েছে, তবে জিনিসটি একটি হিসাবে ব্যবহার InternalCombustionEngine
করলে স্পার্ক প্লাগগুলি ব্যবহার হয়ে যাবে।
উত্তরাধিকার বিশেষত প্রক্রিয়াগত-জমি থেকে আসা বেশ আকর্ষণীয় এবং এটি প্রায়শই ছদ্মবেশী মার্জিত দেখায়। মানে আমি যা করতে চাই তা হ'ল এই এক বিট কার্যকারিতাটি অন্য কোনও শ্রেণিতে যুক্ত করা, তাই না? ঠিক আছে, সমস্যাগুলির মধ্যে একটি হ'ল
আপনার বেস ক্লাসটি সুরক্ষিত সদস্যদের আকারে সাবক্লাসে প্রয়োগের বিশদটি প্রকাশ করে এনক্যাপসুলেশন ভেঙে দেয়। এটি আপনার সিস্টেমকে কঠোর এবং ভঙ্গুর করে তোলে। আরও দুঃখজনক ত্রুটিটি হ'ল নতুন সাবক্লাসটি উত্তরাধিকার শৃঙ্খলার সমস্ত জিনিসপত্র এবং মতামত নিয়ে আসে।
নিবন্ধ, উত্তরাধিকার হ'ল মন্দ: ডেটাঅ্যানোটেশনস মডেলবাইন্ডারের এপিক ব্যর্থ, সি # তে এর উদাহরণ দিয়ে চলেছে । এটি উত্তরাধিকারের ব্যবহার দেখায় যখন রচনাটি ব্যবহার করা উচিত ছিল এবং কীভাবে এটি রিফ্যাক্ট করা যায়।
জাভা বা সি # তে, কোনও জিনিস একবার ইনস্ট্যান্ট হয়ে গেলে তার প্রকারটি পরিবর্তন করতে পারে না।
সুতরাং, যদি আপনার অবজেক্টটি অন্য কোনও অবজেক্ট হিসাবে উপস্থিত হওয়ার প্রয়োজন হয় বা কোনও অবজেক্টের অবস্থা বা অবস্থার উপর নির্ভর করে আলাদা আচরণ করে, তবে রচনাটি : রাষ্ট্র এবং কৌশলটি দেখুন ডিজাইনের প্যাটার্নগুলি দেখুন।
যদি বস্তুটি একই ধরণের হওয়া দরকার তবে উত্তরাধিকার ব্যবহার করুন বা ইন্টারফেস প্রয়োগ করুন।
Client
। তারপরে, PreferredClient
পরে একটি পপস এর একটি নতুন ধারণা পপ আপ হয়। করা উচিত PreferredClient
উত্তরাধিকারী Client
? একটি পছন্দসই ক্লায়েন্ট 'একটি' ক্লায়েন্ট পুরোপুরি, না? ঠিক আছে, এত তাড়াতাড়ি নয় ... আপনি যেমন বলেছিলেন যে রানটাইমে অবজেক্টগুলি তাদের শ্রেণি পরিবর্তন করতে পারে না। আপনি কীভাবে client.makePreferred()
অপারেশনকে মডেল করবেন ? সম্ভবত উত্তরটি নিখোঁজ ধারণাটির সাথে রচনাটি ব্যবহারের মধ্যে রয়েছে, Account
সম্ভবত?
Client
ক্লাস করার পরিবর্তে , সম্ভবত এখানে কেবল একটিই রয়েছে Account
যা একটি StandardAccount
বা একটি হতে পারে এমন ধারণাটি আবদ্ধ করে PreferredAccount
...
এখানে সন্তোষজনক উত্তর পাওয়া যায় নি, তাই আমি একটি নতুন লিখেছি।
কেন " পছন্দ করেন তা বোঝার জন্য উত্তরাধিকারের চেয়ে রচনাটিকে আমাদের প্রথমে এই সংক্ষিপ্ত প্রতিমাটি বাদ দেওয়া অনুমানটি ফিরে পাওয়া দরকার।
উত্তরাধিকারের দুটি সুবিধা রয়েছে: সাবটাইপিং এবং সাবক্লাসিং
সাবটাইপিংয়ের অর্থ একটি প্রকারের (ইন্টারফেস) স্বাক্ষরের সাথে মানানসই, অর্থাৎ এপিআই-র একটি সেট এবং সাব-টাইপিং পলিমারফিজম অর্জনের জন্য স্বাক্ষরের একটি অংশকে ওভাররাইড করতে পারে।
সাবক্লাসিংয়ের অর্থ পদ্ধতি বাস্তবায়নের অন্তর্ভুক্ত পুনরায় ব্যবহার use
দুটি বেনিফিটের সাথে উত্তরাধিকার সম্পাদনের দুটি পৃথক উদ্দেশ্য রয়েছে: উপ-টাইপ ওরিয়েন্টেড এবং কোড পুনরায় ব্যবহারমুখী।
যদি কোড পুনরায় ব্যবহারের একমাত্র উদ্দেশ্য হয় তবে সাবক্লাসিং তার প্রয়োজনের তুলনায় আরও কিছু দিতে পারে, অর্থাত পিতামাতাদের কয়েকটি সার্বজনীন পদ্ধতি শিশু শ্রেণির পক্ষে খুব একটা বোঝায় না। এই ক্ষেত্রে, উত্তরাধিকারের চেয়ে রচনাটির পক্ষপাতী হওয়ার পরিবর্তে রচনাটির দাবি করা হয় । এখান থেকেই "হ'ল-এ" বনাম। "-র" ধারণাটি এসেছে।
সুতরাং কেবলমাত্র সাবটিপিংয়ের পরিকল্পনা করা হলে, অর্থাত্ নতুন শ্রেণিটি পরবর্তীতে বহুপদী পদ্ধতিতে ব্যবহার করার জন্য, আমরা উত্তরাধিকার বা রচনা বাছাই করার সমস্যাটির মুখোমুখি হই। আলোচনার অধীনে সংক্ষিপ্ত প্রতিমাগুলিতে বাদ দেওয়া এই ধারণাটি।
সাব টাইপ করার জন্য কোনও ধরণের স্বাক্ষরের সাথে সামঞ্জস্য করা হয়, এর অর্থ কমপিউশনটি সর্বদা এই ধরণের এপিআইয়ের কম পরিমাণে প্রকাশ করতে পারে। এখন বাণিজ্য বন্ধ শুরু:
উত্তরাধিকারসূত্রে ওভাররাইড না করা হলে সোজা কোডের পুনঃব্যবহার সরবরাহ করে, যখন রচনাটি প্রতিটি এপিআইকে পুনরায় কোড করতে হয়, যদিও এটি প্রতিনিধিদের কেবল একটি সহজ কাজ।
উত্তরাধিকার আভ্যন্তরীণ বহুমুখী সাইটের মাধ্যমে সোজা খোলার পুনরাবৃত্তি সরবরাহ করেthis
, অর্থ অন্য সদস্য ফাংশনে ওভাররাইড পদ্ধতি (বা এমনকি টাইপ ) হয় পাবলিক বা প্রাইভেট ( নিরুৎসাহিত হলেও )। ওপেন পুনরাবৃত্তি রচনার মাধ্যমে সিমুলেটেড করা যায় তবে এর জন্য অতিরিক্ত প্রচেষ্টা প্রয়োজন এবং সর্বদা কার্যকর (?) নাও হতে পারে। সদৃশ প্রশ্নের এই উত্তরটি একই রকম কিছু কথা বলে।
উত্তরাধিকার সুরক্ষিত সদস্যদের উদ্ভাসিত করে । এটি প্যারেন্ট ক্লাসের এনক্যাপসুলেশনটি ভেঙে দেয় এবং সাবক্লাস দ্বারা ব্যবহৃত হয় তবে শিশু এবং তার পিতামাতার মধ্যে আরেকটি নির্ভরতা প্রবর্তিত হয়।
সংমিশ্রণটি নিয়ন্ত্রণের বিপরীতমুখী হতে পারে এবং ডেকোরেটর প্যাটার্ন এবং প্রক্সি প্যাটার্নে যেমন প্রদর্শিত হয় তেমন নির্ভরতা গতিময়ভাবে ইনজেকশন দেওয়া যায় ।
সংমিশ্রণ-ভিত্তিক প্রোগ্রামিংয়ের সুবিধা রয়েছে , অর্থাৎ সম্মিলিত প্যাটার্নের মতো এমনভাবে কাজ করা ।
রচনা তত্ক্ষণাত একটি ইন্টারফেসে প্রোগ্রামিং অনুসরণ করে ।
রচনা সহজ একাধিক উত্তরাধিকার সুবিধা আছে ।
উপরের বাণিজ্যগুলি বিবেচনায় রেখে আমরা উত্তরাধিকারের তুলনায় রচনাটিকে পছন্দ করি । তবুও কঠোরভাবে সম্পর্কিত ক্লাসগুলির জন্য, অর্থাত্ অন্তর্নিহিত কোডের পুনঃব্যবহার যখন সত্যিই উপকার করে, বা উন্মুক্ত পুনরাবৃত্তির যাদু শক্তি পছন্দ হয়, উত্তরাধিকারের পছন্দ হবে।
ব্যক্তিগতভাবে আমি উত্তরাধিকারের চেয়ে সর্বদা রচনা পছন্দ করতে শিখেছি। আপনি উত্তরাধিকারের সাথে সমাধান করতে পারেন এমন কোনও প্রোগ্রামিক সমস্যা নেই যা আপনি রচনা দিয়ে সমাধান করতে পারবেন না; যদিও আপনাকে কিছু ক্ষেত্রে ইন্টারফেস (জাভা) বা প্রোটোকলস (ওবজে-সি) ব্যবহার করতে হতে পারে। যেহেতু সি ++ এ জাতীয় কোনও কিছুই জানে না, তাই আপনাকে বিমূর্ত বেস ক্লাসগুলি ব্যবহার করতে হবে, যার অর্থ আপনি সি ++ এ উত্তরাধিকার থেকে সম্পূর্ণ মুক্তি দিতে পারবেন না।
রচনাটি প্রায়শই আরও যৌক্তিক হয়, এটি আরও ভাল বিমূর্ততা, আরও ভাল এনক্যাপসুলেশন, আরও ভাল কোড পুনরায় ব্যবহার (বিশেষত খুব বড় প্রকল্পগুলিতে) সরবরাহ করে এবং কেবল আপনার কোডের যে কোনও জায়গায় বিচ্ছিন্ন পরিবর্তন করেছেন বলেই দূরত্বে কোনও কিছু ভাঙার সম্ভাবনা কম। " একক দায়িত্বের নীতিমালা " রক্ষা করাও এটিকে আরও সহজ করে তোলে যা প্রায়শই সংক্ষিপ্তসার হিসাবে বলা হয় " শ্রেণীর পরিবর্তনের জন্য একাধিক কারণের আর কখনও হওয়া উচিত নয়। ", এবং এর অর্থ এই যে প্রতিটি শ্রেণি একটি নির্দিষ্ট উদ্দেশ্যে উপস্থিত থাকে এবং এটি হওয়া উচিত কেবল তার উদ্দেশ্যগুলির সাথে সরাসরি সম্পর্কিত এমন পদ্ধতি রয়েছে। এছাড়াও খুব অগভীর উত্তরাধিকার গাছ থাকা আপনার প্রকল্পটি সত্যই বড় হতে শুরু করলেও ওভারভিউটি রাখা আরও সহজ করে তোলে। অনেক লোক মনে করে যে উত্তরাধিকার আমাদের বাস্তব বিশ্বের প্রতিনিধিত্ব করেবেশ ভাল, কিন্তু এটি সত্য নয়। আসল বিশ্ব উত্তরাধিকারের চেয়ে অনেক বেশি রচনা ব্যবহার করে। খুব সুন্দর প্রতিটি বাস্তব বিশ্বের বস্তু যা আপনি আপনার হাতে ধরে রাখতে পারেন তা অন্য, ছোট বাস্তব বিশ্বের বস্তুগুলি থেকে তৈরি করা হয়েছে।
যদিও রচনার ডাউনসাইড রয়েছে। যদি আপনি উত্তরাধিকার পুরোপুরি ছেড়ে যান এবং কেবল রচনাতে মনোনিবেশ করেন তবে আপনি লক্ষ্য করবেন যে প্রায়শই আপনাকে বেশ কয়েকটি অতিরিক্ত কোড লাইন লিখতে হবে যা আপনি উত্তরাধিকার ব্যবহার করে থাকলে প্রয়োজনীয় ছিল না। আপনি কখনও কখনও নিজেকে পুনরাবৃত্তি করতে বাধ্য হন এবং এটি ডিআরওয়াই নীতি লঙ্ঘন করে(DRY = নিজেকে পুনরাবৃত্তি করবেন না)। এছাড়াও রচনাটির প্রায়শই প্রতিনিধিদলের প্রয়োজন হয় এবং একটি পদ্ধতি কেবল এই কলটির আশেপাশে অন্য কোনও কোড ছাড়াই অন্য কোনও অবজেক্টের অন্য পদ্ধতিটিকে কল করে। এই জাতীয় "ডাবল মেথড কল" (যা সহজেই ট্রিপল বা চতুর্মুখী পদ্ধতি কলগুলিতে প্রসারিত হতে পারে এবং তার থেকেও আরও দূরে) বংশগতির চেয়ে অনেক খারাপ পারফরম্যান্স থাকতে পারে, যেখানে আপনি কেবলমাত্র আপনার পিতামাতার একটি পদ্ধতির উত্তরাধিকারী হন। উত্তরাধিকারসূত্রে প্রাপ্ত পদ্ধতিতে কল করা উত্তরাধিকার সূত্রে প্রাপ্ত কল হিসাবে সমান দ্রুত হতে পারে, বা এটি কিছুটা ধীর হতে পারে তবে সাধারণত পরপর দুটি পদ্ধতি কলের চেয়ে এখনও দ্রুত হয়।
আপনি লক্ষ্য করেছেন যে বেশিরভাগ ওও ভাষা একাধিক উত্তরাধিকারের অনুমতি দেয় না। একাধিক মামলা রয়েছে যেখানে একাধিক উত্তরাধিকার সত্যিই আপনাকে কিছু কিনতে পারে তবে সেগুলি নিয়মের চেয়ে ব্যতিক্রম। যখনই আপনি এমন পরিস্থিতির মধ্যে চলে যান যেখানে আপনি মনে করেন "একাধিক উত্তরাধিকার এই সমস্যাটি সমাধান করার জন্য একটি দুর্দান্ত বৈশিষ্ট্য হবে", আপনি সাধারণত এমন এক পর্যায়ে থাকেন যেখানে আপনার উত্তরাধিকারকে পুরোপুরি পুনর্বিবেচনা করা উচিত, এমনকি এটির জন্য বেশ কয়েকটি অতিরিক্ত কোড লাইনও লাগতে পারে , রচনা ভিত্তিক একটি সমাধান সাধারণত অনেক বেশি মার্জিত, নমনীয় এবং ভবিষ্যতের প্রমাণ হিসাবে দেখাবে।
উত্তরাধিকার হ'ল একটি দুর্দান্ত বৈশিষ্ট্য, তবে আমি ভয় করি যে এটি গত কয়েক বছর ধরে অতিরিক্ত ব্যবহৃত হয়েছে। লোকেরা উত্তরাধিকারকে এক হাতুড়ি হিসাবে বিবেচনা করে যা এটিকে পেরেক দিতে পারে, যদি তা আসলে পেরেক, স্ক্রু বা অন্য কিছু হতে পারে।
TextFile
একটি হল File
।
আমার থাম্বের সাধারণ নিয়ম: উত্তরাধিকার ব্যবহারের আগে বিবেচনা করুন যদি রচনাটি আরও অর্থবোধ করে।
কারণ: সাবক্লাসিংয়ের অর্থ সাধারণত আরও জটিলতা এবং সংযুক্তি, অর্থাত্ ভুল না করে পরিবর্তন করা, বজায় রাখা এবং স্কেল করা শক্ত।
সূর্যের টিম বউদ্রেউর থেকে আরও অনেক সম্পূর্ণ এবং দৃ answer় উত্তর :
উত্তরাধিকারের ব্যবহারের সাধারণ সমস্যাগুলি যেমনটি দেখছি তা হ'ল:
- নিরীহ কাজগুলি অপ্রত্যাশিত ফলাফল পেতে পারে - এর সর্বোত্তম ক্লাসিক উদাহরণটি সুপারক্লাস নির্মাণকারীর কাছ থেকে ওভারডেবল পদ্ধতিতে কল করা হয়, সাবক্লাস উদাহরণ ক্ষেত্রগুলির সূচনা করার আগে। নিখুঁত বিশ্বে কেউ কখনও তা করতে পারে না। এটি নিখুঁত বিশ্ব নয়।
- এটি সাবক্ল্যাসারদের জন্য পদ্ধতি কলগুলির ক্রম এবং যেমন সম্পর্কে অনুমান করার জন্য বিকৃত প্রলোভন সরবরাহ করে - সুপারক্লাস সময়ের সাথে সাথে যদি বিকশিত হতে পারে তবে এই ধরনের অনুমানগুলি স্থিতিশীল হতে পারে না। আরও দেখুন আমার টোস্ট করার বৈদু্যতিক যন্ত্র ও কফি পাত্র উপমা ।
- ক্লাসগুলি ভারী হয়ে যায় - আপনি অগত্যা জানেন না যে আপনার সুপারক্লাস এর নির্মাতায় কী কাজ করছে বা এটি কত স্মৃতি ব্যবহার করছে। সুতরাং কিছু নিরীহ-হালকা ওজনের জিনিস তৈরি করা আপনার ভাবার চেয়ে অনেক বেশি ব্যয়বহুল হতে পারে এবং সুপারক্লাসটি বিকশিত হলে সময়ের সাথে এটি পরিবর্তিত হতে পারে
- এটি সাবক্লাসের একটি বিস্ফোরণকে উত্সাহ দেয় । শ্রেণিবদ্ধকরণের জন্য সময় ব্যয় হয়, আরও ক্লাসের জন্য মেমরির খরচ হয়। আপনি নেটবিয়ানদের স্কেল সম্পর্কিত কোনও অ্যাপ্লিকেশনটি না করা পর্যন্ত এটি একটি নন-ইস্যু হতে পারে, তবে সেখানে আমাদের আসল সমস্যা ছিল, উদাহরণস্বরূপ, মেনুগুলি ধীর হচ্ছে কারণ মেনুটির প্রথম প্রদর্শনটি বিশাল শ্রেণীর লোডকে ট্রিগার করেছিল। আমরা আরও ঘোষিত সিনট্যাক্স এবং অন্যান্য কৌশলগুলিতে সরিয়ে এটি ঠিক করেছি, তবে সেই ব্যয়টিও ঠিক করার জন্য।
- বিষয়গুলি পরে পরিবর্তন করা আরও শক্ত করে তোলে - যদি আপনি কোনও শ্রেণি পাবলিক করেন তবে সুপারক্লাসের অদলবদলটি সাবক্লাসগুলি ভেঙে ফেলতে পারে - এটি এমন একটি পছন্দ যা আপনি একবার কোডটি প্রকাশ করার পরে আপনার সাথে বিবাহবন্ধনে আবদ্ধ হন। সুতরাং যদি আপনি আপনার সুপারক্লাসে প্রকৃত কার্যকারিতা পরিবর্তন না করে থাকেন তবে আপনার প্রয়োজনীয় জিনিসটি প্রসারিত করার পরিবর্তে আপনি পরে যদি জিনিসগুলি ব্যবহার করেন তবে জিনিসগুলি পরিবর্তনের জন্য আরও অনেক স্বাধীনতা পাবেন। উদাহরণস্বরূপ, জেপানেলকে সাবক্লাসিং করুন - এটি সাধারণত ভুল হয়; এবং যদি সাবক্লাসটি কোথাও সর্বজনীন হয়, আপনি কখনই সেই সিদ্ধান্তটি পুনর্বিবেচনার সুযোগ পাবেন না। যদি এটি জেকম্পোনেন্ট getThePanel () হিসাবে অ্যাক্সেস করা থাকে তবে আপনি এখনও এটি করতে পারেন (ইঙ্গিত: আপনার API হিসাবে উপাদানগুলির জন্য মডেল প্রকাশ করুন)।
- অবজেক্ট হায়ারারচিগুলি স্কেল করে না (বা পরে তাদের স্কেল তৈরি করা সামনের পরিকল্পনার চেয়ে অনেক শক্ত) - এটি ক্লাসিক "অনেকগুলি স্তর" সমস্যা। আমি নীচে এটিতে যাব, এবং কীভাবে AskOOracle প্যাটার্ন এটি সমাধান করতে পারে (যদিও এটি OOP পিউরিস্টদের ক্ষতি করতে পারে)।
...
আমার করণীয়, আপনি যদি উত্তরাধিকারের জন্য অনুমতি দেন তবে লবণের দানা দিয়ে যা নিতে পারেন তা হ'ল:
- ধ্রুবক ছাড়া আর কোনও ক্ষেত্র উন্মুক্ত করবেন না
- পদ্ধতিগুলি বিমূর্ত বা চূড়ান্ত হবে
- সুপারক্লাস নির্মাণকারীর কাছ থেকে কোনও পদ্ধতি কল করবেন না
...
এই সমস্তগুলি বড় প্রকল্পগুলির চেয়ে ছোট প্রকল্পগুলিতে কম এবং জনসাধারণের চেয়ে ব্যক্তিগত ক্লাসে কম প্রযোজ্য
অন্যান্য উত্তর দেখুন।
এটি প্রায়শই বলা হয় যে কোনও শ্রেণি একটি শ্রেণীর Bar
উত্তরাধিকারী হতে পারে Foo
যখন নিম্নলিখিত বাক্যটি সত্য হয়:
- একটি বার একটি foo হয়
দুর্ভাগ্যক্রমে, একমাত্র উপরের পরীক্ষাটি নির্ভরযোগ্য নয়। পরিবর্তে নিম্নলিখিত ব্যবহার করুন:
- একটি বার একটি foo, এবং
- বারগুলি foos যা করতে পারে তা করতে পারে।
প্রথম টেস্টে নিশ্চিত যে সব getters এর Foo
মধ্যে জানার Bar
(= ভাগ বৈশিষ্ট্য), এবং দ্বিতীয় টেস্ট নিশ্চিত করে তোলে যে সব setters এর Foo
মধ্যে জানার Bar
(= ভাগ কার্যকারিতা)।
উদাহরণ 1: কুকুর -> প্রাণী
একটি কুকুর একটি প্রাণী এবং কুকুররা প্রাণী যা করতে পারে তা করতে পারে (যেমন শ্বাস নেওয়া, মারা যাওয়া ইত্যাদি)। অতএব, শ্রেণি শ্রেণীর উত্তরাধিকারী Dog
হতে পারেAnimal
।
উদাহরণ 2: বৃত্ত - / -> উপবৃত্ত
একটি চেনাশোনা একটি উপবৃত্ত হয় তবে উপবৃত্তগুলি করতে পারে এমন সমস্ত কিছুই চেনাশোনাগুলি করতে পারে না। উদাহরণস্বরূপ, চেনাশোনাগুলি প্রসারিত করতে পারে না, তবে উপবৃত্তগুলি পারে। সুতরাং, শ্রেণি শ্রেণীর উত্তরাধিকারী Circle
হতে পারে নাEllipse
।
একে বলা হয় সার্কেল-উপবৃত্ত সমস্যা , যা আসলেই কোনও সমস্যা নয়, কেবলমাত্র একটি স্পষ্ট প্রমাণ যে উত্তরাধিকার সম্ভব তা উপসংহারে কেবল প্রথম পরীক্ষাই যথেষ্ট নয়। বিশেষত, এই উদাহরণটি হাইলাইট করে যে উত্পন্ন ক্লাসগুলি বেস ক্লাসগুলির কার্যকারিতা বাড়িয়ে তুলতে হবে , এটি কখনই বাধা দেয় না। অন্যথায়, বেস শ্রেণিটি বহুতলভাবে ব্যবহার করা যায়নি।
পারলেও পারো উত্তরাধিকার ব্যবহার পারেন তার অর্থ আপনার উচিত নয় : রচনাটি ব্যবহার করা সর্বদা একটি বিকল্প। উত্তরাধিকার হ'ল একটি শক্তিশালী সরঞ্জাম যা অন্তর্নিহিত কোড পুনরায় ব্যবহার এবং গতিশীল প্রেরণের অনুমতি দেয় তবে এটি কয়েকটি অসুবিধাগুলি নিয়ে আসে, যার কারণে রচনাটি প্রায়শই পছন্দ করা হয়। উত্তরাধিকার এবং রচনার মধ্যে বাণিজ্য বন্ধগুলি সুস্পষ্ট নয় এবং আমার মতে এলসিএন এর উত্তরে সর্বোত্তমভাবে ব্যাখ্যা করা হয়েছে ।
থাম্বের নিয়ম হিসাবে, আমি বহুগুণিত ব্যবহার খুব সাধারণ হিসাবে প্রত্যাশিত যখন সংমিশ্রণের উপর উত্তরাধিকার বেছে নেব, এমন ক্ষেত্রে ডায়নামিক প্রেরণের শক্তি আরও বেশি পঠনযোগ্য এবং মার্জিত এপিআই হতে পারে। উদাহরণস্বরূপ, Widget
জিইউআই ফ্রেমওয়ার্কগুলিতে একটি পলিমারফিক ক্লাস, বা Node
এক্সএমএল লাইব্রেরিতে একটি পলিমারফিক ক্লাস থাকার ফলে এমন একটি এপিআই পাওয়া যায় যা রচনার উপর ভিত্তি করে সমাধানের সাথে সমাধানের তুলনায় আপনার যা ব্যবহার করতে অনেক বেশি পঠনযোগ্য এবং স্বজ্ঞাত।
ঠিক তেমনি আপনি জানেন, উত্তরাধিকার সম্ভব কিনা তা নির্ধারণের জন্য ব্যবহৃত অন্য একটি পদ্ধতির নাম লিসকভ সাবস্টিটিউশন নীতি :
বেস ক্লাসে পয়েন্টার বা রেফারেন্স ব্যবহার করে এমন ফাংশনগুলি অজান্তেই উত্পন্ন ক্লাসের অবজেক্টগুলি ব্যবহার করতে সক্ষম হতে হবে
মূলত, এর অর্থ হ'ল উত্তরাধিকার সম্ভব যদি বেস ক্লাসটি বহুত্বভাবে ব্যবহার করা যায়, যা আমি বিশ্বাস করি আমাদের পরীক্ষার সমতুল্য "একটি বার একটি ফু এবং বারগুলি foos যা করতে পারে সবকিছু করতে পারে"।
computeArea(Circle* c) { return pi * square(c->radius()); }
। একটি উপবৃত্ত (ব্যাসার্ধ () এমনকি এর অর্থ কি?) পাস করলে এটি স্পষ্টতই ভেঙে যায়। একটি উপবৃত্ত একটি চেনাশোনা নয় এবং যেমন বৃত্ত থেকে নেওয়া উচিত নয়।
computeArea(Circle *c) { return pi * width * height / 4.0; }
এখন এটি জেনেরিক।
width()
এবং height()
? এখন যদি কোনও লাইব্রেরি ব্যবহারকারী "ডিমের শেপ" নামে আরও একটি ক্লাস তৈরি করার সিদ্ধান্ত নেন? এটিও "বৃত্ত" থেকে উদ্ভূত হওয়া উচিত? অবশ্যই না. ডিমের আকার কোনও বৃত্ত নয়, এবং উপবৃত্তটিও একটি বৃত্ত নয়, সুতরাং এলএসপি ভেঙে যাওয়ার কারণে কোনওটিই বৃত্ত থেকে নেওয়া উচিত নয়। চেনাশোনা * শ্রেণিতে ক্রিয়াকলাপ করার পদ্ধতিগুলি একটি চেনাশোনা কী তা সম্পর্কে দৃ ass় ধারণা তৈরি করে এবং এই অনুমানগুলি ভেঙে প্রায় অবশ্যই বাগগুলি নিয়ে যায়।
উত্তরাধিকার অত্যন্ত শক্তিশালী, তবে আপনি এটি জোর করতে পারবেন না (দেখুন: বৃত্ত-উপবৃত্ত সমস্যা )। সত্যিকারের "হ'ল একটি" সাব টাইপ সম্পর্কের বিষয়ে আপনি যদি সত্যই নিশ্চিতরূপে নিশ্চিত না হতে পারেন তবে কম্পোজিশনের সাথে যাওয়াই ভাল।
উত্তরাধিকার subclass এবং সুপার শ্রেণীর মধ্যে একটি দৃ relationship় সম্পর্ক তৈরি করে; সাবক্লাস অবশ্যই সুপার ক্লাসের প্রয়োগের বিশদ সম্পর্কে সচেতন হতে হবে। সুপার ক্লাস তৈরি করা আরও শক্ত, যখন আপনাকে কীভাবে এটি বাড়ানো যেতে পারে সে সম্পর্কে ভাবতে হবে। আপনাকে ক্লাস ইনগ্রেন্টদের সাবধানতার সাথে ডকুমেন্ট করতে হবে এবং জানাতে হবে যে অতিরিক্ত কী কী পদ্ধতিগুলি অভ্যন্তরীণভাবে ব্যবহার করে।
উত্তরাধিকার হ'ল কখনও কখনও দরকারী, যদি শ্রেণিবিন্যাস সত্যিই একটি-ই-সম্পর্কের প্রতিনিধিত্ব করে। এটি ওপেন-ক্লোজড নীতিমালার সাথে সম্পর্কিত, যাতে বলা হয়েছে যে ক্লাসগুলি সংশোধনের জন্য বন্ধ করা উচিত তবে এক্সটেনশনে খোলা উচিত। আপনি পলিমারফিজম পেতে পারেন যেভাবে; একটি জেনেরিক পদ্ধতি রয়েছে যা সুপার টাইপ এবং এর পদ্ধতিগুলির সাথে ডিল করে তবে গতিশীল প্রেরণের মাধ্যমে সাবক্লাসের পদ্ধতিটি চাওয়া হয়। এটি নমনীয়, এবং নির্দেশনা তৈরি করতে সহায়তা করে, যা সফ্টওয়্যারটিতে প্রয়োজনীয় (বাস্তবায়নের বিশদ সম্পর্কে কম জানতে)।
উত্তরাধিকার সহজেই অতিরিক্ত ব্যবহার করা হয়, যদিও ক্লাসের মধ্যে কঠোর নির্ভরশীলতা সহ অতিরিক্ত জটিলতা তৈরি করে। এছাড়াও প্রোগ্রামের প্রয়োগের সময় কী ঘটে তা বোঝা স্তরগুলি এবং পদ্ধতি কলগুলির গতিশীল নির্বাচনের কারণে বেশ শক্ত হয়ে যায়।
আমি রচনাটিকে ডিফল্ট হিসাবে ব্যবহার করার পরামর্শ দেব। এটি আরও মডুলার, এবং দেরীতে বাইন্ডিংয়ের সুবিধা দেয় (আপনি উপাদানটিকে পরিবর্তনশীল পরিবর্তন করতে পারেন)। এছাড়াও বিষয়গুলি পৃথকভাবে পরীক্ষা করা সহজ। এবং যদি আপনাকে কোনও শ্রেণি থেকে কোনও পদ্ধতি ব্যবহার করতে হয় তবে আপনাকে নির্দিষ্ট ফর্ম হতে বাধ্য করা হবে না (লিসকভ সাবস্টিটিউশন নীতিমালা)।
Inheritance is sometimes useful... That way you can have polymorphism
উত্তরাধিকার এবং বহুবর্ষের ধারণার সাথে সংযোগ স্থাপন হিসাবে ব্যাখ্যা করেছি (প্রসঙ্গটি বিবেচনা করে অনুমান করা হয়)। আমার মন্তব্যটি আপনার মন্তব্যে আপনি কী স্পষ্ট করেছেন তা নির্দেশ করার উদ্দেশ্যে ছিল: পলিমারফিজম বাস্তবায়নের একমাত্র উপায়ই উত্তরাধিকার নয় এবং রচনা এবং উত্তরাধিকারের মধ্যে সিদ্ধান্ত নেওয়ার সময় বাস্তবে নির্ধারক কারণ নয়।
ধরুন একটি বিমানের কেবল দুটি অংশ রয়েছে: একটি ইঞ্জিন এবং ডানা।
তারপরে বিমানের ক্লাস ডিজাইনের দুটি উপায় রয়েছে।
Class Aircraft extends Engine{
var wings;
}
এখন আপনার বিমানগুলি স্থির ডানাগুলি দিয়ে শুরু করতে
এবং এটিকে ফ্লাইটে রোটারি ডানাতে পরিবর্তন করতে পারে। এটি মূলত ডানাযুক্ত
একটি ইঞ্জিন। তবে আমি যদি পরিবর্তন করতে চাই
উড়ানের ইঞ্জিনটিও করতে ?
হয় বেস ক্লাসে Engine
কোনও মিউটরকে এর
বৈশিষ্ট্য পরিবর্তন করার জন্য উন্মুক্ত করে, অথবা আমি এই রূপে আবার ডিজাইন করি Aircraft
:
Class Aircraft {
var wings;
var engine;
}
এখন, আমি ফ্লাইতে আমার ইঞ্জিনও প্রতিস্থাপন করতে পারি।
আপনি কটাক্ষপাত থাকতে হবে দ্য Liskov উপকল্পন পুঁজি আঙ্কেল বব এর কঠিন বর্গ নকশা নীতির। :)
আপনি যখন "কপি" / বেস ক্লাসের 'এপিআই প্রকাশ করতে চান, আপনি উত্তরাধিকার ব্যবহার করেন। যখন আপনি কেবল কার্যকারিতা "অনুলিপি" করতে চান, প্রতিনিধি ব্যবহার করুন।
এর একটি উদাহরণ: আপনি একটি তালিকা থেকে একটি স্ট্যাক তৈরি করতে চান। স্ট্যাকের কেবল পপ, ধাক্কা এবং উঁকি দেওয়া আছে। আপনি স্ট্যাকের মধ্যে পুশ_ব্যাক, পুশ_ফ্রন্ট, রিমুভএট, এবং এ জাতীয় কার্যকারিতা চান না এমন উত্তরাধিকার ব্যবহার করা উচিত নয়।
এই দুটি উপায় একসাথে ঠিক থাকতে পারে এবং একে অপরকে সমর্থন করে।
রচনাটি কেবল এটি মডুলার বাজছে: আপনি পিতামাত্ত শ্রেণীর অনুরূপ ইন্টারফেস তৈরি করেন, নতুন অবজেক্ট তৈরি করুন এবং এতে ডেলিগেট কল করুন। যদি এই বিষয়গুলি একে অপরের সম্পর্কে না জানা দরকার, তবে এটি বেশ নিরাপদ এবং রচনা ব্যবহার করা সহজ। এখানে অনেকগুলি সম্ভাব্য লোক রয়েছে।
তবে, যদি কোনও কারণে পিতৃত শ্রেণীর অনভিজ্ঞ প্রোগ্রামারটির জন্য "চাইল্ড ক্লাস" প্রদত্ত ফাংশনগুলিতে অ্যাক্সেসের প্রয়োজন হয় তবে এটি উত্তরাধিকার ব্যবহারের জন্য দুর্দান্ত জায়গা বলে মনে হতে পারে। প্যারেন্ট ক্লাসটি কেবল এটি নিজস্ব বিমূর্ত "foo ()" বলতে পারে যা সাবক্লাস দ্বারা ওভাররাইট করা হয় এবং তারপরে এটি অ্যাবস্ট্রাক্ট বেসকে মান দিতে পারে।
এটি দেখতে একটি দুর্দান্ত ধারণা বলে মনে হচ্ছে তবে বেশিরভাগ ক্ষেত্রে এটি ক্লাসকে এমন কোনও অবজেক্ট দেয় যা foo () প্রয়োগ করে (অথবা মানটি ম্যানুয়ালি সরবরাহ করেছিল) কিছু বেস ক্লাস থেকে নতুন ক্লাসের উত্তরাধিকারী হওয়ার চেয়ে প্রয়োজনীয় ফাংশন foo () নির্দিষ্ট করতে হবে।
কেন?
কারণ উত্তরাধিকার হ'ল তথ্য সঞ্চার করার একটি দুর্বল উপায় ।
রচনাটির এখানে একটি বাস্তব প্রান্ত রয়েছে: সম্পর্কটি বিপরীত হতে পারে: "অভিভাবক শ্রেণি" বা "বিমূর্ত কর্মী" নির্দিষ্ট ইন্টারফেস প্রয়োগকারী কোনও নির্দিষ্ট "শিশু" অবজেক্টগুলিকে একত্রিত করতে পারে + যে কোনও শিশু অন্য কোনও ধরণের পিতামাতার অভ্যন্তরে সেট করা যেতে পারে, যা গ্রহণ করে এটা টাইপ । এবং এখানে অনেকগুলি অবজেক্ট থাকতে পারে, উদাহরণস্বরূপ MergeSort বা কুইকসোর্ট একটি বিমূর্ত প্রয়োগ তুলনা-ইন্টারফেস প্রয়োগকারী যে কোনও অবজেক্টের তালিকা বাছাই করতে পারে। বা এটিকে অন্য উপায়ে বলতে পারেন: "foo ()" প্রয়োগকারী বস্তুর কোনও গ্রুপ এবং অবজেক্টের অন্যান্য গ্রুপ যা "foo ()" থাকা অবজেক্টের ব্যবহার করতে পারে তারা এক সাথে খেলতে পারে।
উত্তরাধিকার ব্যবহারের জন্য তিনটি বাস্তব কারণ সম্পর্কে আমি ভাবতে পারি:
এগুলি যদি সত্য হয়, তবে সম্ভবত উত্তরাধিকার ব্যবহার করা দরকার।
1 কারণ ব্যবহারে খারাপ কিছু নেই, আপনার জিনিসগুলিতে একটি শক্ত ইন্টারফেস থাকা খুব ভাল জিনিস। এটি রচনা ব্যবহার করে বা উত্তরাধিকারের সাথে করা যায়, কোনও সমস্যা নেই - যদি এই ইন্টারফেসটি সহজ হয় এবং পরিবর্তন না হয়। সাধারণত উত্তরাধিকার এখানে বেশ কার্যকর।
কারণটি 2 নম্বর হলে এটি কিছুটা জটিল হয়ে ওঠে। আপনার কি কেবল একই বেস ক্লাসটি ব্যবহার করা দরকার? সাধারণভাবে, কেবল একই বেস ক্লাসটি ব্যবহার করা যথেষ্ট ভাল নয় তবে এটি আপনার কাঠামোর প্রয়োজন হতে পারে, একটি নকশা বিবেচনা যা এড়ানো যায় না।
তবে, আপনি যদি ব্যক্তিগত ভেরিয়েবলগুলি কেস 3 ব্যবহার করতে চান তবে আপনি সমস্যায় পড়তে পারেন। আপনি যদি বিশ্বব্যাপী ভেরিয়েবলগুলি অনিরাপদ বিবেচনা করেন, তবে ব্যক্তিগত ভেরিয়েবলগুলিতেও অনিরাপদ অ্যাক্সেস পেতে উত্তরাধিকার ব্যবহারের কথা বিবেচনা করা উচিত । মনে মনে, গ্লোবাল ভেরিয়েবলগুলি সমস্ত খারাপ নয় - ডাটাবেসগুলি গ্লোবাল ভেরিয়েবলগুলির মূলত বড় সেট। তবে আপনি যদি এটি পরিচালনা করতে পারেন তবে এটি বেশ ভাল।
নতুন প্রোগ্রামারদের জন্য এই দৃষ্টিকোণটি আলাদা দৃষ্টিকোণ থেকে সমাধান করার জন্য:
যখন আমরা অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং শিখি তখন উত্তরাধিকার সূচনা প্রায়ই শিখানো হয়, তাই এটি একটি সাধারণ সমস্যার সহজ সমাধান হিসাবে দেখা হয়।
আমার তিনটি ক্লাস রয়েছে যা সবার কিছু সাধারণ কার্যকারিতা প্রয়োজন। সুতরাং আমি যদি একটি বেস ক্লাস লিখি এবং তাদের সকলকে এটির উত্তরাধিকার সূত্রে প্রাপ্ত করা হয় তবে তাদের সকলের সেই কার্যকারিতা থাকবে এবং আমার কেবল এটি একবারে বজায় রাখা দরকার।
এটি দুর্দান্ত শোনায়, তবে বাস্তবে এটি বেশিরভাগ ক্ষেত্রে এক কারণে প্রায়শই কখনও কাজ করে না:
শেষ পর্যন্ত, আমরা আমাদের কোডটি কিছু শক্ত নটগুলিতে বেঁধে রাখি এবং এর থেকে আর কোনও উপকার পাব না আমরা এই বলে যে "শীতল, আমি উত্তরাধিকার সম্পর্কে শিখেছি এবং এখন আমি এটি ব্যবহার করেছি।" এটাকে ঘৃণ্য করে তোলার অর্থ নয় কারণ আমরা সবাই এটি করে ফেলেছি। কিন্তু আমরা সবাই তা করেছি কারণ কেউই আমাদের তা না বলে বলে।
যখনই কেউ আমাকে "উত্তরাধিকারের পক্ষে অনুকূলকরণের" ব্যাখ্যা করেছেন, আমি প্রতিবারই উত্তরাধিকার ব্যবহার করে ক্লাসগুলির মধ্যে কার্যকারিতা ভাগ করে নেওয়ার চেষ্টা করেছি এবং বুঝতে পেরেছিলাম যে বেশিরভাগ সময় এটি সত্যিকার অর্থে কার্যকর হয় না।
প্রতিষেধক হ'ল একক দায়িত্বের নীতি । এটিকে বাধা হিসাবে ভাবেন। আমার ক্লাসে অবশ্যই একটা জিনিস করা উচিত । আমি অবশ্যই আমার ক্লাসকে এমন একটি নাম দিতে সক্ষম হব যা কোনও একরকম একটি জিনিসকে বর্ণনা করে। (সমস্ত কিছুর ব্যতিক্রম আছে, তবে আমরা যখন শিখছি তখন নিখুঁত নিয়মগুলি কখনও কখনও আরও ভাল হয়)) এটি অনুসরণ করে যে আমি একটি বেস ক্লাস নামে পরিচিত লিখতে পারি না ObjectBaseThatContainsVariousFunctionsNeededByDifferentClasses
। আমার যে স্বতন্ত্র কার্যকারিতা প্রয়োজন তা অবশ্যই তার নিজস্ব শ্রেণিতে থাকতে হবে এবং তারপরে অন্যান্য ক্লাসগুলির যে কার্যকারিতা প্রয়োজন সেই শ্রেণীর উপর নির্ভর করতে পারে, না তা থেকে উত্তরাধিকারী।
ওভার সিম্প্লিফাইটিংয়ের ঝুঁকিতে, এটি রচনা - একসাথে কাজ করার জন্য একাধিক ক্লাস রচনা করা। এবং একবার আমরা সেই অভ্যাসটি গঠন করলে আমরা দেখতে পাই এটি উত্তরাধিকার ব্যবহারের চেয়ে অনেক বেশি নমনীয়, রক্ষণাবেক্ষণযোগ্য এবং পরীক্ষামূলক।
এর বাইরে / এর বিবেচনা রয়েছে, আপনার অবজেক্টের উত্তরাধিকারের "গভীরতা" বিবেচনা করতে হবে। উত্তরাধিকারের পাঁচ বা ছয় স্তরের বেশি কিছু অপ্রত্যাশিত ingালাই এবং বক্সিং / আনবক্সিং সমস্যার কারণ হতে পারে এবং সেই ক্ষেত্রে এর পরিবর্তে আপনার অবজেক্টটি রচনা করা বুদ্ধিমানের কাজ হতে পারে।
যখন আপনি একটি -একটি হল দুটি ক্লাস (উদাহরণস্বরূপ কুকুর একটি কুকুরের হয়) মধ্যে সম্পর্ক, আপনি উত্তরাধিকার জন্য যান।
অন্যদিকে আপনি যদি গেছে-একটি দুই শ্রেণীর মধ্যে অথবা কিছু বিশেষণ সম্পর্ক (ছাত্র কোর্স আছে) অথবা (শিক্ষক স্টাডিজ কোর্সে), আপনি রচনা বেছে নেওয়া হয়েছে।
এটি বোঝার একটি সহজ উপায় হ'ল উত্তরাধিকারটি যখন আপনার ক্লাসের কোনও অবজেক্টের প্রয়োজন হয় তার অভিভাবক শ্রেণীর সাথে একই ইন্টারফেস রাখার জন্য এটি ব্যবহার করা উচিত, যাতে এটির মাধ্যমে প্যারেন্ট ক্লাসের অবজেক্ট হিসাবে গণ্য করা যায় (উপকৃতকরণ) । তদ্ব্যতীত, উত্পন্ন শ্রেণীর অবজেক্টে ফাংশন কলগুলি কোডের সর্বত্রই থাকবে তবে কল করার জন্য নির্দিষ্ট পদ্ধতিটি রানটাইমে নির্ধারিত হবে (অর্থাত্ নিম্ন-স্তরের প্রয়োগটি পৃথক, উচ্চ স্তরের ইন্টারফেস একই থাকবে)।
যখন আপনার একই ইন্টারফেসের জন্য নতুন ক্লাসের প্রয়োজন না হয় তখন রচনাটি ব্যবহার করা উচিত, অর্থাত আপনি শ্রেণীর প্রয়োগের কিছু দিক গোপন করতে চান যা সম্পর্কে class শ্রেণীর ব্যবহারকারীর জানা উচিত নয়। সুতরাং রচনাটি এনক্যাপসুলেশনকে সমর্থন করার পথে আরও বেশি (অর্থাত্ প্রয়োগটি গোপন করা), যখন উত্তরাধিকার বলতে বিমূর্ততা সমর্থন করে (অর্থাত্ কোনও কিছুর সরল উপস্থাপনা প্রদান করা হয়, এক্ষেত্রে বিভিন্ন ইন্টার্নাল সহ বিভিন্ন ধরণের জন্য একই ইন্টারফেস)।
সাবটাইপিং উপযুক্ত এবং আরও শক্তিশালী যেখানে আক্রমণকারীদের গণনা করা যায় , অন্যথায় এক্সটেনসিবিলিটির জন্য ফাংশন রচনাটি ব্যবহার করুন।
আমি @ পাভেলের সাথে একমত, যখন তিনি বলেছেন, রচনার জন্য জায়গা আছে এবং উত্তরাধিকারের জন্য জায়গা রয়েছে।
আমি মনে করি উত্তরাধিকার ব্যবহার করা উচিত যদি আপনার উত্তর এই প্রশ্নের যে কোনও একটিতে সত্যিকই হয়।
তবে, যদি আপনার উদ্দেশ্যটি নিখুঁতভাবে কোড পুনরায় ব্যবহারের হয় তবে কমপোজিশনটি সম্ভবত আরও ভাল ডিজাইনের পছন্দ।
কোড পুনরায় ব্যবহারের জন্য উত্তরাধিকার হ'ল একটি খুব পাওয়ারফুল ম্যাচানিজম। তবে সঠিকভাবে ব্যবহার করা দরকার। আমি বলব যে উত্তরাধিকার সঠিকভাবে ব্যবহৃত হয় যদি সাবক্লাসটিও মূল শ্রেণীর একটি সাব টাইপ হয়। উপরে উল্লিখিত হিসাবে, লিসকভ সাবস্টিটিউশন নীতিমালা এখানে মূল বিষয়।
সাবক্লাস সাব টাইপের মতো নয়। আপনি সাবক্ল্যাসগুলি তৈরি করতে পারেন যা উপপ্রকার নয় (এবং এটি যখন আপনার রচনা ব্যবহার করা উচিত)। সাব টাইপ কী তা বোঝার জন্য আসুন কোন প্রকারটি কী তা ব্যাখ্যা দেওয়া শুরু করুন।
যখন আমরা বলি যে 5 নম্বরটি সংখ্যার টাইপ, তখন আমরা উল্লেখ করছি যে 5টি সম্ভাব্য মানের একটি সংখ্যার (উদাহরণস্বরূপ, জাভা আদিম ধরণের সম্ভাব্য মানগুলি দেখুন)। আমরা আরও উল্লেখ করছি যে সংযোজন এবং বিয়োগের মতো মানের জন্য আমি কার্যকর করতে পারি এমন পদ্ধতিগুলির একটি বৈধ সেট রয়েছে। এবং পরিশেষে আমরা উল্লেখ করছি যে এখানে এমন বৈশিষ্ট্যের একটি সেট রয়েছে যা সর্বদা সন্তুষ্ট থাকে, উদাহরণস্বরূপ, আমি যদি 3 এবং 5 এর মানগুলি যোগ করি তবে আমি ফলস্বরূপ 8 পেয়ে যাব।
অন্য উদাহরণ দেওয়ার জন্য, বিমূর্ত ডেটা প্রকারগুলি, পূর্ণসংখ্যার সেট এবং পূর্ণসংখ্যার তালিকা সম্পর্কে চিন্তা করুন, তারা যে মানগুলি ধরে রাখতে পারে তা পূর্ণসংখ্যার মধ্যে সীমাবদ্ধ। তারা উভয় পদ্ধতির একটি সেট সমর্থন করে, যেমন অ্যাড (নিউভ্যালু) এবং আকার ()। এবং তাদের উভয়েরই আলাদা আলাদা বৈশিষ্ট্য রয়েছে (শ্রেণি আক্রমণকারী), সেটগুলি সদৃশগুলিকে নকল করতে দেয় না যখন তালিকাটি সদৃশগুলিকে অনুমতি দেয় না (অবশ্যই সেখানে অন্যান্য বৈশিষ্ট্য রয়েছে যা তারা উভয়ই সন্তুষ্ট করে)।
সাব টাইপ হ'ল একটি প্রকার, যা অন্য প্রকারের সাথে সম্পর্কিত, যার নাম প্যারেন্ট টাইপ (বা সুপার টাইপ)। সাব টাইপ অবশ্যই পিতামাতার ধরণের বৈশিষ্ট্য (মান, পদ্ধতি এবং বৈশিষ্ট্য) সন্তুষ্ট করতে হবে। সম্পর্কের অর্থ হ'ল যে কোনও প্রসঙ্গে যেখানে সুপার টাইপ আশা করা হয়, মৃত্যুদন্ড কার্যকর করার আচরণকে প্রভাবিত না করেই এটি একটি সাব টাইপ দ্বারা প্রতিস্থাপক হতে পারে। আমি যা বলছি তার উদাহরণ দিয়ে কিছু কোড দেখতে যাই। ধরুন আমি পূর্ণসংখ্যার একটি তালিকা লিখছি (কোনওভাবে ছদ্ম ভাষাতে):
class List {
data = new Array();
Integer size() {
return data.length;
}
add(Integer anInteger) {
data[data.length] = anInteger;
}
}
তারপরে, আমি পূর্ণসংখ্যার তালিকার একটি সাবক্লাস হিসাবে পূর্ণসংখ্যার সেট লিখি:
class Set, inheriting from: List {
add(Integer anInteger) {
if (data.notContains(anInteger)) {
super.add(anInteger);
}
}
}
আমাদের পূর্ণসংখ্যা শ্রেণীর সেটটি পূর্ণসংখ্যার তালিকার একটি সাবক্লাস, তবে এটি একটি সাব-টাইপ নয়, কারণ এটি তালিকা শ্রেণীর সমস্ত বৈশিষ্ট্য সন্তুষ্ট করে না। মানগুলি, এবং পদ্ধতিগুলির স্বাক্ষর সন্তুষ্ট তবে বৈশিষ্ট্যগুলি নেই। পিতামাতার ধরণের বৈশিষ্ট্য সংরক্ষণ না করে অ্যাড (পূর্ণসংখ্যা) পদ্ধতির আচরণটি পরিষ্কারভাবে পরিবর্তিত হয়েছে। আপনার ক্লাসগুলির ক্লায়েন্টের দৃষ্টিকোণ থেকে চিন্তা করুন। তারা পূর্ণসংখ্যার একটি সেট পেতে পারে যেখানে পূর্ণসংখ্যার একটি তালিকা প্রত্যাশিত। ক্লায়েন্ট কোনও মান যুক্ত করতে এবং সেই মানটি তালিকায় যুক্ত করতে চাইলেও তালিকাতে মানটি ইতিমধ্যে বিদ্যমান থাকলেও। তবে মানটি উপস্থিত থাকলে তার আচরণটি পাবে না। তার জন্য বড় অবাক!
উত্তরাধিকারের অনুপযুক্ত ব্যবহারের এটি সর্বোত্তম উদাহরণ। এই ক্ষেত্রে রচনা ব্যবহার করুন।
(এর একটি খণ্ড: উত্তরাধিকার সঠিকভাবে ব্যবহার করুন )।
আমি শুনেছি থাম্বের একটি নিয়ম হ'ল উত্তরাধিকার যখন একটি "হ'ল-এ" হয় তখন সম্পর্ক এবং রচনা তৈরি করা উচিত। এমনকি এটির সাথেও আমি অনুভব করি যে আপনার সবসময় সংমিশ্রণের দিকে ঝুঁকতে হবে কারণ এটি প্রচুর জটিলতা দূর করে।
রচনা v / s উত্তরাধিকার বিস্তৃত বিষয় subject এর চেয়ে ভাল কিসের সত্যিকারের কোনও উত্তর নেই কারণ আমি মনে করি এটি সবই সিস্টেমের ডিজাইনের উপর নির্ভর করে।
সাধারণত বস্তুর মধ্যে সম্পর্কের ধরণগুলির মধ্যে একটি চয়ন করার জন্য আরও ভাল তথ্য সরবরাহ করে।
যদি সম্পর্কের ধরণটি "আইএস-এ" সম্পর্ক হয় তবে উত্তরাধিকার হ'ল উত্তম পদ্ধতির। অন্যথায় সম্পর্কের ধরণটি "এইচএএস-এ" সম্পর্কিত হয় তবে রচনাটি আরও ভালভাবে এগিয়ে আসবে।
এটি সম্পূর্ণরূপে সত্তার সম্পর্কের উপর নির্ভর করে।
যদিও রচনা পছন্দ করা হয়, আমি অনুকূল হাইলাইট করতে চাই উত্তরাধিকার এবং কনস রচনা ।
উত্তরাধিকার পেশাদার:
এটি একটি যৌক্তিক " আইএস এ" সম্পর্ক স্থাপন করে। তাহলে গাড়ি এবং ট্রাক দুই ধরনের হয় যানবাহন (বেস বর্গ), শিশু শ্রেণী একটা IS বেস বর্গ।
অর্থাত
গাড়ি একটি যানবাহন
ট্রাক একটি যানবাহন
উত্তরাধিকারের সাথে, আপনি একটি সক্ষমতা সংজ্ঞা / পরিবর্তন / প্রসারিত করতে পারেন
রচনা সংক্রান্ত ধারণা:
যেমন যদি গাড়ি রয়েছে যানবাহন এবং আপনার মূল্যের পেতে আছে যদি গাড়ি , যা সংজ্ঞায়িত করা হয়েছে যানবাহন , আপনার কোডটির এই কেমন হবে
class Vehicle{
protected double getPrice(){
// return price
}
}
class Car{
Vehicle vehicle;
protected double getPrice(){
return vehicle.getPrice();
}
}
অনেক লোক যেমন বলেছিল, আমি প্রথমে চেকটি দিয়ে শুরু করব - "ইস-এ" সম্পর্ক আছে কিনা। এটি উপস্থিত থাকলে আমি সাধারণত নিম্নলিখিতগুলি পরীক্ষা করে দেখি:
বেস ক্লাস ইনস্ট্যান্ট করা যায় কিনা। অর্থাৎ বেস ক্লাসটি নন-অ্যাবস্ট্রাক্ট হতে পারে কিনা। যদি এটি অ-বিমূর্ত হতে পারে তবে আমি সাধারণত রচনা পছন্দ করি
উদাঃ 1. হিসাবরক্ষক একজন কর্মচারী। তবে আমি করব না উত্তরাধিকার ব্যবহার কারণ কোনও কর্মচারী বস্তু তাত্ক্ষণিকভাবে চালু করা যেতে পারে।
উদাহরণস্বরূপ 2. বই একটি বিক্রয় আইটেম। একটি সেলিং আইটেম ইনস্ট্যান্ট করা যায় না - এটি বিমূর্ত ধারণা। সুতরাং আমি উত্তরাধিকারী ব্যবহার করব। সেলিংআইটম একটি বিমূর্ত বেস ক্লাস (বা ইন্টারফেস) সি # তে )
আপনি এই পদ্ধতির সম্পর্কে কি মনে করেন?
এছাড়াও, আমি উত্তর উত্তরকে সমর্থন করি কেন উত্তরাধিকার আদৌ ব্যবহার করবেন?
উত্তরাধিকার ব্যবহারের মূল কারণটি কোনও রচনার ফর্ম হিসাবে নয় - এটি তাই আপনি বহুবর্ষজীবী আচরণ পেতে পারেন। আপনার যদি পলিমারফিজম না লাগে তবে আপনার সম্ভবত উত্তরাধিকার ব্যবহার করা উচিত নয়।
@MatthieuM। /software/12439/code-smell-inheritance-abuse/12448#comment303759_12448 এ বলেছেন
উত্তরাধিকারের বিষয়টি হ'ল এটি দুটি অर्थোগোনাল উদ্দেশ্যে ব্যবহার করা যেতে পারে:
ইন্টারফেস (বহুবিজ্ঞানের জন্য)
বাস্তবায়ন (কোড পুনরায় ব্যবহারের জন্য)
REFERENCE,
আমি দেখতে পাচ্ছি না যে কেউ হীরা সমস্যার উল্লেখ করেছে , যা উত্তরাধিকার নিয়ে উত্থাপিত হতে পারে।
এক নজরে, যদি ক্লাস বি এবং সি এ এবং উভয় ওভাররাইড পদ্ধতি এক্স, এবং চতুর্থ শ্রেণির ডি উত্তরাধিকার সূত্রে বি এবং সি উভয় থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং এক্সকে ওভাররাইড না করে তবে এক্সডের কোন প্রয়োগটি ব্যবহার করার কথা?
উইকিপিডিয়া এই প্রশ্নে আলোচিত বিষয়টির একটি সুন্দর ওভারভিউ সরবরাহ করে।