मुहावरेदार क्या है?


19

मैं एक "मुहावरा" को एक सामान्य ऑपरेशन या पैटर्न समझता हूं जो किसी विशेष भाषा में मूल भाषा सिंटैक्स द्वारा सरल नहीं होता है, जैसे पूर्णांक वृद्धि:

i = i + 1;

C ++ में, इस मुहावरे को एक ऑपरेटर द्वारा सरल बनाया गया है:

++i;

हालांकि, जब कोई "मुहावरेदार" शब्द का उपयोग करता है, तो मुझे यकीन नहीं है कि इसे कैसे समझा जाए। कोड का एक टुकड़ा "मुहावरेदार" क्या बनाता है?


यह english.stackexchange.com पर उतना ही है जितना कि यह यहाँ है।
S.Lott

@ perl.j: व्यावहारिक। आपने वास्तव में स्पष्ट किया है कि "Idiomatic" की परिभाषा english.stackexchange.com में क्यों नहीं है। बहुत मददगार।
S.Lott

जवाबों:


24

कुछ कोड लिखने का एक मुहावरेदार तरीका यह है कि जब आप इसे भाषा-विशिष्ट मुहावरों के कारण बहुत विशिष्ट तरीके से लिखते हैं जो अन्य भाषाओं में हैं।

उदाहरण के लिए, C ++ में, RAII मुहावरे का शोषण C ++ कोड प्रबंधन संसाधनों को लिखने के तरीकों की ओर जाता है जो मुहावरेदार हैं।

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

अक्सर, इस भाषा के लिए मुहावरों का उपयोग किए बिना एक नई भाषा की कोशिश करने वाला कोई व्यक्ति मुहावरेदार कोड नहीं लिखेगा।


बहुत बढ़िया वर्णन। इसलिए C # में, अगर मैं TryAdd()जेनेरिक Dictionaryक्लास में पहले !Contains()कॉल करने के लिए कॉल करने के लिए एक एक्सटेंशन विधि बनाता हूं और फिर कॉल करता हूं, तो Add()यह मुहावरा होगा? मैं C # एक्सटेंशन विधियों के लिए विशिष्ट सुविधा का उपयोग कर रहा हूं।
void.pointer

1
मुझे यकीन नहीं है कि अधिकांश अनुभवी सी ++ कोडर आपको सदस्यों को जोड़ने के बजाय कक्षाओं का विस्तार करने के लिए नि: शुल्क फ़ंक्शन लिखने के लिए कहेंगे, जहां संभव हो। यह C # एक्सटेंशन के तरीकों के समान नहीं है, लेकिन यह किसी भी भाषा के बहुत पास है और उपलब्ध है जो मुफ्त कार्यों की अनुमति देता है। मुझे यकीन है कि गुण # आईएस मुहावरेदार का उपयोग करके सी # में "सेट / गेटर्स" को लिखना है।
बजे

लेकिन यह C ++ नहीं है, इसलिए "C ++ तरीका" का उपयोग करना "मुहावरेदार" पर्याप्त नहीं हो सकता है। यहाँ एक विस्तार विधि का उपयोग करना उचित है और बहुत ही C # जैसा है। किसी भी मामले में यह एक उदाहरण था, लेकिन विस्तार के तरीके C # के लिए बहुत मुहावरेदार हैं।
void.pointer

