উত্তরাধিকার উপর রচনা কিন্তু


13

আমি নিজেকে সফটওয়্যার ইঞ্জিনিয়ারিং শেখানোর চেষ্টা করছি এবং এমন কিছু বিবাদী তথ্যের বিরুদ্ধে আসছি যা আমাকে বিভ্রান্ত করছে।

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

সুতরাং আমার প্রশ্ন ... আমি কি বিমূর্ত ক্লাস এবং ইন্টারফেস ব্যবহার না করার কথা? একটি বিমূর্ত শ্রেণি তৈরি এবং কংক্রিট ক্লাসে যে বিমূর্ত শ্রেণীর কার্যকারিতা প্রসারিত / উত্তরাধিকারী না করার জন্য, এবং পরিবর্তে, কেবলমাত্র অন্য শ্রেণীর কার্যকারিতাটি ব্যবহার করার জন্য নতুন অবজেক্ট রচনা করুন?

বা, আমার রচনাটি ব্যবহার করার এবং অ্যাবস্ট্রাক্ট ক্লাস থেকে উত্তরাধিকারী হওয়ার কথা রয়েছে; একে অপরের সাথে একযোগে উভয় ব্যবহার? যদি তা হয় তবে কীভাবে এটি কার্যকর হবে এবং এর সুবিধা কীভাবে তার কয়েকটি উদাহরণ আপনি সরবরাহ করতে পারেন?

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


2
"উত্তরাধিকারের উপরে ফেভারিট কমপোজেশন" একটি নির্বোধ ধারণা যা ঠিক "তাত্পর্যপূর্ণ ড্রিলগুলির পক্ষে কর আদায়" এর মতোই বোধগম্য। এগুলি দুটি পৃথক সরঞ্জাম যা দুটি পৃথক ব্যবহারের ক্ষেত্রে ব্যবহারের জন্য উপযুক্ত এবং আপনি যে কোনও সময় আন্তঃআমোটভাবে ব্যবহার করতে পারবেন তা আসলে খুব বিরল rare
ম্যাসন হুইলার

2
"এক্স ওভার ওয়াই ওয়াই" এর অর্থ এই নয় যে কখনই ওয়াই ব্যবহার করবেন না, এক্স আরও ভাল হবে কিনা তা নিয়ে একবার ভাবুন
রিচার্ড টিঙ্গল

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

1
@ ম্যাসনভিয়েল, উত্তরাধিকারের জন্য কোনও বৈধ ব্যবহারের মামলা নেই। এটি "গোটো" হিসাবে একটি বৈশিষ্ট্য অন্তত "দুষ্ট" হিসাবে।
ডেভিড আরনো

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

উত্তর:


19

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

উত্তরাধিকার পুনরায় ব্যবহারের পরিস্থিতিগুলির সাথে ডিল করার ভাল ডিফল্ট উপায় নয় কারণ আপনি প্রায়শই বেস ক্লাসের ফিশনিটিলিটির একটি অংশ ব্যবহার করতে চান এবং সাবক্লাসটি বেস ক্লাসের পুরো চুক্তিকে এমনভাবে সমর্থন করতে পারে না যে লিসকভের প্রতিস্থাপনাকে সন্তুষ্ট করে in নীতি

উত্তরাধিকার যথাযথ যেখানে ক্ষেত্রে টেম্পলেট পদ্ধতি একটি ভাল উদাহরণ।

রচনা এবং উত্তরাধিকারের মধ্যে কীভাবে চয়ন করতে হয় তার নির্দেশিকাগুলির জন্য এই উত্তরটি দেখুন ।


+1 দেখানোর জন্য যে কোনও শ্রেণির আংশিক পুনঃব্যবহারের ক্ষেত্রে, অব্যবহৃত অংশটি উত্তরাধিকারের চেয়ে রচনার সাথে আরও পরিষ্কারভাবে উপেক্ষা করা হয়।
লরেন্স

4

