বাস্তব বিশ্বে পলিমারফিজম কীভাবে ব্যবহৃত হয়? [বন্ধ]


17

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

Animal animal;

animal = dog;
animal.speak();

animal = cat;
animal.speak();



1
সংগ্রহগুলি, যা আপনি প্রতিটি একক দিনে দেখেন এবং ব্যবহার করেন, পলিমারফিজম কী তা বোঝার জন্য নিজেই যথেষ্ট। তবে সমস্যা সমাধানে পলিমারফিজমকে কীভাবে কার্যকরভাবে ব্যবহার করতে হয় তা হ'ল দক্ষতা অর্জন দ্বারা অভিজ্ঞতার দ্বারা অর্জন এবং কেবল আলোচনা না করে। এগিয়ে যান এবং আপনার হাত নোংরা হয়।
দুর্গাদাস এস

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

সাধারণভাবে যদি আপনি ঘন ঘন বিভিন্ন ধরণের হ্যান্ডেল করার জন্য ওভারলোডেড পদ্ধতিগুলি তৈরি করে থাকেন এবং কোডটি একই রকম হয়, বা আপনি if(x is SomeType) DoSomething()প্রায়শই লিখতে থাকেন তবে পলিমারফিজম ব্যবহার করা উপযুক্ত। আমার জন্য পলিমারফিজম হ'ল একটি পৃথক পদ্ধতি তৈরি করার অনুরূপ একটি সিদ্ধান্ত, যদি আমি জানতে পারি যে আমি কোডটি কয়েকবার পুনরাবৃত্তি করেছিলাম তবে আমি সাধারণত এটি একটি পদ্ধতিতে রিফ্যাক্টর করি এবং যদি আমি দেখতে পাই যে আমি if object is this type do thisপ্রায়শই কোড তৈরি করছি তবে এটি হতে পারে মূল্য পরিশোধক এবং একটি ইন্টারফেস বা ক্লাস যুক্ত।
jrh

উত্তর:


35

স্ট্রিম পলিমারফিজমের দুর্দান্ত উদাহরণ।

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

এই ক্লায়েন্ট, স্ট্রিম ব্যবহার করে এমন ক্লায়েন্টের বাইটগুলি কোথা থেকে এসেছে তার যত্ন নেওয়া দরকার নেই। কেবল সেগুলি ক্রমানুসারে পড়া যায়।

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


2
সি ++ এর মতো একাধিক এবং ভার্চুয়াল উত্তরাধিকার সহ ভাষাগুলিতে, এই উদাহরণটি এমনকি "ড্রেডড হীরা" প্যাটার্নটি প্রদর্শন করতে পারে ... বেস স্ট্রিম শ্রেণি থেকে ইনপুট এবং আউটপুট স্ট্রিম ক্লাস অর্জন করে এবং উভয়কে I / O স্ট্রিম তৈরি করতে প্রসারিত করে
গাইরে

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

+1 Streamগুলি আমার সর্বকালের প্রিয় পলিমারফিজমের উদাহরণ। আমি মানুষকে ত্রুটিযুক্ত 'প্রাণী, স্তন্যপায়ী, কুকুর' মডেল শেখানোর চেষ্টাও করি না, Streamতবে আরও ভাল কাজ করি।
ফারাপ

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

@ গ্রেয়ার ওহ, হ্যাঁ, আমি আসলে এটি পেয়েছি; এ কারণেই আমি "এবং" দিয়ে শুরু করেছিলাম তা বোঝাতে যে এটি আপনার বিপরীতে নয় বরং আপনার চিন্তার বর্ধন।
কেআরয়ান

7

একটি সাধারণ গেম সম্পর্কিত উদাহরণ একটি বেস ক্লাস হবে Entity, যেমন সাধারণ সদস্যদের যেমন draw()বা সরবরাহ করে update()

আরও বিশুদ্ধ ডেটা ওরিয়েন্টেড উদাহরণের জন্য এখানে একটি বেস শ্রেণীর Serializableএকটি সাধারণ saveToStream()এবং প্রদান করা যেতে পারে loadFromStream()


6

বিভিন্ন ধরণের পলিমারফিজম রয়েছে, আগ্রহের মধ্যে একটি হ'ল সাধারণত রানটাইম পলিমারফিজম / ডায়নামিক প্রেরণ।

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

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

void foo() {
  if (isTesting) {
    ... // do mock stuff
  } else {
    ... // do normal stuff
  }
}

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

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

interface Model {
  def predict(sample) -> (prediction: float, std: float);
}

