একই কাজটি করে এমন বিভিন্ন ফাংশন স্বাক্ষর সরবরাহ করা কি ভাল ধারণা?


23

এখানে একটি সি ++ শ্রেণি রয়েছে যা তিনটি মান দিয়ে নির্মিত হয়।

class Foo{

    //Constructor
    Foo(std::string, int, char);

private:
    std::string foo;
    char bar;
    int baz;
};

সমস্ত প্যারামিটারের ধরন আলাদা।
আমি কন্সট্রাক্টরকে ওভারলোড করতে পারি যাতে অর্ডারটি কোনও ব্যাপার না।

class Foo{

    //Constructors
    Foo(std::string, char, int);
    Foo(std::string, int, char);
    Foo(char, int, std::string);
    Foo(char, std::string, int);
    Foo(int, std::string, char);
    Foo(int, char, std::string);


private:
    std::string foo;
    char bar;
    int baz;
};

তবে কি এটি একটি ভাল ধারণা?
আমি এটি করা শুরু করলাম কারণ আমি জানতাম কোন শ্রেণীর / ক্রিয়াকলাপে কী কী জিনিস প্রয়োজন;
এটি সর্বদা তাদের মনে রাখে না যে এটি কী আদেশ নিয়েছিল।


আমি ধরেই নিয়েছি যে সংকলকটি এটিটিকে অনুকূল করে তোলে যেন আমি একই নির্মাণকারীকে ডেকেছি।

//compiler will implement this with the same code? 
//maybe not.. I could call a function to get a parameter, 
//and that function could change the state of the program, before calling
//a function to get another parameter and the compiler would have to
//implement both
Foo foo1("hello",1,'a');
Foo foo2('z',0,"world");

কোনও ক্রিয়াকে ওভারলোড করার বিষয়ে আপনার মতামত কীভাবে যাতে অর্ডারটির কোনও গুরুত্ব নেই?


এছাড়াও, আমি যদি কিছু ইউটিলিটি ফাংশন লিখছি,
তবে একই কাজ করে এমন বিভিন্ন ফাংশনের নাম সরবরাহ করা কি ভাল ধারণা?

যেমন।

void Do_Foo();
void DoFoo();
void do_foo();
//etc..

আমি প্রায়শই এই দুটি কিন্তু অনুরূপ কনভেনশন দেখতে পাই না।
আমার কি অভ্যাসটি ভেঙে দেওয়া উচিত?


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

এখানে আমার প্রশ্নের সদৃশ একটি ধরণের (আমি এখন একমত যে এটি একটি খারাপ ধারণা)।
শে

উত্তর:


93

আমি কনস্ট্রাক্টরকে ওভারলোড করতে পারলাম যাতে আদেশটি [প্যারামিটারগুলির] বিবেচনা করে না ... তবে এটি কি ভাল ধারণা?

না।

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

বেশিরভাগ প্রোগ্রামার পূর্বনির্ধারিত ক্রমে পদ্ধতি পরামিতিগুলির শৃঙ্খলা প্রত্যাশা করে এবং ইন্টেলিসেন্সের মতো সরঞ্জামগুলি তাদের প্রবেশ করার সাথে সাথে প্যারামিটারগুলির প্রত্যাশিত ক্রমটি তাদের জানায়।


একই কাজ করে এমন একাধিক ফাংশন নাম থাকা একই সমস্যা; প্রোগ্রামাররা ভেরিয়েন্টগুলির আলাদা আচরণের প্রত্যাশা করে। আচরণ অনুসারে একটি ফাংশন বা পদ্ধতি, দয়া করে এবং কেবল একটি সামঞ্জস্যপূর্ণ নামকরণের ধরণ অবলম্বন করুন।


14
প্রচুর আপ-ভোট আমি সঙ্গে সঙ্গে থামব। ধন্যবাদ.
ট্রেভর হিকি 18

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

3
"একাধিক ফাংশন নাম যে একই জিনিস ... কি হচ্ছে" - একটি "ভাল" সময়ের জন্য, রুবি এর ক্লাস এ বর্ণন স্ট্রিং হ্যাশ এরে ফাইল

+1 টি। আপনি বিকাশকারী / প্রোগ্রামারদের সাথে ডিল করছেন। "ব্যবহারকারী বানর" সম্পর্কে মাইক্রোসফ্ট ধারণাটি এখানে কাজ করে না।
মনোজ আর

1
@ জাচারি ইয়েটস "নির্মাণকারীর নাম" অভাবের পরিবর্তে স্থির নির্মাণ পদ্ধতি প্রকাশ করে কাজ করা যেতে পারে। এটি জাভাতে একটি স্ট্যান্ডার্ড অনুশীলন, যদিও সি ++ তে তেমন কিছু না।
Xion

14

কখনও কখনও যুক্তিগুলির মধ্যে যাত্রাপথকে সমর্থন করা প্রয়োজন। এই ক্ষেত্রে:

double operator *(int, double);
double operator *(double, int);

আমরা একটি গুণ চাই না intএবং doubleCompute ভিন্ন কিছু হলে operands বিপরীত হয়। তাছাড়াও আমরা মনে রাখা যে, যখন গুন বল প্রোগ্রামারদের চাও ints এবং doubles, doubleবাম যায়!

এটি কোনও অপারেটর বলে কিছু যায় আসে না কারণ এটি একই রকম হয়:

footype plus(const footype &, const bartype &);
footype plus(const bartype &, const footype &);

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

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

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