2008-11-25 12 views
21

मैं PHP 6.5 के लिए नेटबीन का उपयोग कर रहा हूं।शर्तों में असाइनमेंट क्यों खराब हैं?

if (($row = $db->get_row($sql))) { 
     return $row->folder; 
    } else { 
     return FALSE; 
    } 

Netbeans मुझसे कहता है कि मैं अगर बयान में कार्य नहीं का उपयोग करना चाहिए:

मेरी कोड में मैं अक्सर आदेश निम्न प्रकार का उपयोग करें।

क्यों? , हालांकि मैं एक वातावरण बहुत चालाक है कि के बारे में चेतावनी देने के लिए, यह भी बहुत चालाक "के लिए ओह होने की अपेक्षा करेंगे

if(a = b) 
    //logic error 

:

+0

मैं सोचा होगा कि डबल कोष्ठक (काम के आसपास कोष्ठक) इंगित करना चाहिए कि काम जानबूझकर है कर सकते हैं। कुछ कंपाइलर्स मुझे लगता है कि इस मामले में चेतावनी दबाने। – Draemon

+0

मार्क का उत्तर देखें: http://stackoverflow.com/a/2576969/560287 –

+0

उस चेतावनी को बंद करें, परीक्षण संचालित विकास के साथ प्रतिस्थापित करें। ;) '=' और '==' के बीच व्यवहार में अंतर इतना बड़ा है कि आपके परीक्षण विफल हो जाएं। ('==' बनाम '===' के विपरीत - मैं अपने आईडीई को इसके बारे में चेतावनी देना चाहता हूं, अधिमानतः) –

उत्तर

38

वे खराब नहीं हैं, लेकिन वे खतरनाक गलतियों का कारण बन सकते हैं।

भाषाओं, जहां एक काम एक अभिव्यक्ति है की तरह ग में, (उदाहरण के लिए एक के लिए समर्थन करने के लिए = b = c = 1;) एक सामान्य त्रुटि है:

if (a = 1) { .. } 

लेकिन आप

करना चाहते थे
if (a == 1) { .. } 

कुछ डेवलपर्स टाइप करने के लिए अगर एक '=' भुला दिया जाता है

if (1 == a) { .. } 

एक त्रुटि बनाने के लिए सीख लिया है। लेकिन मुझे लगता है कि यह पठनीयता में सुधार नहीं करता है। यदि आप लिखना

if (a = 1) { .. } 

जो मुझे लगता है कि एक बेहतर समाधान है

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

+1

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

+3

@strager मैं अभी भी यह एक बुरा अभ्यास मानता हूं क्योंकि अगर आप किसी खंड में कुछ निर्दिष्ट करते हैं तो यह वास्तव में पठनीयता में मदद नहीं करता है। आप एक कमांड में दो चीजें करते हैं, जो गलतफहमी का कारण बन सकता है और इससे बचा जाना चाहिए। – Tigraine

+1

@strager मैंने उस सटीक टाइपो को कई बार पहले बनाया है और संकलक ने मुझे उस पर पकड़ लिया है जो बचाया गया है जब साइड इफेक्ट्स प्रकट होते हैं (यानी उपयोगकर्ता को गलत डेटा दिखाते हुए संकलन समय त्रुटि बनाते समय घंटों डीबगिंग को बचा सकता है कहीं नीचे लाइन) – Davy8

4

यह शायद मदद से आप खतरनाक टाइपो से बचने की कोशिश कर रहा है उस मामले के बारे में चिंता मत करो "शर्तें।

-1

मैं उन्हें हर समय का उपयोग करें, छोरों के साथ (यकीन नहीं क्यों कि एक फर्क होता है), जैसे:

$counter = 0; 
while($getWhateverDataObj = mysql_fetch_object($sqlResult)) { 
    $getWhateverObj->firstName[$counter] = $getWhateverDataObj->firstName; 
    $getWhateverObj->lastName[$counter] = $getWhateverDataObj->lastName; 
    $counter++; 
} 

और यह ठीक काम करता है।

1

भाषाओं कि allways कार्य पर कोई मान में यह नहीं है बुरा (मुझे लगता है कि यह कार्यात्मक भाषाओं में बहुत आम है), लेकिन (जबकि मैं इस टाइप किया के रूप में दूसरों allready कहा है) यह आम तौर पर आप या कोई बाद से परहेज किया जाना चाहिए और तुलना के लिए इसे गलती हो सकती है। कंपाइलर को आमतौर पर इसके बारे में चेतावनी दी जानी चाहिए, लेकिन अगर आप सुनिश्चित हैं कि आप क्या कर रहे हैं तो इसे अनदेखा किया जा सकता है ...

4

कंडीशनर में अक्सर शॉर्ट सर्किट ऑपरेटर शामिल होते हैं।

if (a=func(x) && b=func(y)) 
{ 
    // do this 
} 

यह तुरंत स्पष्ट नहीं हो सकता है, लेकिन अगर पहले >0 लौटे दूसरा काम ही घटित होता है, और अगर func(y) अन्य दुष्प्रभाव है कि आप उम्मीद कर रहे थे था, वे या तो नहीं होगा: तो, यह उदाहरण दिया ।

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

साथ ही, भविष्य देखरेख आप निम्नलिखित इरादा लगता है हो सकता है:

if (a==func(x) && b==func(y)) ... 

अगर वे "ठीक" अपने कोड, वे वास्तव में इसे तोड़ने।

+0

मैं तर्क दूंगा कि यह * अपने नमक के किसी भी प्रोग्रामर के लिए तत्काल स्पष्ट होना चाहिए। शायद मैं बहुत कठोर हूँ। – Kip

+0

हाँ, लेकिन जब आप डिबगिंग कर रहे हैं, तो ऐसी चीजें "ब्लेंड इन" कर सकती हैं और तुरंत बाहर नहीं निकलती हैं, इसलिए असाइनमेंट ऑपरेशंस को तोड़ने के लिए तर्क। –

+0

@ किप हाँ मैं आपके साथ 100% सहमत हूं। समस्या यह नहीं है कि सभी प्रोग्रामर उनके नमक के लायक हैं। हम अपने ग्राहकों को रखरखाव सॉफ्टवेयर बनाने के लिए देय हैं। डेवलपर के सबसे कम आम denominator द्वारा बनाए रखने योग्य सॉफ्टवेयर बनाना असंभव है, लेकिन हम कम से कम कुछ रियायतें कर सकते हैं। – rev

1

यदि कोड लूप स्थिति में $ पंक्ति मान निर्दिष्ट नहीं करता है तो यह कैसा दिखता है, यह मुझे लगता है कि यह बहुत जटिल होगा ... हालांकि कुछ रखरखाव के लिए पढ़ने के लिए अच्छा नहीं है, नहीं? अच्छी तरह से आप इसे पसंद

$next = mysql_fetch_assoc($result) 
do{ 
... 
... 
... 

$next = mysql_fetch_assoc($result) or break; 
}while ($next) 
+0

यह निश्चित रूप से अधिक पठनीय है: [क्षमा करें, टिप्पणियों में कोई नई समाचार AFAIK]। 'जबकि (सच) {$ अगला = mysql_fetch_assoc ($ परिणाम); अगर (! $ अगला) {ब्रेक; }/* शरीर यहाँ * /} ' – IMSoP

संबंधित मुद्दे