আমার অ্যালগরিদম একটি ফ্যাক্টরি ফাংশন নেয় যা একটি মডেলকে প্রশিক্ষণ দেয়:

def my_algorithm(..., train_model: (observations) -> Model, ...) {
  ...
  Model model = train_model(observations);
  ...
  y, std = model.predict(x)
  ...
}

আমার কাছে এখন মডেল ইন্টারফেসের বিভিন্ন প্রয়োগ রয়েছে এবং সেগুলি একে অপরের বিপরীতে বেনমার্ক করতে পারি। এর মধ্যে একটি বাস্তবায়ন আসলে অন্য দুটি মডেল নেয় এবং এগুলিকে একটি বুস্টেড মডেলের সাথে সংযুক্ত করে। তাই এই ইন্টারফেস ধন্যবাদ:

  • আমার অ্যালগরিদমের নির্দিষ্ট মডেলগুলি আগাম জানতে হবে না,
  • আমি সহজেই মডেলগুলি অদলবদল করতে পারি, এবং
  • আমার মডেলগুলি বাস্তবায়নে আমার অনেকটা নমনীয়তা রয়েছে।

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

void paint(Graphics g) {
  super.paint(g);
  for (Component child : this.subComponents)
    child.paint(g);
}

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

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

তবে প্রতিটি নকশাকে পলিমারফিজম ব্যবহার করার প্রয়োজন হয় না (ইউনিট পরীক্ষার জন্য নির্ভরতা ইনজেকশন সক্ষম করার বাইরে যা সত্যই ব্যবহারের ক্ষেত্রে ভাল)। বেশিরভাগ সমস্যাগুলি অন্যথায় খুব স্থির হয় are ফলস্বরূপ, ক্লাস এবং পদ্ধতিগুলি প্রায়শই বহুবর্ষের জন্য ব্যবহৃত হয় না, তবে কেবল সুবিধাজনক নেমস্পেস এবং সুন্দর পদ্ধতি কল সিনট্যাক্সের জন্য। যেমন অনেক বিকাশকারী পদ্ধতি কলগুলিকে পছন্দ account.getBalance()করে যেমন একটি বৃহত সমতুল্য ফাংশন কল Account_getBalance(account)। এটি একটি নিখুঁত সূক্ষ্ম পদ্ধতির, এটি কেবলমাত্র বহু পদ্ধতি "কল" এর বহুবর্ষের সাথে কোনও সম্পর্ক নেই।


6

আপনি বেশিরভাগ ইউআই টুলকিটগুলিতে প্রচুর উত্তরাধিকার এবং পলিমারফিজম দেখতে পান।

উদাহরণস্বরূপ, জাভাএফএক্স ইউআই টুলকিটটিতে Buttonউত্তরাধিকার সূত্রে প্রাপ্ত ButtonBaseযা থেকে Labeledউত্তরাধিকার সূত্রে প্রাপ্ত Controlযা উত্তরাধিকার সূত্রে প্রাপ্ত Regionযা উত্তরাধিকার সূত্রে প্রাপ্ত Parentযা থেকে Nodeউত্তরাধিকার সূত্রে প্রাপ্ত Object। অনেক স্তর পূর্ববর্তীগুলি থেকে কিছু পদ্ধতি ওভাররাইড করে।

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

ইউআই টুলকিটগুলির একটি খুব উচ্চ বাস্তব বিশ্বের তাত্পর্য রয়েছে, এগুলি একাডেমিক এবং ব্যবহারিক কারণে উভয় কারণে শেখাতে দরকারী useful

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


3

যদিও এখানে ইতিমধ্যে দুর্দান্ত উদাহরণ রয়েছে, অন্য একটি হ'ল প্রাণীকে ডিভাইসগুলির সাথে প্রতিস্থাপন করা:

  • Deviceহতে পারে powerOn(), powerOff(), setSleep()এবং করতে পারেন getSerialNumber()
  • SensorDeviceএই সব করতে পারেন, এবং যেমন বহুরুপী ফাংশন প্রদান getMeasuredDimension(), getMeasure(), alertAt(threashhold)এবংautoTest()
  • অবশ্যই, getMeasure()তাপমাত্রা সংবেদক, একটি হালকা আবিষ্কারক, একটি শব্দ সনাক্তকারী বা একটি ভলিউমেট্রিক সেন্সরের জন্য একইভাবে প্রয়োগ করা হবে না। এবং অবশ্যই, এই আরও বিশেষায়িত সেন্সরের প্রত্যেকটিতে কিছু অতিরিক্ত ফাংশন উপলব্ধ থাকতে পারে।