हाँ, इसीलिए मैंने कहा "मुझे यकीन नहीं है", यह मुहावरा लगता है लेकिन यह अन्य भाषाओं की अन्य बुनियादी विशेषताओं के इतने करीब है कि मुझे यकीन नहीं है (क्योंकि मैं सी # देव नहीं हूं)। मेरे पास एक और उदाहरण है: लूपिंग सभी कार्यात्मक भाषाओं में पुनरावृत्ति द्वारा किया जाता है। आप इसे अन्य भाषाओं में कर सकते हैं, लेकिन स्पष्ट रूप से यह कार्यात्मक भाषाओं के लिए मुहावरेदार है। यकीन नहीं होता अगर यह मदद करता है।
१२:१४ बजे १२

1
बेशक अजगर एक मुहावरेदार कोड, यानी पाइरोनिक का जिक्र करते हुए एक कदम आगे निकल जाता है। * 8 ')
मार्क बूथ

12

सामान्य परिभाषा

उन भावों का उपयोग करना, युक्त या निरूपित करना, जो मूल वक्ता के लिए स्वाभाविक हैं

प्रोग्रामिंग परिभाषा

एक [सम्मिलित भाषा] प्रोग्रामर के लिए स्वाभाविक है कि अभिव्यक्ति का उपयोग करना, युक्त या निरूपित करना


1
अगर मुझे लगता है कि इस शब्द के लिए "Google" की परिभाषाएँ सहायक थीं तो मैंने यहाँ पोस्ट नहीं किया होगा। मैं उदाहरणों के साथ एक बेहतर विवरण (ट्यूटोरियल जैसा) चाहता था।
void.pointer

3
@ रॉबर्ट - मुझे लगता है मुझे समझ में नहीं आता कि आप क्यों नहीं समझते।
ChaosPandion

2
मैंने पहले आपका उत्तर पढ़ा, यह बिल्कुल स्पष्ट नहीं था। उस प्रतिक्रिया को पढ़ने के बाद जो अब मेरे उत्तर के रूप में चिह्नित है, यह बहुत स्पष्ट हो गया कि "मुहावरेदार" का क्या मतलब था और मैं अब इसे समझता हूं। अब जब मैंने आपके उत्तर को पढ़ा तो यह समझ में आता है। हालाँकि, आपने मुझे उदाहरणों और विभिन्न परिदृश्यों के माध्यम से नहीं चलाया, यही वजह है कि मुझे लगता है कि आपका उत्तर उतना उपयोगी नहीं था। आपने एक "वेबस्टर" प्रतिक्रिया दी, जो तकनीकी रूप से सही है, लेकिन जहाँ तक मुझे समझने में मदद करने में सहायक नहीं है। मैं आपकी मदद की सराहना करता हूं।
void.pointer

8

प्रोग्रामिंग के संदर्भ में मुहावरे को आमतौर पर "किसी भाषा में कुछ व्यक्त करने का सबसे स्वाभाविक तरीका" के रूप में परिभाषित किया जा सकता है।

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

ध्यान दें कि सिर्फ इसलिए कि कोड का एक टुकड़ा मुहावरेदार है, इसका मतलब यह नहीं है कि यह साफ है या संक्षिप्त भी है। कई बार आपको समझौता करना चाहिए।

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

उदाहरण के लिए मुहावरेदार अंग्रेजी इस क्षेत्र पर निर्भर कर सकती है। इस शब्द bumका प्रयोग शायद मुहावरेदार यूके अंग्रेजी के लिए आवश्यक है, जबकि buttयूएस अंग्रेजी के लिए अधिक उपयुक्त है। (मैं बहुत ब्रिटेन अंग्रेजी दुख की बात नहीं जानता: /)


धन्यवाद (उत्कीर्ण), मुझे लगता है कि आपकी परिभाषा मेरे लिए मौके पर ही सही!
आशमन किंगपिन

3

सबसे अच्छा उदाहरण मैं अपने सिर के ऊपर से निकाल सकता हूं, जो कुछ मुहावरेदार है, रूबी से आता है।

भाषाओं के धन में, आप इसके साथ पुनरावृति कर सकते हैं:

for( start; end; increment){
    code;
}

या कुछ बहुत समान है। कई भाषाओं में एक foreach(x in SetOfXes)निर्माण भी है । लेकिन रूबी के लिए यह मुहावरा है कि चीजों में शामिल हैं:

collection.each do |current|
  current.do_stuff
end

और भी

10.times do |x|
  puts x
end

मैं इन्हें मुहावरेदार के रूप में देखता हूं क्योंकि वे कुछ ऐसा करने का एक तरीका पेश करते हैं जो कम आम है, और जो इसके डोमेन के दर्शन के मूल में कुछ का प्रतिनिधित्व करता है। रूबी के पास वस्तुओं के साथ बातचीत के बारे में एक दर्शन है जो अद्वितीय नहीं है, लेकिन सर्वव्यापी नहीं है।

एक शब्दार्थ नोट पर, जब भी मैं मुहावरेदार शब्द सुनता हूं, तो मेरा मस्तिष्क स्वचालित रूप से "मुहावरेदार ..." के रूप में विचार को पूरा करता है - मैं केवल एक विशिष्ट विषय से संबंधित के रूप में इसे स्पष्ट रूप से पार्स करता हूं।


कैसे collection.each do |current|अलग है foreach(current in collection)? दोनों लूप कंस्ट्रक्शन हैं जो currentप्रत्येक तत्व के लिए सेट हैं collection
MSalters

2

मुहावरे आम तौर पर एक भाषा में एक आम, अपेक्षाकृत जटिल स्थिति को व्यक्त करने का सबसे अच्छा संभव तरीका है। इंक्रीमेंट करना एक मुहावरा या कुछ भी नहीं है। पोस्टफ़िक्स के बजाय प्रीफ़िक्स इंक्रीमेंट का उपयोग करके, आप C ++ मुहावरा होने का तर्क दे सकते हैं।

विशेषज्ञ उपयोगकर्ताओं द्वारा निर्धारित भाषा का उपयोग करने के लिए मुहावरे सबसे अच्छा तरीका है। एक वास्तविक C ++ मुहावरा फ़ंक्शन ऑब्जेक्ट होगा। एक और मुहावरा RAII होगा। भाषा में ऐसा कुछ भी नहीं है जो आपको बताए कि आपको विध्वंसक में संसाधनों को मुक्त करना होगा। लेकिन ऐसा करना मुहावरेदार है। एक अन्य उदाहरण टेम्पलेट है- यह अच्छी तरह से सब कुछ आप कर सकते हैं के लिए टेम्पलेट्स का उपयोग करने के लिए मुहावरेदार है, लेकिन वहाँ कुछ भी नहीं रोक रहा है आप विरासत का उपयोग कर।


विकिपीडिया एक उदाहरण के रूप में वेतन वृद्धि का उपयोग करता है, इसलिए मैंने अपने प्रश्न में इसका उल्लेख किया है। मुहावरों को जटिल होने की आवश्यकता क्यों है? यह अन्य उत्तरों के आधार पर परिभाषा का हिस्सा नहीं लगता है।
void.pointer

4
@ रॉबर्ट डेली: वेतन वृद्धि संभवतः एक मुहावरा कैसे हो सकता है? यह भाषा का हिस्सा है । मुहावरों को भाषा के उपयोगकर्ताओं द्वारा बनाया जाता है, वे समय के साथ बदलते हैं। इंक्रीमेंट करना एक मुहावरा नहीं है, यह भाषा की बुनियादी कार्यक्षमता है। उस तर्क को लेते हुए, मैं कह सकता था कि कोई भी अन्य मूल भाषा फ़ंक्शन एक मुहावरा है, और इसलिए हर कार्यक्रम मुहावरेदार है, जो कि यह नहीं है।
डेडएमजी जूल

2

आपकी परिभाषा मुझे सही नहीं बताती है। एक मुहावरा कुछ लिखने का एक तरीका है जो अन्य भाषाओं में संभव हो सकता है या नहीं हो सकता है, लेकिन इस भाषा में यह आम बात है। आमतौर पर, यह विकल्प से कम है, लेकिन यह वास्तव में एक आवश्यकता नहीं है।

गैर-मुहावरेदार क्या है, इसके बारे में बात करके इसे समझाना आसान हो सकता है। C ++ में, यह लिखने के लिए बहुत मुहावरेदार है:

Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y);
if(p)
{
 // whatever
}

