मुहावरे और डिजाइन पैटर्न के बीच अंतर?


39

मुहावरे और डिज़ाइन-पैटर्न में क्या अंतर है? ऐसा लगता है कि ये शब्दावली कहीं ओवरलैप है; वास्तव में, मुझे नहीं पता क्या वे विनिमेय हैं? मुझे कब उपयोग करना चाहिए?

यहाँ C ++ मुहावरों की एक सूची दी गई है। क्या मैं उन्हें डिजाइन पैटर्न कह सकता हूं?

विकिपीडिया परिभाषित करता है,

निम्न स्तर के डिज़ाइन पैटर्न के रूप में प्रोग्रामिंग मुहावरे

इसका क्या मतलब है? क्या करता है "निम्न स्तर" यहाँ क्या मतलब है?

यह प्रश्न एक अन्य प्रश्न से प्रेरित है: https://stackoverflow.com/questions/7343531/are-the-some-design-patterns-language-dependent


व्यावहारिक रूप से भेद को निर्धारित करना मुश्किल हो सकता है (और एक मुहावरे और एक डिजाइन पैटर्न के बीच कुछ निरंतरता हो सकती है)। लेकिन यह शायद प्राकृतिक भाषा में "मुहावरे" शब्द से निकला है: en.wikipedia.org/wiki/Idiom (जो वास्तव में उपयोग के लायक नहीं है)।
मेरलिन मॉर्गन-ग्राहम

2
यह शायद प्रोग्रामर एसई के लिए बेहतर अनुकूल है।
ओलिवर चार्ल्सवर्थ

3
@ नवाज़: एक "डिज़ाइन पैटर्न" एक भाषा दोष के आसपास एक अपेक्षाकृत "उच्च-स्तरीय" निर्माण है। एक "मुहावरा" एक भाषा दोष के आसपास एक अपेक्षाकृत "निम्न-स्तरीय" निर्माण है; )
ट्रिस्टन सेंट

@ नवाज़- हास्य के लिए +1।
जेनिफर एस

जवाबों:


30

एक मुहावरा एक भाषा के quirks के आसपास काम करने के लिए एक विचार है। कुछ उदाहरण जो ध्यान में आते हैं, आप मूल प्रश्न में जुड़े C ++ मुहावरों में से कोई भी हैं। वे उस भाषा में एक आम समस्या को एक डिब्बाबंद तरीके से हल करते हैं।

एक डिज़ाइन पैटर्न समान है, जिसमें यह एक सामान्य समस्या को हल करता है। लेकिन आदर्श डिजाइन पैटर्न सामान्य भाषा सुविधाओं पर आधारित है, और इस प्रकार भाषा अज्ञेय है।

मुहावरों और डिजाइन पैटर्न के बीच एक निरंतरता है, हालांकि, जैसे निचले स्तर से उच्च-स्तरीय भाषाओं तक है।

विज़िटर पैटर्न एक अच्छा उदाहरण है; यदि केवल एक ही भाषा थी जो केवल एकल डायनेमिक-प्रेषण का समर्थन करती थी, तो हम विज़िटर पैटर्न को उस भाषा का एक मुहावरा मान सकते हैं। लेकिन भाषाओं की पूरी भीड़ है जो सीधे कई-प्रेषण का समर्थन नहीं करती हैं। इसलिए, विज़िटर पैटर्न का जन्म हुआ।

ऑब्जर्वर पैटर्न भी ध्यान में आता है - सी # सीधे इसका समर्थन करता है, इसलिए इसे पैटर्न के सामान्य कार्य-रूप की आवश्यकता नहीं है।

अन्य दिशा में जाने वाला एक उदाहरण OO विशेषताएँ (वंशानुक्रम, बहुरूपता, आदि) हैं। C सीधे उनका समर्थन नहीं करता है। यदि अधिक भाषाएँ C की तरह थीं, तो हम v- तालिकाओं, प्रकार-सुरक्षा आदि को लागू करने के लिए डिज़ाइन पैटर्न विकसित कर सकते हैं, क्योंकि बहुत सारी भाषाएँ उन सुविधाओं का समर्थन करती हैं, हम सामान्यीकृत को कॉल करने के बजाय C के मुहावरे में किसी भी सामान्य समाधान को कहेंगे। एक डिजाइन पैटर्न का समाधान।


