2010-07-27 19 views

उत्तर

19

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

उदा। भार के: (अच्छा)

function Person[] FindPersons(string nameOfPerson) { ... } 
function Person[] FindPersons(date dateOfBirth) { ... } 
function Person[] FindPersons(int age, string dogsName) { ... } 

'विशिष्ट नाम' कार्यों के लिए बेहतर कर रहे हैं: (इससे भी बदतर)

function Person[] FindPersonsByName(string nameOfPerson) { ... } 
function Person[] FindPersonsByDOB(date dateOfBirth) { ... } 
function Person[] FindPersonsByAgeAndDogsName(int age, string dogsName) { ... } 

इस तरह सांकेतिक शब्दों में बदलनेवाला जो/कॉल एक ग्राहक लेखन की खपत इन कार्यों में एक उच्च पर काम कर सकते हैं वैचारिक सोच का स्तर ("मुझे एक व्यक्ति को खोजने की ज़रूरत है") और किसी संकुचित कार्य नाम को याद रखने/ढूंढने की आवश्यकता नहीं है।

स्थिर टाइपिंग के साथ, संकलक उपयोग पैरामीटर के आधार पर लागू अधिभार से मेल खाने के लिए छोड़ा जाएगा। गतिशील टाइपिंग के लिए, यह वही मैच रन टाइम पर होगा, संभवतः विफलता के परिणामस्वरूप यदि कोई उचित मिलान नहीं मिलता है।

+2

मैं सहमत हूं, लेकिन आपको सावधान रहना होगा यदि किसी कारण से आप FindPerson (स्ट्रिंग सिटी) बनाना चाहते हैं, तो मुझे यकीन नहीं है कि यह सबसे अच्छा उदाहरण था ... तर्क अभी भी वैध हैं हालांकि – h4lc0n

+0

वास्तव में अच्छी व्याख्या है। मेरे ज्ञान को सुधारने के लिए धन्यवाद सर :) क्या आप मुझे "उसी तरीके से ओवरराइडिंग विधि के उपयोग के लिए भी समझा सकते हैं? \" – iPatel

+1

@iPatel - ओवरराइडिंग [उप प्रकार polymorphicism] के enabler है (http://en.wikipedia.org/ विकी/पॉलीमोर्फिज्म_ (computer_science) # सबटाइपिंग), वर्चुअल क्लास विधियों (अक्सर सार) या इंटरफेस में लागू होने के रूप में - विकिपीडिया लिंक में उदाहरण देखें। इसके अलावा [यहां देखें] (http://en.wikipedia.org/wiki/Method_overriding)। एक तरफ के रूप में, 'अधिभार' को कभी-कभी 'adhoc polymorphicism' के रूप में जाना जाता है। – StuartLC

3

कभी-कभी एक कार्य/विधि इसे नौकरी करने के लिए विभिन्न प्रकार के पैरामीटर लेने में सक्षम होती है। यह फ़ंक्शन ओवरलोडिंग का समय है। अन्यथा, आपको समान कार्यक्षमता के लिए अलग-अलग फ़ंक्शन करना होगा, जो भ्रमित और खराब अभ्यास है।

  • रचनाकार कार्य हैं, इसलिए उन्हें अधिभारित किया जा सकता है। यह बहुत आसान है।
  • जब आप पहली बार ओवरलोडिंग में जाते हैं, तो यह सोचना आसान होता है कि आप भविष्य में डेवलपर्स को अधिक सुविधाजनक विकल्प देकर एक पक्ष बना रहे हैं। इससे बचने की कोशिश करो। अनइडेड अधिभार भविष्य के डेवलपर्स को भ्रमित कर सकता है और बनाए रखने के लिए अनावश्यक कोड का कारण बन सकता है।
1

यह वस्तु के गुणों के संबंध में एक ही वस्तु को एकाधिक व्यवहार प्रदान करता है।

उदाहरण के लिए addUs(a,b) नामक एक विधि a और b जोड़ती है।

तो परिभाषा हो जाएगा:

int addUs(int a, int b){ 
    return a+b; 
} 

लेकिन अब अगर आप अपने तर्क एक वर्ग की वस्तुओं होना चाहता हूँ कहते हैं:

class Demo{ 
    int height; 
    int width; 
} 

आप एक नया वस्तु वापस जाने के लिए एक ही समारोह addUs() चाहते जिसमें गुणों की ऊंचाई और चौड़ाई होगी, जिसमें 0 तर्कों की संख्या & उत्तीर्ण 2 तर्कों की चौड़ाई होगी।

तो अब परिभाषा होगा:

Demo addUs(Demo a Demo b){ 
    Demo this; 
    this.height = a.height + b.height; 
    this.width = a.width + b.width; 
    return this; 
} 
+0

वह प्रोग्रामिंग भाषा क्या है? क्या आपका, और = कुंजी ब्रेक था? ;) – masterxilo

1

कभी-कभी आप संदर्भ और उपलब्ध इनपुट के आधार पर एक ही बात को पूरा करने के कई तरीके हैं। प्रकार-सख्त स्थैतिक भाषाओं के लिए फ़ंक्शन परिभाषाएं बहुत कठोर हो सकती हैं और समय से पहले स्पष्ट रूप से परिभाषित होने की आवश्यकता होती है।

