अगर ('स्थिर' == $ चर) बनाम तो ($ चर == 'स्थिर')


48

हाल ही में, मैं PHP में और विशेष रूप से वर्डप्रेस ढांचे के भीतर बहुत काम कर रहा हूं। मैं बहुत सारे कोड के रूप में देख रहा हूँ:

if ( 1 == $options['postlink'] )

जहाँ मुझे देखने की उम्मीद होगी:

if ( $options['postlink'] == 1 )

क्या यह सम्मेलन कुछ भाषाओं / रूपरेखाओं में पाया जाता है? क्या कोई कारण है कि पूर्व दृष्टिकोण उत्तरार्द्ध (प्रसंस्करण के दृष्टिकोण से, या एक पार्सिंग परिप्रेक्ष्य या यहां तक ​​कि एक मानवीय दृष्टिकोण से बेहतर है)?

या यह केवल स्वाद की बात है? मैंने हमेशा एक परीक्षण करते समय यह बेहतर सोचा है कि कुछ स्थिर के खिलाफ परीक्षण किया जा रहा चर आइटम बाईं ओर है। यह उस तरह से बेहतर लगता है जिस तरह से हम प्राकृतिक भाषा में सवाल पूछेंगे: "अगर केक चॉकलेट है" बजाय "अगर चॉकलेट केक है"।


1
मैं कभी भी इस तरह का कोड नहीं लिखता लेकिन निष्पक्ष होना "अगर चॉकलेट केक का स्वाद है" ध्वनि स्वाभाविक है। प्राकृतिक भाषा अधिक लचीली होती है।
रिक स्लैडकी

4
@ क्लिक करें यह भाषा में स्वाभाविक लग सकता है, लेकिन आप इससे इनकार नहीं कर सकते हैं कि जब आप उस तरह का कोड देखते हैं, तो आपको यह सोचने के लिए पहले रुकना होगा (शायद केवल एक सेकंड के लिए) यह क्या करना है।
एडगर गोंजालेज

4
@ एडगर गोंजालेज: सहमत, मैं इसके खिलाफ कोड में दृढ़ता से हूं।
रिक स्लैडकी

3
कोड 19 का कोड पूरा 2 संस्करण ("बूलियन एक्सप्रेशंस: बूलियन एक्सप्रेशंस के साथ कॉमन प्रॉब्लम्स" के तहत) वास्तव में इस अभ्यास को यहां दिए गए कई उत्तरों में बताए गए सटीक कारण के लिए सुझाता है: सी-व्युत्पन्न भाषाओं में असाइनमेंट को रोकने के लिए जब तुलना का मतलब था ।
क्रेगटीपी

4
मैंने अक्सर इन्हें "योडा कंडीशन" के रूप में संदर्भित किया है
ब्रायन

जवाबों:


83

ऐसा करने का मुख्य कारण (तथाकथित "योदा सशर्त") दुर्घटनाओं को रोकना है जिससे आप गलती =से बराबर तुलना ऑपरेटर ( ==) के बजाय असाइनमेंट ऑपरेटर ( ) का उपयोग करते हैं ।

यानी, अगर आपने गलती की है:

$foo = 5;
if ($foo = 1) {
  // Stuff
}

कथन trueकुछ भाषाओं के मामले में (या, एक PHP- एक सत्य मूल्य की तरह) मूल्यांकन करेगा और आपके पास एक मुश्किल-से-पाया हुआ बग होगा।

लेकिन अगर आपने किया:

$foo = 5;
if (1 = $foo) {
  // Stuff
}

आपको एक घातक त्रुटि प्राप्त होगी क्योंकि आप $fooकिसी पूर्णांक को निर्दिष्ट नहीं कर सकते ।

लेकिन जैसा कि आपने बताया, आदेश को उलट देना आमतौर पर चीजों को कम पठनीय बनाता है। तो, कई कोडिंग मानक (लेकिन सभी, वर्डप्रेस सहित ) $foo == 1बग के शिकार लाभों के बावजूद सुझाव या आवश्यकता नहीं है 1 == $foo

आम तौर पर, मेरी सलाह यह है कि जो भी स्थापित कोडिंग मानक है उसका पालन करना है, अगर एक है: वर्डप्रेस के लिए, इसका मतलब है कि योडा सशर्त का उपयोग करना।