2
एक और दिलचस्प उदाहरण: धाराप्रवाह सिंटैक्स एपीआई। वे इस तथ्य के लिए बनाते हैं कि आपके पास अपनी भाषा में सीधे डीएसएल समर्थन नहीं है, और यह भाषा की सीमाओं के पार है। मुझे यकीन नहीं है कि यह एक "डिज़ाइन पैटर्न" की स्थिति में अभी तक स्नातक हो चुका है, और यह एक वाक्यविन्यास मुहावरे की तरह बजता है ...
मेरलिन मॉर्गन-ग्राहम

तथ्य यह है सी # सीधे समर्थन करता है कि पर्यवेक्षक पैटर्न से संकेत मिलता है कि यह है कि प्रतीत होता है करता है , पैटर्न के लिए एक बड़ी जरूरत है इतना कि यह डेवलपर्स से और खुद को भाषा में कार्यान्वयन हट गया।
jaco0646

@ jaco0646 मैंने उस लाइन को पुनः आरंभ किया, अब और अधिक स्पष्ट हो सकता है
मर्लिन मॉर्गन-ग्राहम

37

डिजाइन पैटर्न आमतौर पर भाषा विशिष्ट नहीं होते हैं। भाषा के मुहावरे किसी भाषा (या भाषाओं की श्रेणी) की विशेष सुविधा पर निर्भर करते हैं या उक्त भाषा (भाषाओं) में एक विशिष्ट कमी के आसपास काम करते हैं।


कुछ शब्दों और कुछ अशुद्धियों के साथ एक अंतर खींचने के लिए +1।
मेरलिन मॉर्गन-ग्राहम

1
@ मर्लिन मॉर्गन-ग्राहम: आपने प्रश्न सहित लगभग सभी उत्तरों पर टिप्पणी की है । तो आप बिना किसी अशुद्धि के साथ एक विस्तृत उत्तर क्यों पोस्ट करते हैं ? मैं आपके विचारों को जानना चाहूंगा।
नवाज

1
@ नवाज़: टिप्पणी अन्य उत्तरों के बारे में थी। यह पहले से ही लगभग सही है। मैं आदर्श रूप से एक उत्तर में नमूने लेना चाहता हूं, लेकिन ऐसा लगता है कि कोई भी उन्हें सही नहीं कर रहा है। मैं शायद या तो नहीं कर सकता था, अन्यथा मैं ख़ुशी से उपकार करता हूँ :)
मर्लिन मॉर्गन-ग्राहम

@ नवाज़: ठीक है, मैंने इसे वैसे भी एक शॉट दिया :)
मर्लिन मॉर्गन-ग्राहम

12

मैं विकिपीडिया की परिभाषा में बहुत अधिक मुद्रा नहीं डालूँगा।

बहुत कम से कम एक मुहावरा भाषा-विशिष्ट है जबकि एक डिजाइन पैटर्न भाषा-अज्ञेय होने का प्रयास करता है, या प्रयास करना चाहिए। आगे जाने पर, मुहावरे आमतौर पर पठनीयता बढ़ाने के लिए सम्मेलन होते हैं, या कुछ विकल्प करने के लिए एक से अधिक तरीके होने पर (कुछ तकनीकी योग्यता पर) बेहतर विकल्प होते हैं। उन सभी चीजों से संबंधित हैं कि विचारों को कैसे व्यक्त किया जाता है (स्पष्टता, वाचालता, संक्षिप्तता), लेकिन स्वयं विचारों के लिए नहीं।

