ফাংশন ওভারলোডিং? হ্যাঁ বা না [বন্ধ]


17

আমি একটি স্ট্যাটিকালি- এবং দৃ strongly়ভাবে টাইপযুক্ত, সংকলিত ভাষা বিকাশ করছি এবং ভাষা বৈশিষ্ট্য হিসাবে ফাংশন ওভারলোডিং অন্তর্ভুক্ত করা হবে কিনা তা নিয়ে আমি পুনর্বিবেচনা করছি। আমি বুঝতে পারি যে আমি কিছুটা পক্ষপাতদুষ্ট, মূলত C[++|#]ব্যাকগ্রাউন্ড থেকে এসেছি ।

সবচেয়ে বিশ্বাসযোগ্য আর্গুমেন্ট কি কি জন্য এবং বিরুদ্ধে একটি ভাষায় ওভারলোডিং কর্ম সহ?


সম্পাদনা: বিরোধী মতামত আছে এমন কেউ নেই?

বার্ট্র্যান্ড মেয়ার (১৯৮৫/১৯86৮ সালে ফিফেলের স্রষ্টা) পদ্ধতিটিকে এই ওভারলোডিং কল করে: (উত্স)

একটি ভ্যানিটি মেকানিজম যা ওও ভাষার শব্দার্থবিদ্যায় কিছুই আনে না, তবে পাঠযোগ্যতা বাধাগ্রস্ত করে এবং প্রত্যেকের কাজকে জটিল করে তোলে

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

উত্তর:


24

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

এটি সাধারণত সদস্য ফাংশন নামের উপস্থিত থাকে। A.foo()থেকে সম্পূর্ণ ভিন্ন ফাংশন কল করতে পারে B.foo(), তবে উভয় ফাংশনটির নাম দেওয়া আছে foo। এটি অপারেটরগুলিতে উপস্থিত থাকে, যেমন +পূর্ণসংখ্যার এবং ভাসমান-পয়েন্ট সংখ্যার ক্ষেত্রে বিভিন্ন জিনিস প্রয়োগ করা হয় এবং এটি প্রায়শই একটি স্ট্রিং কনকেনটেশন অপারেটর হিসাবে ব্যবহৃত হয়। এটি নিয়মিত ক্রিয়াকলাপগুলিতে এটির অনুমতি না দেওয়াও অদ্ভুত বলে মনে হচ্ছে।

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

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

ফাংশন ওভারলোডিং ছাড়াই, আমি যদি কিছু পরিবর্তনশীল বা মানের ধরণটি পরিবর্তন করি তবে এটি ব্যবহার করা প্রতিটি ফাংশন পরিবর্তন করতে হবে। এটি রিফ্যাক্টর কোডটিকে আরও শক্ত করে তোলে।

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

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

সামগ্রিকভাবে, এটি একটি ভাষাকে অনেক বেশি ব্যবহারযোগ্য করে তোলে।


1
+1, সমস্ত খুব ভাল পয়েন্ট। এবং আমাকে বিশ্বাস করুন, আমি মনে করি না যে বহুগঠিতগুলি অকেজো ... আমি প্রতিবার আমি টাইপ করা খুব কীবোর্ডকে অভিশাপ দিয়েছি যখনই আমি দর্শকের ধরণটি ব্যবহার করতে বাধ্য হই।
নিজের কাছে নোট করুন - একটি নাম মনে করুন

এই লোকটি কি ফাংশনটিকে ওভাররাইডিং বর্ণনা করছে এবং ওভারলোডিং নয়?
ড্রাগগ্রেস

8

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

উদাহরণস্বরূপ, এখানে অ্যাড-হক ওভারলোডিংয়ের উদাহরণ (যথেষ্ট বৈধ হাস্কেল নয়):

(==) :: Int -> Int -> Bool
x == y = ...
x /= y = not (x == y)

(==) :: Char -> Char -> Bool
x == y = ...
x /= y = not (x == y)

এবং এখানে টাইপ শ্রেণীর সাথে ওভারলোডিংয়ের একই উদাহরণ:

class Eq a where
    (==) :: a -> a -> Bool
    (/=) :: a -> a -> Bool

    x /= y  =  not (x == y)

instance Eq Int where
    x == y  = ...

instance Eq Char where
    x == y  = ...

এই একটি downside হয় আপনি আপনার সমস্ত typeclasses জন্য ভীতু নাম নিয়ে আসা আছে আছে (Haskell, মতো, আপনি বরং বিমূর্ত আছে Monad, Functor, Applicativeসেইসাথে সহজ এবং আরো স্বীকৃত Eq, Numএবং Ord)।

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

group :: (Eq a) => [a] -> [[a]]
group = groupBy (==)

সম্পাদনা: হাসকেলে, আপনি যদি এমন কোনও ==অপারেটর চান যা দুটি ভিন্ন ধরণের গ্রহণ করে, আপনি একটি মাল্টি-প্যারামিটার ধরণের শ্রেণি ব্যবহার করতে পারেন:

class Eq a b where
    (==) :: a -> b -> Bool
    (/=) :: a -> b -> Bool

    x /= y  =  not (x == y)

instance Eq Int Int where
    x == y  = ...

instance Eq Char Char where
    x == y  = ...

instance Eq Int Float where
    x == y  = ...

অবশ্যই এটি সম্ভবত একটি খারাপ ধারণা, যেহেতু এটি আপনাকে সুস্পষ্টভাবে আপেল এবং কমলার তুলনা করতে দেয়। যাইহোক, আপনার জন্য এই বিবেচনা করতে পারে +একটি যোগ সাল থেকে Word8একটি থেকে Intসত্যিই কিছু প্রেক্ষিতে করতে একটি যুক্তিসম্মত জিনিস।


+1, আমি যখন থেকে প্রথমবার এটি পড়েছিলাম তখন থেকেই আমি এই ধারণাটি উপলব্ধি করার চেষ্টা করছি এবং এটি সাহায্য করে। এই দৃষ্টান্তটি উদাহরণস্বরূপ, (==) :: Int -> Float -> Boolকোথাও সংজ্ঞায়িত করা অসম্ভব করে তোলে ? (এটি অবশ্যই একটি ভাল ধারণা কিনা তা নির্বিশেষে)
স্বতঃ দ্রষ্টব্য - একটি নাম ভাবুন

আপনি যদি মাল্টি-প্যারামিটার ধরণের শ্রেণিগুলিকে অনুমতি দেন (যা হাস্কেল একটি এক্সটেনশন হিসাবে সমর্থন করে), আপনি পারেন। উত্তরটি একটি উদাহরণ সহ আপডেট করেছি।
জোয়ে অ্যাডামস

হুম, আকর্ষণীয়। সুতরাং মূলত class Eq a ...সিউডো-সি-পরিবারে অনুবাদ করা হবে interface Eq<A> {bool operator==(A x, A y);}এবং স্বেচ্ছাসেবী বিষয়গুলির তুলনা করার জন্য টেম্প্লেটেড কোড ব্যবহার করার পরিবর্তে আপনি এই 'ইন্টারফেস' ব্যবহার করেন। এটা কি সঠিক?
নিজের কাছে নোট করুন -

ঠিক। আপনি গো-এর ইন্টারফেসগুলিতে দ্রুত নজর রাখতে চাইতে পারেন। যথা, আপনাকে কোনও ইন্টারফেস বাস্তবায়ন হিসাবে কোনও ধরণের ঘোষণা করতে হবে না, আপনাকে কেবল সেই ইন্টারফেসের জন্য সমস্ত পদ্ধতি প্রয়োগ করতে হবে।
জোয়ে অ্যাডামস

1
@ নোটোসেল্ফ-থিঙ্কোফানাম: অতিরিক্ত অপারেটর সম্পর্কিত - হ্যাঁ এবং না। এটি ==আলাদা নাম-স্পেসে থাকার অনুমতি দেয় তবে এটিকে ওভাররাইড করার অনুমতি দেয় না। দয়া করে মনে রাখবেন একটি একক নামস্থান (নেই Prelude) ডিফল্টভাবে অন্তর্ভুক্ত কিন্তু আপনাকে এক্সটেনশনের ব্যবহার করে অথবা এটি স্পষ্টভাবে আমদানি করে এটা লোড প্রতিরোধ করতে পারি ( import Prelude ()থেকে কিছুই আমদানি করবে Preludeএবং import qualified Prelude as Pবর্তমান নামস্থান মধ্যে প্রতীক সন্নিবেশ হবে না)।
ম্যাকিয়েজ পাইচোটকা

4

ফাংশন ওভারলোডিংকে মঞ্জুরি দিন, আপনি paraচ্ছিক প্যারামিটারগুলির সাহায্যে নিম্নলিখিতটি করতে পারবেন না (বা আপনি যদি পারেন তবে সুন্দরভাবে না)।

তুচ্ছ উদাহরণ কোনও পদ্ধতি ধরে নেয় নাbase.ToString()

string ToString(int i) {}
string ToString(double d) {}
string ToString(DateTime d) {}
...

দৃ strongly়ভাবে টাইপিত ভাষার জন্য, হ্যাঁ। দুর্বলভাবে টাইপিত ভাষার জন্য, না। দুর্বলভাবে টাইপ করা ভাষায় কেবলমাত্র একটি ফাংশন দিয়ে আপনি উপরেরটি করতে পারেন।
স্পেক্স

2

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

int indexOf(char ch)
{
  return self.indexOf(ch, 0);
}

int indexOf(char ch, int fromIndex)
{
  // Do whatever
}

যখন আমি করতে পারি:

int indexOf(char ch, int fromIndex=0)
{
  // Do whatever
}

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

(এছাড়াও, পাইথন-স্টাইলের কীওয়ার্ড আর্গুমেন্টগুলি ডিফল্ট পরামিতিগুলির সাথে দুর্দান্তভাবে কাজ করে))


