2010-04-14 12 views
19

मैं अक्सर कोड में यह देखा है, लेकिन जब मैं इसके बारे में बात करते हैं मैं इस तरह के 'नमूना'क्या यह एक प्रसिद्ध डिजाइन पैटर्न है? इसका नाम क्या है?

के लिए नाम पता नहीं है मेरे पास है कि एक ओवरलोड विधि 3 तर्कों और जानबूझकर है कि कॉल 2 तर्क के साथ एक विधि स्ट्रिंग स्ट्रिंग के लिए तीसरा सेट करता है।

public void DoWork(string name, string phoneNumber) 
{ 
    DoWork(name, phoneNumber, string.Empty) 
} 

private void DoWork(string name, string phoneNumber, string emailAddress) 
{ 
    //do the work 
} 

कारण मैं कर रहा हूँ इस कोड को नकल नहीं करने, और मौजूदा कॉल अभी भी विधि केवल 2 पैरामीटर है कि कॉल करने के लिए अनुमति देने के लिए है।

क्या यह एक पैटर्न है, और क्या इसका नाम है?

+4

क्या आपका मतलब DoWork (name, phoneNumber, string.Empty) नहीं था? – Andrey

+0

हाँ एंड्री, मैंने इसे संपादित किया है, इसे इंगित करने के लिए धन्यवाद, और किसी भी भ्रम के बारे में खेद है जिसके कारण यह हो सकता है – GenEric35

+0

त्वरित उत्तरों के लिए सभी को धन्यवाद, मैं इंतजार करूंगा कि किसी के पास इसका नाम है क्योंकि मैंने इसे काफी देखा है अक्सर और उस पर एक नाम रखना चाहते हैं। मैं दिन के अंत से पहले एक जवाब स्वीकार करूंगा, धन्यवाद। – GenEric35

उत्तर

34

यह वास्तव में सिर्फ विधि से अधिक भार है (जहां आमतौर पर एक ही विधि का नाम अलग तर्क प्रकार है), इस विशिष्ट पैटर्न - जहां भार के मूलतः एक ही तरीका है, और कम से एक के साथ लंबे समय तक एक का आह्वान वैकल्पिक मानकों को अनुकरण करने के लिए डिफ़ॉल्ट मान - जिसे टेलीस्कोपिक/टेलीस्कोपिंग पैटर्न कहा जाता है, आमतौर पर रचनाकारों पर देखा जाता है, लेकिन निश्चित रूप से किसी भी विधि के लिए सामान्यीकृत होता है।


एक अधिक आधिकारिक बोली के लिए, यहाँ प्रभावी जावा 2 संस्करण, से एक अंश है आइटम 2: जब

परंपरागत रूप से कई निर्माता मापदंडों (excerpt online) के साथ सामना एक बिल्डर पैटर्न पर विचार करें, प्रोग्रामर ने टेलीस्कोपिंग कन्स्ट्रक्टर पैटर्न का उपयोग किया है, जिसमें आप केवल आवश्यक पैरामीटर के साथ एक कन्स्ट्रक्टर प्रदान करते हैं, दूसरा एक वैकल्पिक पैरामीटर के साथ, एक तिहाई दो वैकल्पिक पैरामीटर के साथ, और इसलिए पर ...

फिर, आमतौर पर टेलीस्कोपिक पैटर्न पर रचनाकारों के संदर्भ में चर्चा की जाती है (जहां उदा। एक 2-Arg कन्स्ट्रक्टर के पास 3-arg constructor इत्यादि का आह्वान करने के लिए एक पंक्ति this(arg1, arg2, ARG3_DEFAULT); होगी), लेकिन मुझे नहीं लगता कि इसे अन्य विधियों के लिए सामान्यीकृत क्यों नहीं किया जा सकता है।


एक और आधिकारिक बोली, दुर्भाग्य से पैटर्न का कोई परिभाषा के साथ: Sun Developer Network: How to Write Doc Comments for the Javadoc Tool:

सूचना तरीके और कंस्ट्रक्टर "telescoping" आदेश है, जो पहली "कोई आर्ग" फ़ॉर्म का मतलब है में हैं, तो "1 तर्क" फ़ॉर्म, फिर "2 तर्क" फ़ॉर्म, और बहुत आगे।