दूसरी ओर, डिजाइन पैटर्न एक आवर्ती विचार का सार है, एक ऐसा विचार जो किसी भी भाषा में एक प्राथमिकताओं को व्यक्त किया जा सकता है जो खुद को इसके लिए उधार देता है। विज़िटर एकल-प्रेषण और ओवरलोडिंग पर निर्भर होने वाले दोहरे-प्रेषण का कार्यान्वयन है और इसका उपयोग किसी भी भाषा में किया जा सकता है जिसमें एकल-प्रेषण और ओवरलोडिंग है। पैटर्न के बारे में जानना अधिक अभिव्यंजक या अधिक पठनीय कोड लिखने में मदद नहीं करता है, यह संबंधित समस्या को हल करने में मदद करता है। इसके बारे में कुछ भी मुहावरेदार नहीं है क्योंकि उदाहरण के लिए उदाहरणार्थ C ++ में आगंतुक का कोई विहित रूप नहीं है।


1
+1; अच्छा उत्तर। थियो मैं अंतिम बिट को छोड़कर यहां सब कुछ विश्वास करने के लिए इच्छुक हूं। ऐसी भाषाएं हैं, जिन्हें कई-प्रेषण के लिए प्रत्यक्ष समर्थन प्राप्त है, इसलिए विज़िटर पैटर्न को वहां मौजूद होने की आवश्यकता नहीं है। उनके दृष्टिकोण से, "पैटर्न" एक मुहावरे का अधिक हो सकता है। परम उच्च-स्तरीय भाषा से, सभी पैटर्न मुहावरे बन सकते हैं ...
मेरलिन मॉर्गन-ग्राहम

@ मर्लिन प्रथम श्रेणी की भाषा की सुविधा को फिर से लागू करने के बारे में क्या मुहावरा है? ये किसने किया था?
ल्यूक डैंटन

यही तो बात है। उस भाषा के उपयोगकर्ता "डिज़ाइन पैटर्न" को एक मुहावरा मानेंगे, क्योंकि उनकी भाषा ठंडी है :)
मेरलिन मॉर्गन-ग्राहम

@ मेरिलिन जो 'मुहावरे' के मेरे उपयोग के लायक नहीं है। भाषा का एक मुहावरा कुछ ऐसा है जिसे आप पहचानने के लिए भाषा के एक यादृच्छिक, कुशल उपयोगकर्ता की अपेक्षा करते हैं; प्रथम श्रेणी की सुविधा को फिर से लागू करने से विदेशी और बाहर की जगह दिखेगी। एकल प्रेषण के लिए कोई C ++ मुहावरा नहीं है, एक बस virtualकुछ स्थानों पर उपयोग करता है जबकि सदस्य तालिका प्रवंचना के लिए हाथ से लिखे गए सूचक बस मूर्खतापूर्ण दिखेंगे।
ल्यूक डैंटन

1
मुझे पसंद है जहां आप मुहावरे की परिभाषा के साथ जा रहे हैं "गरीब आदमी के डिजाइन पैटर्न" की तुलना में अलग है, जो मेरे मॉडल के साथ कैसे व्यवहार करता है (मेरा जवाब देखें)। यह कम है "यहां इसे कैसे लागू किया जाए" और अधिक "यहां इसे लागू करने का सही तरीका है"। उदाहरण के लिए, मैं डिजाइन पैटर्न के लिए "बिग थ्री" विकसित करने की कल्पना नहीं कर सकता। और वाक्य रचना घटक भी है, जैसे do_something() or die "...";(यहाँ पर एक और टिप्पणी से चुराया गया)। यह विशिष्ट भाषा सुविधाओं पर आधारित है, लेकिन यह उन सुविधाओं का उपयोग करने का एक सामान्य तरीका है। यह क्रॉस-भाषा नहीं है, और शायद नहीं होगा।
मेरलिन मॉर्गन-ग्राहम

6

सामान्य अंग्रेजी भाषा की मुहावरे की परिभाषा। एक वाक्यांश है जिसका स्वीकृत अर्थ उपयोग किए गए शब्दों में निहित नहीं है। उदाहरण "बिल्लियों और कुत्तों की बारिश" या "बीफ़ कहाँ है?"