2

উপস্থাপনা একটি খুব সাধারণ অ্যাপ্লিকেশন, সম্ভবত সর্বাধিক সাধারণ টোস্ট্রিং ()। যা মূলত অ্যানিমাল S স্পেক (): আপনি কোনও বস্তুকে নিজেই প্রকাশ করতে বলেছিলেন।

আরও সাধারণভাবে বলতে গেলে আপনি কোনও বস্তুকে "তার কাজটি করতে" বলুন। সংরক্ষণ করুন, লোড করুন, আরম্ভ করুন, নিষ্পত্তি করুন, প্রসেসডেটা, গেটস্ট্যাটাস ভাবেন।


2

পলিমারফিজমের আমার প্রথম ব্যবহারিক ব্যবহারটি ছিল জাভাতে হিপ প্রয়োগ করা।

আমার কাছে পদ্ধতিগুলি সন্নিবেশকরণ, রিমুভটপ বাস্তবায়ন সহ বেস ক্লাস ছিল যেখানে সর্বাধিক এবং ন্যূনতম হিপগুলির মধ্যে পার্থক্য কেবল পদ্ধতিটি কীভাবে কাজ করে তার তুলনা করে।

abstract class Heap {  

 abstract boolean compare ( int x , int y );

 boolean insert(int x ) { ... }

 int removeTop() { ... }
}

সুতরাং যখন আমি ম্যাক্সহীপ এবং মিনহ্যাপ পেতে চাইতাম তখন আমি কেবল উত্তরাধিকার ব্যবহার করতে পারি।

class MaxHeap extends Heap {

   MaxHeap(int maxSize) {super(maxSize);}

   @Override
   boolean compare(int x, int y) {
       return x>y; // x<y for minHeap
   }
}

1

ওয়েব অ্যাপ্লিকেশন / ডাটাবেস টেবিল পলিমারফিজমের জন্য এখানে একটি বাস্তব জীবনের দৃশ্যপট :

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

কারাগারে আমি আমার মডেলগুলি এমনভাবে ডিজাইন করব:

class Picture < ApplicationRecord
  belongs_to :imageable, polymorphic: true
end

class User < ApplicationRecord
  has_many :pictures, as: :imageable
end

class Product < ApplicationRecord
  has_many :pictures, as: :imageable
end

picturesটেবিলটি তৈরি করতে একটি ডাটাবেস স্থানান্তর :

class CreatePictures < ActiveRecord::Migration[5.0]
  def change
    create_table :pictures do |t|
      t.string  :name
      t.integer :imageable_id
      t.string  :imageable_type
      t.timestamps
    end

    add_index :pictures, [:imageable_type, :imageable_id]
  end
end

কলামগুলি imageable_idএবং imageable_typeঅভ্যন্তরীণভাবে রেলগুলি দ্বারা ব্যবহৃত হয়। মূলত, imageable_typeশ্রেণী (নাম ঝুলিতে "User", "Product"ইত্যাদি), এবং imageable_idযুক্ত রেকর্ড ID। সুতরাং imageable_type = "User"এবং সঙ্গে টেবিলে imageable_id = 1রেকর্ড হবে ।usersid = 1

এটি আমাদের user.picturesব্যবহারকারীর ছবিগুলি অ্যাক্সেস করার পাশাপাশি product.picturesকোনও পণ্যের ছবি পাওয়ার মতো জিনিসগুলি করার অনুমতি দেয় । তারপরে, চিত্র সম্পর্কিত সমস্ত আচরণ Photoক্লাসে আবদ্ধ হয় (এবং প্রতিটি মডেলের জন্য পৃথক শ্রেণি নয় যা ফটোগুলির প্রয়োজন হয়), তাই জিনিসগুলি ডিআরওয়াই রাখা হয়।

আরও পঠন: বহুবর্ষজীবী সমিতিগুলি রেলগুলি


0

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

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

আমি উপরে যা বর্ণনা করেছি তা রানটাইম পলিমারফিজমের উদাহরণ যেখানে মেথড ওভারলোডিং সংকলন টাইম পলিমার্ফসিমের একটি উদাহরণ যেখানে i / p এবং o / p পরামিতির ধরণের উপর নির্ভরশীল এবং পরামিতিগুলির সংখ্যার সাথে কলারের সাথে উপযুক্ত পদ্ধতিতে কলারের সাথে সংযুক্ত থাকে।

আশা করি এটি স্পষ্ট হয়েছে।

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