রচনাটিকে প্রাধান্য দেওয়া কেবল পলিমারফিজম সম্পর্কে নয়। যদিও এটি এরই একটি অংশ এবং আপনি ঠিক বলেছেন যে (কমপক্ষে নামমাত্র টাইপ করা ভাষাগুলিতে) লোকেরা আসলে যা বোঝায় তা হল "রচনা এবং ইন্টারফেস বাস্তবায়নের সংমিশ্রণ পছন্দ করুন।" তবে, রচনাটি পছন্দ করার কারণগুলি (অনেক পরিস্থিতিতে) গভীর ound
পলিমারফিজম হল এক জিনিস যা একাধিক উপায়ে আচরণ করে। সুতরাং, জেনেরিক্স / টেমপ্লেটগুলি এখন পর্যন্ত একটি "পলিমারফিক" বৈশিষ্ট্য হিসাবে তারা একক কোডের কোডের সাথে তার আচরণের ধরনগুলিকে বিভিন্ন ধরণের পরিবর্তিত করতে দেয়। প্রকৃতপক্ষে, এই ধরণের পলিমারফিজমটি সত্যই সেরা আচরণ করা হয় এবং সাধারণত প্যারামিটারিক পলিমারফিজম হিসাবে পরিচিত কারণ পার্থক্যটি একটি পরামিতি দ্বারা সংজ্ঞায়িত করা হয়।
অনেকগুলি ভাষা "ওভারলোডিং" বা অ্যাডহক পলিমারফিজম নামে একটি বহুবচন রূপ দেয় যেখানে একই নামের একাধিক প্রক্রিয়াটি একটি স্বতন্ত্র পদ্ধতিতে সংজ্ঞায়িত করা হয় এবং যেখানে ভাষাটি বেছে নেওয়া হয় (সম্ভবত সবচেয়ে নির্দিষ্ট)। এটি সর্বনিম্ন ভাল আচরণ করা ধরণের বহুবর্ষ, কারণ উন্নত সম্মেলন ব্যতীত দুটি পদ্ধতির আচরণকে কিছুই সংযুক্ত করে না।
তৃতীয় ধরণের পলিমারফিজম হ'ল সাব টাইপ পলিমারফিজম । এখানে একটি প্রদত্ত প্রকারের উপর সংজ্ঞায়িত একটি পদ্ধতিও সেই ধরণের "সাব টাইপস" এর পুরো পরিবারে কাজ করতে পারে। আপনি যখন কোনও ইন্টারফেস বাস্তবায়ন করেন বা কোনও শ্রেণি প্রসারিত করেন আপনি সাধারণত একটি সাব-টাইপ তৈরির উদ্দেশ্যে আপনার ইচ্ছার ঘোষণা দিচ্ছেন। সত্য উপ-প্রকারগুলি লিসকোভের সাবস্টিটিউশন নীতি দ্বারা পরিচালিত হয়, যা বলে যে আপনি যদি সুপারটাইপের সমস্ত বিষয় সম্পর্কে কিছু প্রমাণ করতে পারেন তবে আপনি এটি উপ-টাইপের সমস্ত দৃষ্টান্ত সম্পর্কে প্রমাণ করতে পারেন। জীবন যদিও বিপজ্জনক হয়ে ওঠে, যেহেতু সি ++ এবং জাভা-র মতো ভাষায়, লোকেরা সাধারণত অবিবাহিত থাকে এবং প্রায়শই ক্লাস সম্পর্কে অনুচ্চারিত অনুমান যা তাদের সাবক্লাস সম্পর্কে সত্য বা নাও হতে পারে। এটি হ'ল কোডটি এমনভাবে লেখা হয় যেন এটি সত্যিকারের চেয়ে আরও প্রবণতাযুক্ত, যা আপনি যখন অযত্নে সাবস্ক্রাইব করেন তখন ইস্যুগুলির পুরো হোস্ট তৈরি করে।
উত্তরাধিকার পলিমারফিজম থেকে প্রকৃতপক্ষে স্বাধীন। "টি" এমন কিছু জিনিস দেওয়া হয়েছে যার সাথে নিজের একটি রেফারেন্স রয়েছে, উত্তরাধিকার ঘটে যখন আপনি "টি" থেকে "এস" এর পরিবর্তে "টি" এর রেফারেন্সটি "এস" এর একটি রেফারেন্সের সাথে প্রতিস্থাপন করে নতুন জিনিস "এস" তৈরি করেন। এই সংজ্ঞাটি ইচ্ছাকৃতভাবে অস্পষ্ট, যেহেতু উত্তরাধিকার অনেক পরিস্থিতিতে ঘটতে পারে তবে সবচেয়ে সাধারণ হ'ল একটি বস্তুকে সাবক্লাসিং করা হয় যা this
ভার্চুয়াল ফাংশনগুলি দ্বারা ডাকা পয়েন্টারকে পয়েন্টারটির সাথে সাব টাইপের সাথে প্রতিস্থাপনের প্রভাব this
রাখে।
উত্তরাধিকার হ'ল একটি বিপজ্জনক যেমন সমস্ত খুব শক্তিশালী জিনিসের উত্তরাধিকার হ'ল সর্বনাশ করার ক্ষমতা রয়েছে। উদাহরণস্বরূপ, ধরুন আপনি কোনও শ্রেণি থেকে উত্তরাধিকার সূত্রে কোনও পদ্ধতিকে ওভাররাইড করেছেন: শ্রেণীর কোনও অন্য পদ্ধতি নির্দিষ্ট পদ্ধতিতে আচরণ করার জন্য আপনি যে পদ্ধতিটি উত্তরাধিকারসূত্রে গ্রহণ না করে তা ধরে না নেওয়া পর্যন্ত সর্বোপরি মূল শ্রেণীর লেখক এটি কীভাবে ডিজাইন করেছিলেন? । আপনার অন্য কোন পদ্ধতিতে ব্যক্তিগত বা অ-ভার্চুয়াল (চূড়ান্ত) দ্বারা ডাকা সমস্ত পদ্ধতি ঘোষণা করে আপনি আংশিকভাবে এটির বিরুদ্ধে সুরক্ষা রাখতে পারবেন, যদি না সেগুলি ওভাররাইড করার জন্য নকশাকৃত হয়। যদিও এটি সর্বদা যথেষ্ট ভাল না। কখনও কখনও আপনি এর মতো কিছু দেখতে পাবেন (সিউডো জাভাতে, আশা করি সি ++ এবং সি # ব্যবহারকারীদের কাছে পাঠযোগ্য)
interface UsefulThingsInterface {
void doThings();
void doMoreThings();
}
...
class WayOfDoingUsefulThings implements UsefulThingsInterface{
private foo stuff;
public final int getStuff();
void doThings(){
//modifies stuff, such that ...
...
}
...
void doMoreThings(){
//ignores stuff
...
}
}
আপনি মনে করেন এটি সুন্দর, এবং "জিনিস" করার নিজস্ব নিজস্ব পদ্ধতি রয়েছে তবে আপনি "মোর থিংস" করার ক্ষমতা অর্জনের জন্য উত্তরাধিকার ব্যবহার করেন,
class MyUsefulThings extends WayOfDoingUsefulThings{
void doThings {
//my way
}
}
এবং সব ভাল এবং ভাল। WayOfDoingUsefulThings
এমনভাবে নকশা করা হয়েছিল যে একটি পদ্ধতি প্রতিস্থাপন করা অন্য কোনও শব্দার্থের পরিবর্তন করে না ... অপেক্ষা বাদে, না এটি ছিল না। দেখে মনে হচ্ছে এটি ঠিক আছে, তবে doThings
পরিবর্তিত পরিবর্তনীয় অবস্থা যা গুরুত্বপূর্ণ। সুতরাং, যদিও এটি কোনও ওভাররাইড-সক্ষম ফাংশনগুলি কল করে নি,
void dealWithStuff(WayOfDoingUsefulThings bar){
bar.doThings()
use(bar.getStuff());
}
আপনি যখন এটি পাস করেন এখন প্রত্যাশার চেয়ে আলাদা কিছু করে MyUsefulThings
। সবচেয়ে খারাপ, আপনি এমনকি জানেন না যে WayOfDoingUsefulThings
এই প্রতিশ্রুতি করেছে। সম্ভবত dealWithStuff
একই লাইব্রেরি থেকে এসেছে WayOfDoingUsefulThings
এবং getStuff()
এটি লাইব্রেরি দ্বারা রফতানি করা হয়নি ( সি ++ এর বন্ধু ক্লাসগুলির কথা ভাবেন )। তীব্রতর হলেও, আপনি ভাষাটির স্থিতিশীল চেকগুলি অনুধাবন না করেই পরাজিত করেছেন: এটির কোনও নির্দিষ্ট পদ্ধতিতে আচরণ এমন কোনও ফাংশন থাকবে তা নিশ্চিত করার জন্য ন্যায়বিচার dealWithStuff
গ্রহণ করেছিলেন ।WayOfDoingUsefulThings
getStuff()
রচনা ব্যবহার করে
class MyUsefulThings implements UsefulThingsInterface{
private way = new WayOfDoingUsefulThings()
void doThings() {
//my way
}
void doMoreThings() {
this.way.doMoreThings();
}
}
স্থির ধরণের সুরক্ষা ফিরিয়ে আনে। সাধারণ রচনাতে সাব টাইপিং বাস্তবায়নের সময় উত্তরাধিকারের চেয়ে ব্যবহার করা সহজ এবং নিরাপদ। এটি আপনাকে চূড়ান্ত পদ্ধতিগুলিকে ওভাররাইড করতে দেয় যার অর্থ হল যে সময়কালের বেশিরভাগ অংশের ইন্টারফেসগুলি বাদে সবকিছু চূড়ান্ত / অ-ভার্চুয়াল হিসাবে নির্দ্বিধায় আপনার প্রকাশ করা উচিত ।
আরও উন্নত বিশ্বের ভাষায় কোনও delegation
কীওয়ার্ড সহ স্বয়ংক্রিয়ভাবে বয়লারপ্লেট প্রবেশ করানো হত । সর্বাধিক না, তাই একটি খারাপ দিক বড় ক্লাস হয়। যদিও, আপনি আপনার আইডিই আপনার জন্য ডেলিগেশন উদাহরণ লিখতে পেতে পারেন।
এখন, জীবন কেবল পলিমারফিজম সম্পর্কে নয়। আপনার সব সময় সাব টাইপ করার দরকার নেই। পলিমারফিজমের লক্ষ্যটি সাধারণত কোডের পুনঃব্যবহার হয় তবে এটি লক্ষ্য অর্জনের একমাত্র উপায় নয়। প্রায়শই সময়, কার্যকারিতা পরিচালনার উপায় হিসাবে সাব টাইপ পলিমॉर्फিজম ছাড়াই রচনাটি ব্যবহার করা বোধগম্য।
এছাড়াও, আচরণগত উত্তরাধিকার এর ব্যবহার রয়েছে। এটি কম্পিউটার বিজ্ঞানের অন্যতম শক্তিশালী ধারণা। এটি কেবলমাত্র, বেশিরভাগ সময় ভাল ওওপি অ্যাপ্লিকেশনগুলি কেবল ইন্টারফেসের উত্তরাধিকার এবং রচনাগুলি ব্যবহার করে লেখা যায়। দুটি নীতি
- উত্তরাধিকার বা এটির জন্য ডিজাইন নিষিদ্ধ করুন
- রচনা পছন্দ
উপরের কারণগুলির জন্য একটি ভাল গাইড, এবং কোনও যথেষ্ট পরিমাণে ব্যয় করবেন না।