प्रोग्रामिंग भाषाओं में यह आमतौर पर एक वाक्यात्मक शॉर्टकट को संदर्भित करता है जो कोड से तुरंत कुछ स्पष्ट नहीं करता है लेकिन जो अक्सर पर्याप्त होता है जो अन्य प्रोग्रामर तुरंत अर्थ को पहचानते हैं।

पर्ल शायद सबसे मुहावरा समृद्ध भाषा है। निर्माण जैसे:

while (<IN>) {
    print $_
}

जिसका अर्थ एक अनुभवी पर्ल प्रोग्रामर के लिए स्पष्ट है लेकिन किसी और के लिए एक रहस्य है


मुझे लगता है कि "जहां बीफ" एक मुहावरे की तुलना में अधिक यादगार है। वहाँ एक और निरंतरता हो सकती है;) भाषा में कार्यान्वयन की तुलना में एक मुहावरे के लिए और अधिक हो सकता है, क्योंकि चीजें उस मुहावरे का आंशिक या विफल कार्यान्वयन हो सकती हैं - उदाहरण के लिए C ++ का "बिग थ्री"। उस मामले में, मुहावरा "बिग थ्री" का नाम और विवरण है।
मेरलिन मॉर्गन-ग्राहम

2
पर्ल के पास सर्वश्रेष्ठ मुहावरे हैं -do_something() or die "arrrrgh!";
cxfx

2

मुहावरे भाषा विशिष्ट होते हैं। जैसे while (*dest++=*src++);एक C / C ++ मुहावरा है। पास्कल या जावा में दूरस्थ रूप से कुछ लिखना पूरी तरह से असंभव है। "मुहावरे" शब्द का उपयोग करें जैसा कि आप अंग्रेजी में करते हैं। "आप कैसे हैं?" अभिवादन एक मुहावरा है। जर्मन और फ्रेंश जैसी कुछ भाषाओं में एक ही मुहावरा है। लेकिन बहुत सी अन्य भाषाएं अभिवादन के रूप में कुछ इस तरह "पूछ" नहीं सकती हैं। दूसरी ओर ए (ऑब्जेक्ट ओरिएंटेड) पैटर्न आमतौर पर किसी भी भाषा में अनुकूलित किया जा सकता है जो विरासत और प्रतिनिधिमंडल का समर्थन करता है। एक मुहावरा कोड की एक पंक्ति के रूप में सरल हो सकता है। एक डिज़ाइन पैटर्न में हमेशा कई वर्ग शामिल होते हैं।


+1। शुभ अंक:A idiom might be as simple as one line of code. A design pattern always involves several classes.
नवाज़

2

मुझे यह पोस्ट कॉमन सी ++ मुहावरों की खोज करते हुए मिली, क्योंकि मैं हाल ही में इसमें काफी गहरे उतर रहा हूं और चाहूंगा कि मेरा कोड शौकिया तौर पर ऐसा न लगे जैसा कि मुझे लगता है कि ...: -पी

पर्ल के साथ काफी समय बिताने के बाद, मैंने उस भाषा में मुहावरे पाए हैं जो प्राकृतिक भाषाओं में पाए जाते हैं, जैसे कि अंग्रेजी या स्पेनिश (केवल दो मैं कुछ मुहावरों को जानने के लिए पर्याप्त रूप से जानता हूं)।

मैं असहमत हूं कि एक मुहावरा "छोटे डिजाइन पैटर्न" जैसा है। मैं अब भी असहमत हूं, हालांकि इतना कम है कि एक मुहावरा एक भाषा में कमी के आसपास काम करने का एक तरीका है।

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

Perl पर वापस, शायद सबसे अच्छी तरह से ज्ञात मुहावरा " श्वार्टज़ियन ट्रांसफ़ॉर्म " है, एक अभिव्यक्ति जो एक कॉम्पैक्ट और कुशल तरीके से डेटा पर एक प्रकार का प्रदर्शन करती है। यह इस तरह के ऑपरेशन को करने के लिए सबसे स्पष्ट तरीका नहीं है, लेकिन यह रसीला है और जिन लोगों ने इसे देखा है उन्हें तुरंत पता है कि यह क्या कर रहा है।