और एक और यादृच्छिक उद्धरण, पैटर्न का एक और अधिक स्पष्ट परिभाषा के साथ: I Am Hate Method Overloading (And So Can You!):

Telescoping तरीके

आप एक समारोह है कि बहस के कुछ नंबर लेता है हो सकता है । आखिरी कुछ तर्क सभी महत्वपूर्ण नहीं हो सकते हैं, और अधिकतर उपयोगकर्ताओं को यह पता लगाने में नाराज होगा कि उन्हें क्या पास करना है। तो आप एक ही नाम और कम तर्क के साथ कुछ और विधियां बनाते हैं, जो "मास्टर" विधि से कॉल करते हैं।

यह अंतिम उद्धरण सीधे प्रस्तावित करता है कि डिफ़ॉल्ट तर्कों के लिए भाषा समर्थन एक बेहतर विकल्प है।

+0

महान उत्तर, धन्यवाद – GenEric35

+1

@polygenelubricants: मैं वास्तव में आपकी प्रतिक्रिया की सराहना करता हूं, धन्यवाद! मेरा मुद्दा यह है कि, जबकि मैं सामान्य विचार में आपके साथ 100% सहमत हूं, मैं इस विशिष्ट मामले के लिए बहुत आश्वस्त नहीं हूं। तथ्य यह है कि हमारे पास 40 साल के लिए ओओपी था और 30 साल तक डिजाइन पैटर्न और ऐसी सामान्य परिस्थिति के लिए आपको दुनिया में 3 संदर्भों को शायद ही कभी "डिजाइन पैटर्न" (या कम से कम विचार को सामान्यीकृत करने) कहा जाता है, आपको नहीं बनाता लगता है कि कोई स्वीकार्य डिजाइन पैटर्न नहीं है और संभवतः क्योंकि यह आवश्यक नहीं है? क्या आपको लगता है कि यह उपलब्ध डेटा के साथ पर्याप्त है जो कहने के लिए: यह "टेलीस्कोपिक पैटर्न" है? –

+1

@ क्लाउडियो: _maybe_ नाम अभी तक व्यापक रूप से प्रसारित नहीं हुआ है, लेकिन इसका उपयोग _ प्रभावी जावा_ में किया जाता है, जो मुझे विश्वास है कि व्यापक रूप से पढ़ी गई पुस्तक है। किसी भी मामले में, आइए नामकरण का उपयोग करने के बजाए नाम का उपयोग करना शुरू करें। हम पैटर्न (अच्छे या बुरे) का उपयोग कर रहे हैं, इसलिए इसे नामहीन छोड़ने के बजाय, हम इसे कुछ भी कह सकते हैं। और आप क्या जानते हैं, कुछ लोगों ने पहले से ही किया है। – polygenelubricants

20

के नाम अधिक भार है और यह एक डिजाइन पैटर्न, लेकिन एक OOP सुविधा

http://en.wikipedia.org/wiki/Method_overloading

+0

ठीक है, मुझे दूसरी विधि को निजी रखना चाहिए था, यही वह मामला है जहां ओवरलोडेड विधि कॉलर को छिपी हुई है, और ओवरलोडेड विधियों को माता-पिता द्वारा बुलाया जाता है। मैं अपना कोड एडजस्ट कर दूंगा, धन्यवाद, क्या इस सुविधा के लिए कोई नाम है या ओवरलोडेड विधि का उपयोग है? – GenEric35

+1

आईएमओ, अधिभार को ओओपी और अन्य भाषाओं द्वारा समर्थित एक डिजाइन पैटर्न माना जा सकता है। – kenny

+0

यह कहकर कि यह "बस विधि अधिभार" है जैसे कह रहा है उदा। आगंतुक पैटर्न "बस गतिशील प्रेषण" है। यह ओओपी यांत्रिकी पूरी तरह से वर्णन करता है, लेकिन यह एक डिजाइन पैटर्न क्या है की पूरी धारणा को संबोधित करने के लिए याद करता है। – polygenelubricants

3