ঠিক আছে, আসুন আবার চেষ্টা করুন, এবং আমি এই Array Slice(int start, int length) {...}বারটি বোঝার চেষ্টা করব ... এর সাথে অতিরিক্ত বোঝা কী হবে Array Slice(int start) {return this.Slice(start, this.Count - start);}? এটি ডিফল্ট পরামিতি ব্যবহার করে কোড করা যায় না। আপনি কি মনে করেন যে তাদের আলাদা আলাদা নাম দেওয়া উচিত? যদি তা হয় তবে আপনি কীভাবে তাদের নাম রাখবেন?
স্বরে নোট করুন - কোনও নাম

এটি ওভারলোডিংয়ের সমস্ত ব্যবহারগুলিকে সম্বোধন করে না।
মেটালমাইকস্টার

@ মেটালমিকেস্টার: আপনি কী অনুভব করছেন যে আমি মিস করেছি?
মিপাদি

@ মিপাদি এটি তালিকায় indexOf(char ch)+ এর মতো জিনিসগুলি মিস indexOf(Date dt)করে। আমি ডিফল্ট মানগুলিও পছন্দ করি তবে সেগুলি স্ট্যাটিক টাইপিংয়ের সাথে বিনিময়যোগ্য নয়।
চিহ্নিত করুন