जब वहाँ नहीं है, और अपने साथियों के साथ आम सहमति के माध्यम से इसे स्थापित करना असंभव है, तो यह डीलर की पसंद है।


2
मुझे याद है कि किसी भाषा को डिजाइन करते समय (बहुत समय पहले) कि हमने इस तरह की परेशानी से बचने के लिए विशेष रूप :=से असाइनमेंट ऑपरेटर ( ==समानता परीक्षण के साथ) बनाया था।
डोनाल्ड फेलो

7
मैंने कई, कई, कोड की पंक्तियाँ लिखी हैं, और मैंने इसके बजाय कभी गलती से टाइप नहीं= किया है ==। यह अंतर हर जगह इतना बढ़ गया है कि मैं उन्हें कभी भ्रमित नहीं कर पाया। दूसरी ओर, मैंने कोड के कई टुकड़े पढ़े हैं जो भ्रामक हैं या अन्यथा समझने में कठिन हैं। जैसे, मैं प्राथमिकताओं को पठनीयता पर रखूंगा :)। भले ही, अच्छा जवाब।
पागल

5
अभी तक एक और अच्छा कारण का उपयोग करें -Wall -Werrorया अपने संकलक / दुभाषिया के समकक्ष है। बहुत कम स्थितियाँ ऐसी होती हैं जहाँ किसी शर्त के अंदर एक असाइनमेंट सही होता है, अकेले और अधिक पढ़ने योग्य होने दें। बहुत सी भाषाएं भी इसकी अनुमति नहीं देती हैं।
कार्ल ब्वेलफेल्ट

7
पीडिएटिक: जबकि कुछ भाषाओं में if($foo = 1)मूल्यांकन होता trueहै, PHP में इसके बजाय 1 का मूल्यांकन होता है; if($foo = 20)20 को मूल्यांकन करता है; if($foo = 0)0 का मूल्यांकन करता है, जो दूसरों के विपरीत गलत है। यह बग के लिए जटिलता की एक पूरी 'nother परत जोड़ सकता है।
चार्ल्स

2
दरअसल, वर्डप्रेस कोडिंग स्टैंडर्ड्स Yoda कंडीशन्स के
टॉम

13

यह एक रक्षात्मक कोडिंग तंत्र है जो असाइनमेंट ऑपरेटर के आकस्मिक उपयोग को रोकने के लिए है।

समानता ऑपरेटर के स्थान पर असाइनमेंट ऑपरेटर के दुरुपयोग / त्रुटि पर विचार करें

if ( $options['postlink'] = 1  )

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

if( 1 = $options['postlink'])

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


9

मैं एक शून्य सूचक अपवाद की संभावना को दूर करने के लिए जावा में उस सम्मेलन का उपयोग करना पसंद करता हूं। तो ऐसा कुछ होने से आपको कोई समस्या नहीं होगी या किसी अतिरिक्त कोड की आवश्यकता होगी:

String foo = null;

if ("bar".equals(foo))
{
    //Do something
}

3
मुझे यह पसंद है, लेकिन मैं सामान्य मुहावरे से नफरत करता हूं।
थॉमस ईडिंग

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

6
यह समस्याओं का सामना करने का एक आसान तरीका है। कालीन के अंदर सिकोड़कर धूल को साफ नहीं किया जाता है।
रेयान

0

व्यवहार में, कई संकलक आपको चेतावनी देंगे यदि आप "if (x = 1)" के बजाय "if (x == 1)" लिखते हैं, क्योंकि यह सबसे अधिक गलती है।

क्लैंग के साथ, आप संकलक "मेरा मतलब है, और मुझे पता है कि मैं क्या कर रहा हूं" को प्रभावी ढंग से बताकर चेतावनी से बच सकता हूं, और यह "if ((x = 1))" लिखकर किया जाता है। अतिरिक्त कोष्ठकों पर ध्यान दें। जो अन्य स्थितियों में भी काम करता है। अगर (झूठा) बयान; आपको एक चेतावनी दे सकता है कि कथन कभी निष्पादित नहीं होता है; अगर (गलत) बयान; वह चेतावनी नहीं देता।


मुझे वह बहुत पसंद है! मैं PHP में निम्नलिखित, पूरी तरह से कानूनी मुहावरे से बचता हूँ क्योंकि मुझे हमेशा अपनी IDE में चेतावनी मिलती है:if ($array = getSomething()){ // ..so something with $array }
टॉम ऑगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.