क्या विभिन्न कार्य हस्ताक्षर प्रदान करना एक अच्छा विचार है जो समान कार्य करते हैं?


23

यहाँ एक C ++ वर्ग है जो तीन मानों के साथ निर्मित होता है।

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
बहुत सारे वोट। मैं तुरंत रुक जाऊंगा। धन्यवाद।
ट्रेवर हिक्की

8
इसके अलावा, आप अपने उद्देश्य की व्याख्या करने के लिए अलग से कंस्ट्रक्टरों का नाम नहीं दे सकते हैं, पाठकों को मापदंडों से इसका अनुमान लगाना होगा। कन्स्ट्रक्टर को इस तरह से ओवरलोड करने से समझने में बहुत मुश्किल होती है।
ज़ाचरी येट्स

3
"एक से अधिक कार्य करने वाले नाम, जो एक ही काम करते हैं ..." - एक 'अच्छे' समय के लिए, रूबी की कक्षाओं स्ट्रिंग हेरिंग एरे फ़ाइल को देखें

+1। आप डेवलपर्स / प्रोग्रामर के साथ काम कर रहे हैं। "उपयोगकर्ता बंदर है" का Microsoft विचार, यहां काम नहीं करता है।
मनोज आर।

1
@ZacharyYates "कंस्ट्रक्टर नामों" की कमी के बजाय एक स्थिर निर्माण विधियों को उजागर करके चारों ओर काम किया जा सकता है। यह जावा में एक मानक अभ्यास है, हालांकि C ++ में ऐसा नहीं है।
जिओन

14

कभी-कभी तर्कों के बीच समर्थन करना आवश्यक होता है। उदाहरण के लिए:

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

यदि ऑपरेंड उलटे हैं तो हम किसी का गुणा intऔर doubleकुछ अलग करना नहीं चाहते हैं। न ही हम प्रोग्रामर्स को यह याद रखने के लिए मजबूर करना चाहते हैं कि जब ints को गुणा किया जाए और doubles, doubleबाईं ओर जाए!

इससे कोई फर्क नहीं पड़ता कि यह एक ऑपरेटर है क्योंकि वही इसके लिए जाता है:

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

यह वास्तव में फ़ंक्शन के प्रकार पर निर्भर करता है। जबकि अधिकांश प्रोग्रामर शायद अंकगणित पुस्तकालयों में कम्यूटेशन के लिए समर्थन चाहते हैं, वे जरूरी नहीं चाहते हैं, कहते हैं, मैं / ओ पुस्तकालय सभी संभावित तर्क आदेशों का समर्थन करने के लिए कार्य करता है।

यह चिंता संभवतः अपेक्षित घोंसले के इर्द-गिर्द मंडराती है जिसमें फ़ंक्शन कॉल शामिल होने जा रहे हैं। अंकगणितीय संचालकों में लचीलापन हमें समग्र अभिव्यक्ति को स्पष्ट करने के लिए वाक्यविन्यास के पेड़ की समग्र संरचना को बदलने की अनुमति देता है: समान रूप से समान शब्द और जैसे समूह।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.