2

আপনি কেবল জাভা বর্ণনা করেছেন। বা সি #।

আপনি চাকা পুনরুদ্ধার করছেন কেন?

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

function getThisFirstWay(int type)
{ ... }
function getThisSecondWay(int type, double limit)
{ ... }
function getThisThirdWay(int type, String match)
{ ... }

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

@ মেসন: প্রত্যাবর্তিত প্রত্যাশার ভিত্তিতে আপনি প্রত্যাশিত রিটার্নের ধরণটি তাত্পর্যপূর্ণভাবে সনাক্ত করতে পারবেন যা প্রত্যাশিত প্রত্যাশার ভিত্তিতে করা হয়েছে, তবে আমি তা প্রত্যাশা করি না।
জোশ কে

1
উম্ম ... আপনি যখন কোনও রিটার্নের মূল্য প্রত্যাশা করছেন না তখন কীভাবে প্রত্যাশার প্রত্যাশা করা হয় তা আপনার তাত্ত্বিকেরা কীভাবে জানেন?
ম্যাসন হুইলার

1
টাইপ-প্রত্যাশা প্রত্নতাত্ত্বিক প্রকৃতপক্ষে জায়গায় ... আপনি পছন্দ মতো কাজ করতে পারেন EnumX.Flag1 | Flag2 | Flag3। যদিও আমি এটি বাস্তবায়ন করব না। আমি যদি করি এবং রিটার্নের ধরণটি ব্যবহার না করা হয় তবে আমি একটি রিটার্নের ধরণের সন্ধান করব void
নিজের কাছে দ্রষ্টব্য - একটি নাম ভেবে দেখুন

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

2