আপনাকে সেই ভাষায় দৃ concrete় উদাহরণ দেওয়ার জন্য আমি পিএইচপি-র সাথে যথেষ্ট পরিচিত নই, তবে এখানে কয়েকটি গাইডলাইন রয়েছে যা আমি কার্যকর পেয়েছি।

ইন্টারফেস / বৈশিষ্ট্যগুলি অনেকগুলি শ্রেণীর মধ্যে আচরণ সংজ্ঞা দেওয়ার জন্য দরকারী যা খুব কম অন্যরকম হতে পারে।

উদাহরণস্বরূপ, আপনি যদি কোনও JSON এপিআই-তে কাজ করছেন, আপনি একটি ইন্টারফেসটি সংজ্ঞায়িত করতে পারেন যা দুটি পদ্ধতি নির্দিষ্ট করে: "টোজেসন" এবং "টুস্ট্যাটাসকোড"। এটি আপনাকে এমন কোনও সহায়ক লেখার অনুমতি দেয় যা এই ইন্টারফেসটি প্রয়োগ করে এমন কোনও বস্তু নিতে পারে এবং এটি একটি এইচটিপি প্রতিক্রিয়াতে রূপান্তর করে।

বেশিরভাগ সময়, এটি সরাসরি উত্তরাধিকারের চেয়ে বেশি পছন্দনীয়, কারণ এটি ভঙ্গুর বেস শ্রেণির সমস্যায় ভুগার সম্ভাবনা কম থাকে, কারণ এটি অগভীর শ্রেণীর শ্রেণিবিন্যাসের দিকে ঝোঁক।

বাধ্যতামূলক কারণ না থাকলে যদি না করণীয় করার জন্য বাধ্যতামূলক কারণ থাকে তবে ডাইরেক্ট হেরিরিটেন্সকে আপনি এমন কিছু হিসাবে বিবেচনা করা ভাল।

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

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

যতটা সম্ভব গ্লোবাল সিঙ্গলটনের সাথে কাজ করা থেকে বিরত থাকুন, যেমন প্রত্যাশিত এবং প্রকৃত আউটপুট তুলনা করা যদি সঠিকভাবে ব্যথা হয় তবে আউটপুটটির কিছু অংশ সিস্টেমের ঘড়ির অবস্থার উপর নির্ভর করে।

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


1

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

সুতরাং, উদাহরণস্বরূপ, যদি আপনার কাছে কোনও শ্রেণি থাকে যা কোনও জাহাজের মডেল করে, এবং এখন আপনাকে বলা হচ্ছে যে আপনার জাহাজটি হেলিপ্যাড সরবরাহ করবে, পরিবর্তে আপনার জাহাজটি হেলিপ্যাড থেকে নেওয়া (স্বাভাবিক), আপনার উচিত হবে আপনার জাহাজে হেলিপ্যাড শ্রেণি রয়েছে এবং এটি কোনও Ship.getHelipad()পদ্ধতির মাধ্যমে প্রকাশ করে ।

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

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

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

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

জাহাজের উদাহরণে ফিরে যেতে, যদি আপনার জাহাজটির সাথে ইন্টারঅ্যাক্ট করার জন্য কোনও ইন্টারফেসের প্রয়োজন হয় FloatingMachine, তবে এটি একটি বিমূর্ত FloatingMachineশ্রেণীর কাছ থেকে নেওয়া আরও স্বাভাবিক , সম্ভবত এটি সম্ভবত অন্য বিমূর্ত Machineশ্রেণীর কাছ থেকে নেওয়া হতে পারে ।

রচনা বনাম উত্তরাধিকার প্রশ্নের উত্তরের জন্য এখানে থাম্বের বিধি রয়েছে:

আমার ক্লাসটির যে ইন্টারফেসটি প্রকাশ করতে হবে তার সাথে "একটি" সম্পর্ক রয়েছে? যদি হ্যাঁ, উত্তরাধিকার ব্যবহার করুন। যদি না হয়, রচনা ব্যবহার করুন।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.