यह लिखना और भी अधिक मुहावरेदार है:

Foo* p; 
if(p = SomeThingThatReturnsAFooPointer(arg, param, x, y))
{
 // whatever
}

यह कोड बिल्कुल वैसा ही काम करता है - कुछ लोग जो C ++ में नए हैं, वे यह देखने के लिए परीक्षण के रूप में पढ़ सकते हैं कि पी क्या फ़ंक्शन के बराबर है, लेकिन यह ऐसा नहीं करता है।

जो कोई लिख सकता है, उसकी तुलना बहुत गैर-मुहावरेदार, जो किसी अन्य भाषा से हुई हो:

Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y);
if(p !=NULL)
{
 // whatever
}

आप इस सामान को गैर-मुहावरेदार के रूप में भी देखेंगे:

if (x>0)
  return true;
else
 return false;

क्योंकि मुहावरेदार दृष्टिकोण है

return (x>0);

गैर-मुहावरेदार तरीके गलत नहीं हैं, लेकिन वे आमतौर पर टाइप करने में अधिक समय लेते हैं और वे हमेशा पढ़ने में अधिक समय लेते हैं, जो उन मुहावरों को जानते हैं। अगर मैं आपको "उस लड़के को बुलाता हूं जो भेड़िया रोया था" और आप कहानी जानते हैं, तो इससे भी तेज है अगर मैं इस बारे में समझाऊं कि कैसे झूठे अलार्म लोगों को आपकी उपेक्षा करने का कारण बनाते हैं। समस्या, निश्चित रूप से, यदि आप कहानी नहीं जानते हैं और यह नहीं जानते कि भेड़ियों का हमें क्या लेना-देना है। इसी तरह, यह एक समस्या हो सकती है यदि आपने पहले कभी नहीं देखा है return x<y;और वास्तव में यह नहीं जानता कि यह क्या करता है।


1
मुहावरेदार दृष्टिकोण निश्चित रूप से सूचक घोषित करने के लिए किया जाएगा में अगर हालत, इतना है कि यह अगर यह शून्य नहीं है कभी नहीं पहुँचा जा सकता है। if(Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y))
डेडएमजी जूल

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

1

जब किसी चीज़ को व्यक्त करने के कई तरीके होते हैं, तो सबसे आम या आमतौर पर स्वीकृत तरीका। उदाहरण के लिए, गोटो कथनों का उपयोग करते हुए सटीक समकक्ष के बजाय सी में एक संरचित कथन का उपयोग करना।

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