গ্রার .. এখনও মন্তব্য করার যথেষ্ট সুযোগ নেই ..

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

f a b  // application is left assoc: (f a) b

ওভারলোড রেজোলিউশনের জন্য বি ধরনের ব্যবহার করা যেতে পারে। কিছু পরিস্থিতিতে রিটার্নের ধরণের ক্ষেত্রে সি ++ ওভারলোডগুলি:

int (*f)(int) = g; // choses g based on type, not just signature

প্রকৃতপক্ষে রিটার্ন টাইপের ওভারলোডিংয়ের জন্য অ্যালগরিদম রয়েছে, টাইপ ইনফারেন্স ব্যবহার করে। আসলে কোনও মেশিন নিয়ে কাজ করা এতটা কঠিন নয়, সমস্যাটি হ'ল মানুষ এটিকে কঠিন বলে মনে করে। (আমি মনে করি যে ড্রাগলাইন বুকের রূপরেখাটি দেওয়া হয়েছে, আমি যদি সঠিকভাবে মনে রাখি তবে অ্যালগরিদমকে স-অ্যালগোরিদম বলা হয়)


2

ব্যবহারের কার্যকারিতা ওভারলোডিংয়ের বিরুদ্ধে ব্যবহারের ক্ষেত্রে: 25 টির মতো-নামক পদ্ধতিগুলি যা একই ধরণের কাজ করে তবে বিভিন্ন ধরণের নিদর্শনগুলিতে সম্পূর্ণ ভিন্ন যুক্তি দিয়ে।

ফাংশন ওভারলোডিং বাস্তবায়ন না করার বিরুদ্ধে ব্যবহার-কেস: হুবহু একই প্যাটার্নে একই ধরণের সেটগুলির 5 অনুরূপ নামযুক্ত পদ্ধতি methods

দিন শেষে, আমি উভয় ক্ষেত্রেই উত্পাদিত একটি API এর জন্য ডকগুলি পড়ার অপেক্ষায় নেই।

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


1

আমি আমার ভাষা ফেলিক্সে সাধারণ ওভারলোডিং এবং মাল্টি-টাইপ টাইপ-ক্লাস সরবরাহ করতে পছন্দ করেছি।

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

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

হাস্কেল (এবং সি ++) এ আপনি শব্দার্থবিজ্ঞানের কথা বলতে পারবেন না। সি ++ এ "ধারণাগুলি" ধারণাটি প্রায় শব্দার্থবিজ্ঞানের আনুমানিক একটি প্রচেষ্টা। ফেলিক্সে, আপনি axioms, হ্রাস, lemmas এবং উপপাদ্য দিয়ে উদ্দেশ্য প্রায় অনুমান করতে পারেন।

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

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

সি ++ এ এটিও একটি সমস্যা কারণ এটির একটি opালু মিলে যাওয়া অ্যালগরিদম রয়েছে এবং এটি স্বয়ংক্রিয় প্রকারের রূপান্তরকেও সমর্থন করে: ফেলিক্স I এ একটি সঠিক মিল এবং কোনও স্বয়ংক্রিয় ধরণের রূপান্তর প্রয়োজন না করে এই সমস্যাটি "স্থির" করে।

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

ওভারলোডিং আরও ভাল নয়, আপনার কাছে এমন একটি মানের সংকলকও রয়েছে যা আপনাকে সমস্ত প্রার্থীকে বলার চেষ্টা করে, প্রার্থীরা বহুকর্মী কিনা তা পড়তে পারা কঠিন এবং এটি সি ++ টেমপ্লেট হ্যাকারি হলেও আরও খারাপ।


আকর্ষণীয় মনে হচ্ছে। আমি আরও পড়তে চাই তবে ফেলিক্স ওয়েব পৃষ্ঠায় ডক্সের লিঙ্কটি নষ্ট হয়ে গেছে।
স্বরে নোট করুন - একটি নাম মনে করুন

হ্যাঁ, পুরো সাইটটি বর্তমানে নির্মাণাধীন (আবার), দুঃখিত।
Yttrill

0

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


0

আপনি যদি ব্যবহারকারীদের সাথে সি-পারিবারিক ভাষার সাথে পরিচিতি পেতে চান তবে হ্যাঁ আপনার উচিত কারণ আপনার ব্যবহারকারীরা এটির প্রত্যাশা করবেন।

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