क्यों (स्थिति <आकार) सशर्त में ऐसा प्रचलित पैटर्न है?


9

एक शर्त बयान में (IF) हर कोई उपयोग करता है (position < size), लेकिन क्यों?
केवल सम्मेलन या उसके लिए एक अच्छा कारण है?

जंगल में मिला:

if (pos < array.length) {
   // do some with array[pos];
}

शायद ही कभी पाया:

if (array.length > pos) {
   // do some with array[pos];
}

7
एक मामला जहां मुझे कोई आपत्ति नहीं है कि दाईं ओर "चर" है if (MIN <= x && x <= MAX)। ( कुछ भाषाओं MIN <= x <= MAXमें इसे C के रूप में लिखा जा सकता है, यह पूरी तरह से कानूनी है लेकिन इसका मतलब यह नहीं है कि आप इसका मतलब क्या समझ सकते हैं)।
कीथ थॉम्पसन


5
इस बात से संबंधित हो सकता है कि अंतराल कैसे लिखे जाते हैं [min, max]और क्या नहीं [max, min]। इसलिए, यह केवल एक तत्व की तुलना में जांच करने के लिए स्वाभाविक है xअंतराल लेखन से संबंधित है min <= x <= max
एंड्रेस एफ।

क्या एक conumdrum
ट्यूलेंस कोर्डोवा