रचनाकार आमतौर पर इसका सबसे अच्छा क्लासिक उदाहरण हैं। यदि आप एक जटिल वस्तु का निर्माण कर रहे हैं और आपके पास सभी टुकड़े नहीं हैं, तो भी आप एक कन्स्ट्रक्टर के पास जो पास कर सकते हैं उसे पारित करने में सक्षम होना चाहते हैं और बाकी को भरने दें। और जो आपके पास है वह जंगली रूप से भिन्न हो सकता है और रचनाकारों के मानकों के रूप में विभिन्न तरीकों से परिभाषित करने की आवश्यकता है।

6

बहुत मान्य सवाल।

आपको नामकरण में स्थिरता मिलती है, लेकिन की लागत पर सटीक कार्यान्वयन की अस्पष्टता पर।

  • वास्तविक समस्या विधि नामों के लिए मानव स्मृति है, है ना? हमें लगता है कि उन नामों को याद रखना आसान है जो आमतौर पर उपयोग किए जाते हैं।

  • और टाइपिंग की अर्थव्यवस्था, छोटी विधि नामों के लिए अनुमति दे रही है? कम अलग नामों का अर्थ है (गणितीय रूप से) कि नाम में कम जानकारी होती है।

इन दो मुद्दों IDEs कि लगता है/अनुमान/डालने विधि के नाम तेजी से पहले कुछ वर्ण के आधार पर, और पैरामीटर/वापसी प्रकार के साथ किसी भी चिंता, नहीं होना चाहिए।

लेकिन मुझे लगता है कि कोडिंग की सटीकता में, साथ ही साथ लाभ भी है।

3
  1. पैरामीटर के आधार पर एक ही फ़ंक्शन के लिए कई व्यवहार।
  2. आपका फ़ंक्शन कुछ वैकल्पिक विवरणों के साथ काम करना चाहता है। उदाहरण के लिए, निम्न उदाहरण सदस्य ऑब्जेक्ट में कोई सदस्य जोड़ना चाहता है, जिसमें उपयोगकर्ता जो भी जानकारी जानता है। यहां सदस्य, आयु और सदस्य बनाने के लिए न्यूनतम विवरण है वैकल्पिक हैं। [नोट: कार्यों की परिभाषा कोड स्निपेट में नहीं दिया जाता है।]

    public class Members 
    { 
        public System.Collections.Generic.List<Member> TeamMembers; 
    
        public AddMember(Member m) {} 
        public AddMember(string name) {} 
        public AddMember(string name, int age) {} 
        public AddMember(string name, int age, string[] memberOf) {} 
    
        public class Member 
        { 
         public string Name { get; set; } 
         public int Age { get; set; } 
         public string[] MemberOf { get; set; } 
        } 
    } 
    
  3. आप अपने विधि वस्तुओं के कई प्रकार के लिए उपयुक्त हो सकते हैं। पूर्व। कंसोल। राइटलाइन() विधि कंसोल पर खाली रेखा, बूल, int, स्ट्रिंग, चार [], फ्लोट इत्यादि लिखने में सक्षम है। यह कार्य अधिभार के कारण संभव बनाया गया था।

+0

डिफ़ॉल्ट उदाहरण इस उदाहरण के लिए अधिक उपयुक्त नहीं हैं? मैं इसे फ़ंक्शन ओवरलोडिंग के अच्छे उपयोग के रूप में नहीं देखता, विशेष रूप से आपको या तो जटिल कोड के अंदर या तो सरल तरीके से (कम तर्क के साथ) कोड को डुप्लिकेट करना पड़ता है। – Davorin

+0

डिफ़ॉल्ट पैरामीटर अधिक पैरामीटर के अतिरिक्त जवाब प्रदान कर सकता है। लेकिन यहां सार विधि ओवरलोडिंग आपको पैरामीटर के प्रकार और डालने वाले पैरामीटर की संख्या के आधार पर कोड (विधि) का एक पूरी तरह से अलग ब्लॉक निष्पादित करने देता है। AddMember के पहले दो भिन्नताओं में, आप एक सदस्य ऑब्जेक्ट को तर्क या स्ट्रिंग के रूप में जोड़ सकते हैं; उनके निष्पादन विभिन्न मार्गों में जा सकते हैं। उदाहरण के लिए Console.Write() विधि के साथ इस कार्यक्षमता की तुलना करें। – SaravananArumugam

0

आप अलग-अलग पैरामीटर के साथ कोड में समान चीज़ें करना चाहेंगे। यदि आपको प्रत्येक कार्य को एक अलग नाम देना होता है, तो कोड पठनीयता बहुत खराब होगी।

5

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

यह नोटेशन में स्थिरता की अनुमति देता है, जो कोड पढ़ने और लिखने के लिए अच्छा है। I/O एक बहुत ही आम उपयोग है। सामान्य उपयोग में अधिकांश भाषाओं में, एक फ़ंक्शन या ऑपरेटर होता है जो आपके द्वारा उपयोग किए जाने वाले पुराने बेसिक्स में printf() और सी ++, PRINT में operator<<() में सी, operator<<() में आउटपुट करेगा।ऐसी भाषाएं जिन्हें printint(), printstring(), printfloat() जैसे कार्यों की आवश्यकता होती है, और जैसा कि कभी नहीं पकड़ा गया है।

यह सी ++ टेम्पलेट्स और किसी अन्य निर्माण के साथ बहुत अच्छी तरह से काम करता है जहां आपको यह नहीं पता कि कोड लिखने के समय चर प्रकार क्या है।

0

यह समान नाम के साथ कार्य का तंत्र है लेकिन विभिन्न उदाहरणों पर अलग-अलग कार्य करता है। हम आसानी से उन नामों को याद करते हैं जिनका उपयोग आमतौर पर किया जाता है।

संबंधित मुद्दे