কেন জাভা উত্তরাধিকার "প্রসারিত" এড়ানো


40

জামে গোসলিং ড

"যখনই সম্ভব আপনার প্রয়োগের উত্তরাধিকার এড়ানো উচিত” "

এবং পরিবর্তে, ইন্টারফেস উত্তরাধিকার ব্যবহার করুন।

কিন্তু কেন? কীভাবে "প্রসারিত" শব্দটি ব্যবহার করে কোনও বস্তুর কাঠামো উত্তরাধিকার সূত্রে আমরা এড়াতে পারি এবং একই সাথে আমাদের কোড অবজেক্ট ওরিয়েন্টেডও করতে পারি?

কেউ কি দয়া করে "বইয়ের দোকানে বইয়ের অর্ডার দেওয়ার মতো" দৃশ্যে এই ধারণাটি বর্ণনা করে কোনও অবজেক্ট ওরিয়েন্টেড উদাহরণ দিতে পারেন?



সমস্যা হ'ল আপনি কেবল একটি শ্রেণি প্রসারিত করতে পারেন ।

উত্তর:


38

গসলিং প্রসারিত কীওয়ার্ড ব্যবহার এড়াতে বলেন নি ... তিনি কেবল কোড পুনরায় ব্যবহার অর্জনের উপায় হিসাবে উত্তরাধিকার ব্যবহার করবেন না বলেছিলেন।

উত্তরাধিকার প্রতি সেজে খারাপ নয় এবং ও স্ট্রাকচার তৈরিতে ব্যবহার করার জন্য একটি খুব শক্তিশালী (প্রয়োজনীয়) সরঞ্জাম। তবে যখন সঠিকভাবে ব্যবহার না করা হয় (এটি যখন অবজেক্ট স্ট্রাকচার তৈরির পরিবর্তে অন্য কোনও কিছুর জন্য ব্যবহৃত হয় ) এটি এমন কোড তৈরি করে যা খুব শক্তভাবে মিলিত এবং বজায় রাখা খুব শক্ত।

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

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

--- সম্পাদনা করুন এই উত্তরটি আরও সাধারণ পদে প্রশ্নের উত্তর দিতে বেশ ভাল যুক্তি দেয়।


3
(বাস্তবায়ন) উত্তরাধিকার ও কাঠামো তৈরির জন্য প্রয়োজনীয় নয় । এটি ছাড়া আপনার একটি ওও ভাষা থাকতে পারে।
আন্দ্রেস এফ।

আপনি একটি উদাহরণ দিতে পারেন? উত্তরাধিকার ব্যতীত আমি কখনই দেখিনি।
নিউটোপিয়ান

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

9

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

ব্যতীত, এটি সত্যই বিনামূল্যে ছিল না। ফলটি হ'ল হিরা-আকৃতির উত্তরাধিকারী গাছগুলি সহ যেগুলি হ্যান্ডেল করা কঠিন ছিল তা সহ চূড়ান্তভাবে সংশ্লেষিত উত্তরাধিকারের স্তরক্রম ছিল understand এটি জাভার ডিজাইনারগণ ক্লাসের একাধিক উত্তরাধিকারকে সমর্থন না করার কারণটির একটি অংশ part

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


6

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


5

কারণ আপনি কেবল একটি শ্রেণি প্রসারিত করতে পারবেন, যখন আপনি অনেকগুলি ইন্টারফেস প্রয়োগ করতে পারেন।

আমি একবার শুনেছি উত্তরাধিকার আপনি কী তা সংজ্ঞায়িত করে তবে ইন্টারফেসগুলি আপনার ভূমিকা পালন করতে পারে এমন একটি ভূমিকা সংজ্ঞায়িত করে।

ইন্টারফেসগুলি পলিমারফিজমের আরও ভাল ব্যবহারের অনুমতি দেয়।

এটি কারণ হতে পারে।


ডাউনটা কেন?
মাহমুদ হোসাম

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

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

1

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

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

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

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

উত্তরাধিকারের উপর ইন্টারফেস ব্যবহার করার বৃহত্তম কারণটি প্রয়োগের কোডটি ডিকোপলিং মনে হয় না তবে উত্তরাধিকার যে এটি এখনও খুব কার্যকর তাই মন্দ বলে মনে করবেন না।


2
"আপনি কেবল 1 শ্রেণি প্রসারিত করতে পারেন তবে অনেক ইন্টারফেস প্রয়োগ করতে পারেন" এটি জাভা পাশাপাশি সি # এর ক্ষেত্রেও সত্য।
হতাশ

কোড সদৃশ সমস্যার একটি সম্ভাব্য সমাধান হ'ল একটি বিমূর্ত শ্রেণি তৈরি করা যা ইন্টারফেস প্রয়োগ করে এবং এটি প্রসারিত করে। যত্ন সহ ব্যবহার করুন, যদিও; এখানে কয়েকটি মাত্র ঘটনা আমি দেখেছি যে এটি বোধগম্য।
মাইকেল কে

0

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


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