दूसरा उदाहरण आगे स्पष्ट किया जा सकता है जैसे कि (((array.lengh <= pos)) ...
OldFart

जवाबों:


48

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

एकमात्र सामान्य अपवाद तब है जब समानता के लिए परीक्षण कुछ प्रोग्रामर बग के बजाय आम से बचने के लिए विपरीत क्रम ( योडा परिस्थितियों के रूप में जाना जाता है ) का उपयोग करने के लिए खुद को प्रशिक्षित करते हैं - मैं इस विचार के साथ पकड़ नहीं रखता हूं क्योंकि मुझे वर्णित प्राकृतिक आदेश मिला है अधिक पठनीय के ऊपर, मुख्य रूप से क्योंकि यह वह तरीका है जिससे हम अंग्रेजी में विचार व्यक्त करते हैं, और क्योंकि अधिकांश आधुनिक संकलक इसका पता लगाएंगे और चेतावनी जारी करेंगे।variable = constantvariable == constant


3
आपके विकास उपकरण के आधार पर, कई लोग variable = constantनिर्माण पर चेतावनी (या त्रुटि) भी देंगे ।
गैलेक्टिक

5
+1। constant == variableघटना पर अधिक जानकारी के लिए "योदा स्थितियां" खोजें ।
जॉन एम गैंट

मैंने हाल ही में अपने स्वयं के कोड बेस में यह देखा है (उदाहरण के लिए if(DBNull == row["fieldName"]) methodCall()अगर मैं पागल हो रहा था, तो मुझे आश्चर्य होगा क्योंकि ज्यादातर समय मैंने इसे दूसरे तरीके से देखा है।
एंड्रयू ग्रे

1
मैं यह भी जोड़ूंगा कि (position < size)अक्सर एक ऊपरी सीमा व्यक्त होती है, इसलिए इसके ऊपरी हिस्से के lowerbound <= position < upperboundआकार के साथ, इसके हिस्से को बहाल करना है। स्पष्ट रूप से दो बाधाओं के साथ, positionकेवल मध्य में जा सकते हैं।
223 पर स्टीव 314

4
यह शायद भाषा से संबंधित है; हम " X ऑपरेटर Y " को " X is ( ऑपरेटर Y )" कहते हैं, जैसे संबंध X का लक्षण है । तुलना पूछकर, हम पूछ रहे हैं कि क्या एक्स का अच्छा या बुरा मूल्य है (और वाई को स्थानीय रूप से एक स्थिर माना जाता है)। "Pos <array.length" पूछने पर ऐसा लगता है कि पूछना: "क्या स्थिति ठीक है (सरणी लंबाई से छोटी है)?" यदि नहीं, तो स्थिति के बारे में कुछ गलत है; मुझे एक और पद दो, और मुझे वह करने में खुशी होगी जो तुम चाहते थे। लेकिन सरणी की लंबाई के बारे में कुछ भी गलत नहीं है। "Array.length> pos" पूछने पर लगता है कि अगर यह बहुत छोटा है तो हमें सरणी को बढ़ाना चाहिए।

14

इसके लिए मैंने जो एकमात्र औचित्य देखा है, वह यह है कि यह स्कूल में सीखी गई संख्या रेखाओं या अन्य आदेश देने वाली चीजों की तरह है। उदाहरण के लिए, हम संख्या रेखाएँ इस तरह लिखते हैं:

<--|--|--|--|--|--|-->
   1  2  3  4  5  6

छोटी चीजें बड़ी चीजों के बाईं ओर दिखाई देती हैं। यही बात अन्य बातों पर भी लागू होती है जैसे कि तिथियां (एक कैलेंडर कैसे निर्धारित किया जाता है)।

यह मूल रूप से उबलता है कि हम स्वाभाविक रूप से चीजों के क्रम के बारे में कैसे सोचते हैं। पहले फॉर्म को पढ़ना आसान है क्योंकि आपको इस पर ज्यादा मेंटल प्रोसेसिंग नहीं करनी है।


1
आपका मतलब है कि छोटे मूल्य का मूल्यांकन करने वाली अभिव्यक्ति पहले स्थिति में आती है? यदि आप मानों को रनटाइम बदलते हैं तो आप कैसे सुनिश्चित हो सकते हैं कि यह सच होगा?
ट्यूलेंस कोर्डोवा

@ user61852 आपको यह जानने की आवश्यकता नहीं है कि रनटाइम पर मान क्या हैं। Ex: मेरे पास 2 मान हैं जो मैं रनटाइम वैल्यूए और वैल्यूबी पर गणना करता हूं और मैं यह परीक्षण करना चाहता हूं कि वैल्यूएबी से मूल्य छोटा है। मैं "if (valueA <valueB)" लिखूंगा। क्या valueA समाप्त होता है, valueB की तुलना में छोटा होने के कारण यह स्थिर है इसका आसान (मेरे लिए कम से कम) उस पर गौर करना और यह जानना कि मैं देख रहा हूं जब valueA valueB से छोटा है। अगर मुझे "if (valueB> valueA)" देखना था, तो मुझे रोकना होगा और सोचना होगा कि कोड की इस शाखा का पालन करने पर मैं कौन सी छोटी बात है।
बेज़ुब

1
मैं गलत समझ गया। मैंने जवाब को वोट दिया। अब मैं इसे वोट देना चाहता हूं, लेकिन साइट से जवाब मांगे जाने चाहिए ताकि मैं अपना वोट बदल सकूं। कृपया कुछ संपादन करें ताकि मैं इसे वोट कर सकूं।
ट्यूलेंस कोर्डोवा

@ user61852 अब आपको अपना वोट बदलने में सक्षम होना चाहिए।
बेज़ुब

11

हालांकि यह मुख्य रूप से सम्मेलन की बात है, यह मेरी राय है कि यह सबसे अच्छा तरीका है जो हम सोचते हैं - यह उस आइटम को दर्शाता है जिस पर हम जोर देते हैं।

यदि हम इन्हें अंग्रेजी में अनुवाद करते हैं, तो यह वाक्यांश होगा "यदि स्थिति सरणी लंबाई से कम है", जहां वाक्य का विषय क्षणिक वस्तु है।

इसे दूसरे तरीके से व्यक्त करने के लिए, "यदि सरणी की लंबाई स्थिति से अधिक है" विषय में सरणी की लंबाई (एक निश्चित मान माना जाता है) डालता है और स्थिति (क्षणिक) प्रत्यक्ष वस्तु बन जाती है।


3
वास्तव में (आपके अंतिम वाक्य में) स्थिति एक पूर्वसर्ग की वस्तु बन जाती है। लेकिन आप जो कहना चाह रहे हैं उससे मैं सहमत हूं। भाषा विज्ञान में हम कहेंगे कि स्थिति विषय है , और "सरणी लंबाई से कम" टिप्पणी है । "सामयिक घटक वाक्य को शुरू में रखने की प्रवृत्ति (शुरुआत में विषय) व्यापक है।" en.wikipedia.org/wiki/…
LarsH

4

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

यह आधी-अधूरी बनाम आधी-अधूरी चर्चा की तरह है। गणितीय रूप से समान है, लेकिन मेरा मस्तिष्क उन्हें संदर्भ के आधार पर अलग तरह से देखेगा।

निजी तौर पर, अगर मैं देखता हूं

if (array.lengh > pos) {
    // do some with array[pos];
}

मैं इस बारे में सोचना शुरू करूंगा कि क्या बग है और क्या प्रोग्रामर का मतलब है। क्या वह सीमा-जाँच के अलावा कुछ करने की कोशिश कर रहा है?

शायद मैं सिर्फ उज्ज्वल नहीं हूं, लेकिन अगर मुझे कोड की प्रत्येक पंक्ति पर उस तरह का विश्लेषण करना है, तो मेरा मस्तिष्क दर्द होता है।


3

यह व्यक्त करने के लिए कि कुछ लोगों ने अलग तरीके से क्या पाने की कोशिश की है ...

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

भाषा विज्ञान में, एक वाक्य का विषय वह है जिसके बारे में बात की जा रही है, और टिप्पणी है कि विषय के बारे में क्या कहा जा रहा है। इस उदाहरण में, हम मान सकते हैं कि positionयह विषय है , और "सरणी लंबाई से कम" टिप्पणी है । अंग्रेजी में, और कई अन्य भाषाओं में, विषय आमतौर पर टिप्पणी से पहले व्यक्त किया जाता है।
" सामयिक घटक वाक्य को शुरू में रखने की प्रवृत्ति (शुरुआत में विषय) व्यापक है। "

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


1

यह दो चीजों का एक संयोजन है, दोनों अंतर्निहित कोडांतरक से आ रहे हैं जो शुरुआती भाषाओं में संकलित हो गए (और बहुत से वर्तमान भी)।

  1. मेमोरी में एरर शून्य-आधारित ऑफ़सेट हैं (अर्थात डेटा का पहला हिस्सा आवंटित मेमोरी ब्लॉक की शुरुआत में है ... 0-इंडेक्स)। इसलिए अलग-अलग टुकड़े के लिए 0..n-1 का उपयोग।

  2. यदि कोई मान किसी अन्य मान (या रजिस्टर, आदि) से कम है, तो आमतौर पर एक निर्देश है। इसलिए सरल कम-से (<) ऑपरेटर का उपयोग।

इसलिए, पैटर्न पुराने समय के असेंबलर से ANSI-C (जो कुछ मायनों में मैक्रो असेम्बलर की तरह अधिक है) और वहाँ से जावा और अन्य C- जैसी भाषाओं में स्थानांतरित हो गया।


0

जैसा कि कई अन्य जवाबों ने कहा है, यह पढ़ना बहुत आसान है:

[thing that varies] [comparison] [thing that does not vary]

लगभग हर कोई जानता है कि मैं इस शैली का विशेष रूप से उपयोग करता हूं।

सी-स्टाइल भाषाओं के लिए एक अपवाद है, जो =असाइनमेंट और ==तुलना के लिए उपयोग करते हैं । यदि आप गलती से टाइप करते हैं:

if (variable = 5) ...

के बजाय:

if (variable == 5) ...

तब आपको एक त्रुटि नहीं मिलेगी क्योंकि यह कोड की एक वैध रेखा है। (कुछ संकलक और आईडीई आपको ऐसा करने के बारे में चेतावनी देंगे, लेकिन इस तरह के सरल टाइपो को रखना अभी भी बहुत आसान है।)

हालाँकि, यदि आप लिखते हैं:

if (5 == variable) ...

संकलक / दुभाषिया त्रुटि करेगा क्योंकि यह एक वैध निर्माण नहीं है (ज्यादातर भाषाओं में, वैसे भी)।

इस स्विच-अराउंड को अक्सर योडा कंडीशन कहा जाता है ।

अद्यतन : यहां उन स्थानों की एक सूची दी गई है जहां योडा स्थितियां उपयोगी हैं


-1

व्यक्तिगत रूप से, मुझे यह पसंद है:

bool positionIsWithinBounds = pos < array.length;
if (positionIsWithinBounds) {
   // do some with array[pos];
}

... यह अधिक कोड है, लेकिन पढ़ने में भी बहुत आसान है।


4
तुलना को एक नाम देने के लिए +1। वास्तव में, हालांकि, मैं इस दृष्टिकोण को अधिक जटिल परिस्थितियों के लिए बेहतर पसंद करता हूं, और इस तरह के सरल मामलों के लिए इतना नहीं। यह वास्तव में मुझे "सरणी", "सीमा", "भीतर" के बारे में सोचने के लिए रोक देता है, और उन सभी का क्या मतलब है, जब मैं सहज रूप से जानता हूं कि इसका क्या मतलब posहै > array.length। दूसरे शब्दों में, भले ही यह सशर्त के अर्थ को बहुत स्पष्ट करता है, यह वास्तव में आईएमओ को पढ़ने के लिए थोड़ा कठिन बनाता है।
जॉन एम गैंट

अभी तक एक और नाम ... का ट्रैक रखने के लिए ...
Deduplicator

-1

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

  1. हमेशा "विषय" को पहले रखें (इसे एक वाक्य के रूप में सोचें) - वह मान जो परीक्षण के बारे में है। इसलिए उदाहरण के लिए आप लिखेंगेif (age>5)

  2. या हमेशा छोटे तत्व को पहले रखें (यह मान लें कि मान आपके प्राकृतिक क्रम में स्क्रीन पर दिए गए हैं)। इसलिए उदाहरण के लिए आप if (a<b)इस बात की परवाह किए बिना लिखेंगे कि क्या यह कोड ज्यादातर या बी के बारे में है।

दोनों सम्मेलनों में आप पहले स्निपेट को दूसरे के बजाय दिखाने की सलाह देंगे, इसलिए मुझे लगता है कि इस विशेष मामले में आपके पास आपका जवाब होगा। मैं कहूंगा कि यहाँ (1) और (2) दोनों का उल्लंघन करने वाले कोड लिखने से बचना बुद्धिमानी है, क्योंकि ज्यादातर लोगों के लिए इसे पढ़ना मुश्किल हो जाएगा।

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