मेरा अनुमान है कि या तो अपने DoWork तरीकों CreateContact बुलाया जाना चाहिए या CreateContact करने के लिए अपने कॉल DoWork होना चाहिए नहीं है। ..

लेकिन यह वास्तव में एक पैटर्न नहीं है। यह method overloading का एक आम उपयोग है।

+0

हाँ, मैं इसे संपर्क बना सकता था लेकिन मेरे वास्तविक उदाहरण में रचनाकारों को शामिल नहीं करना चाहता था, ये स्थिर तरीके हैं, इसलिए मैंने इसे केवल DoWork कहा। मुझे समझ में आता है कि इसे विधि अधिभार कहा जाता है, शायद मुझे इसे स्पष्ट करने के लिए इसे प्रश्न में रखना चाहिए था, मुझे पता है कि वे एक ही विधि के ओवरलोडेड संस्करण हैं। यह वह मामला है जहां कॉलर अधिभारित विधि को सीधे कॉल नहीं कर सकता है, मुझे दूसरा निजी बनाना चाहिए था, जिसे मैं अब संपादित करूँगा। क्या अधिभारित विधि के इस उपयोग के लिए कोई नाम है जहां वे एक-दूसरे को कॉल करते हैं और उनमें से केवल एक ही सार्वजनिक है? – GenEric35

+0

जहां तक ​​मुझे पता है, यह अभी भी स्वीकार किए गए पैटर्न में से एक के बजाय ओवरलोडिंग का उपयोग है। –

7

नहीं, यह चार अर्थों के गिरोह में एक डिज़ाइन पैटर्न नहीं है, लेकिन यह कई भाषाओं में आम है जो डिफ़ॉल्ट पैरामीटर की अनुमति नहीं देते हैं।

रूबी की तरह आप के रूप में ऐसी ही कुछ कर सकता है एक भाषा में इस प्रकार

def dowork(name, phoneNumber, emailAddress = '') 
    # code here 
    end 
4

मैं कहना चाहता हूँ यह बहुत ज्यादा एक ग # < 4 डिफ़ॉल्ट तर्क की कमी के लिए चारों ओर काम है। यदि आप 'पैटर्न में गायब हैं, तो भाषा की विशेषताएं गायब हैं' विचार के स्कूल मुझे लगता है कि आप इसे एक पैटर्न कह सकते हैं, हालांकि आमतौर पर नामित नहीं किया जाता है।

संपादित करें: ठीक है आपके अपडेट ने मुझे वास्तव में फेंक दिया है, मुझे नहीं लगता कि आप एक निजी विधि को बुलाते हुए सार्वजनिक विधि के साथ क्या करने का प्रयास कर रहे हैं। जहां तक ​​सार्वजनिक एपीआई का संबंध है, आप बस सभी निजी विधियों कोड को सार्वजनिक विधि में स्थानांतरित कर सकते हैं और 'डिफ़ॉल्ट' मान के लिए स्थानीय चर हो सकते हैं। या दोनों विधियों को कक्षा में अन्य स्थानों से भी बुलाया जाता है?

3

इसे फ़ंक्शन ओवरलोडिंग के रूप में जाना जाता है। फ़ंक्शन ओवरलोडिंग फ़ंक्शन का नाम समान होता है लेकिन वे किसी भी प्रकार के पैरामीटर या पैरामीटर की संख्या में भिन्न होते हैं। इसे झूठी बहुरूपता भी कहा जाता है। यह एक पैटर्न नहीं है, यह एक मूल ओओपी अवधारणा है।

5

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

+0

जिसने भी मदद की, धन्यवाद: डी – GenEric35

2

मैं @ पोलिजेनेलब्रिकेंट्स से सहमत हूं, लेकिन यह इंगित करना चाहता हूं कि टेलीस्कोपिक पैटर्न को अधिभार से अलग किया जा सकता है। एक उदाहरण उद्देश्य-सी में है, जहां विधि चयनकर्ता (हस्ताक्षर) अद्वितीय होना चाहिए और इसे ओवरलोड नहीं किया जा सकता है।

- (id)init { 
    return [self initWithParam:0]; 
} 

- (id)initWithParam:(int)param { 
    // Do real initialization here! 
    return self; 
} 
संबंधित मुद्दे