एक और उल्लेखनीय उदाहरण " द ऑर्किश मेन्यूवर " है, जो सच्चे / झूठे, अमीर ऑपरेटरों और ऑपरेटर पूर्वता की धारणाओं का लाभ उठाता है।

एक जिसे मैं व्यक्तिगत रूप से काफी पसंद करता हूं वह कुछ हद तक ऑर्किश पैंतरेबाज़ी से संबंधित है, लेकिन मुझे इसके लिए कोई नाम नहीं पता है:

push @{ $some_hash{$key} ||= [] }, $some_value;

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

यह भी ध्यान देने योग्य है कि पर्ल 5.14 के रूप में, इस मुहावरे का हिस्सा अप्रचलित है - पुश अब सरणी संदर्भ पर सीधे काम कर सकता है, नहीं @ {} की आवश्यकता है! इसके अलावा, पर्ल 5.10 के अनुसार, एक का उपयोग कर सकते हैं // = के बजाय = = जो सत्य के लिए नहीं बल्कि परिभाषित-नेस के लिए जाँच करता है।


अजगर में some_dict.setdefault(key, []).append(some_value):।
जोनास कोल्कर

0

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


ईवेंट श्रोता एक ऐसी भाषा विशेषता है जो सिग्नल / स्लॉट (पैटर्न?) या ऑब्जर्वर पैटर्न को लागू करती है। C ++ में ऐसी चीजें भी हैं जिन्हें मुहावरे कहा जाता है, जो अन्य भाषाओं (जहां तक ​​मुझे पता है) में कोई फर्क नहीं पड़ता है या फिट नहीं है - उदाहरण के लिए कॉपी-और-स्वैप मुहावरा।
मेरलिन मॉर्गन-ग्राहम

Design patterns are specific implementations of an idiom? बिल्कुल कैसे? क्या आपने मेरे प्रश्न के लिंक में C ++ मुहावरे देखे हैं?
नवाज

0

मैं 100% निश्चित नहीं हूं, लेकिन मुहावरे एक निश्चित क्षेत्र से संबंधित हैं। जब आप "डिज़ाइन पैटर्न" कहते हैं, तो आप "ऑब्ज़र्वर पैटर्न" "चेन ऑफ़ रिस्पांसिबिलिटी" "विज़िटर पैटर्न" "फ़ैक्टरी" के बारे में सोचते हैं। प्रोग्रामिंग में सामान्य समस्याओं को हल करने के लिए ये सामान्य पैटर्न हैं। एक व्यापक सूची के लिए यहां देखें: http://en.wikibooks.org/wiki/C+__gramgramming/Code/Design_Patterns


0

इसका क्या मतलब है? यहाँ "निम्न-स्तर" का क्या अर्थ है?

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

उदाहरण के लिए, एक चर सेट करना यदि यह गलत का मूल्यांकन करता है (सामान्यतः सशर्त रूप से शून्य चर सेट करने के लिए उपयोग किया जाता है)

var ||= some_default_value

0

यहाँ एक घटना को संभालने के लिए एक मुहावरे का उदाहरण है (C # में)। यदि आपको कोई हैंडलर संलग्न नहीं है, तो आपको किसी ईवेंट को आग लगाने की अनुमति नहीं है, इसलिए मुहावरे को हमेशा पहले जांचना है।

इसलिए घटनाओं को संभालने के लिए सामान्य मुहावरा बन जाता है:

EventHandler handler = this.MyEvent;
if ( null != handler ) { handler( param1, param2 ); }

यह मुहावरा C # भाषा के लिए विशिष्ट (यद्यपि अनन्य नहीं) है।

आमतौर पर हालांकि, C # ईवेंटिंग तंत्र पर्यवेक्षक डिजाइन पैटर्न का एक उदाहरण है जिसे किसी भी भाषा में लागू किया जा सकता है।

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