2010-10-15 19 views
5

मैं इस तरह कोड युक्त जवाब के साथ यहाँ धागे (या कम से कम commented) के लिए प्रतिक्रिया व्यक्त की है, लेकिन अगर यह एक (या अधिक) शाखाओं के कर के साथ if शाखाओं की एक श्रृंखला लिखने के लिए अच्छा है या बुरा रूप है मैं सोच रहा हूँ उनमें से कुछ भी नहीं, आम तौर पर प्रत्येक शाखा में null की जांच को खत्म करने के लिए।क्या ऐसी शाखा है जो कोड गंध या अच्छी प्रैक्टिस नहीं करती है?

एक उदाहरण (सी # कोड):

if (str == null) { /* Do nothing */ } 
else if (str == "SomeSpecialValue") 
{ 
    // ... 
} 
else if (str.Length > 1) 
{ 
    // ... 
} 
बजाय

:

if (str != null && str == "SomeSpecialValue") 
{ 
    // ... 
} 
else if (str != null && str.Length > 1) 
{ 
    // ... 
} 

और, बेशक, यह सिर्फ एक उदाहरण है, जैसा कि मैंने बड़े और अधिक जटिल के साथ इन का उपयोग करते हैं कक्षाएं। और इनमें से अधिकतर मामलों में, null मान कुछ भी करने का संकेत नहीं देगा।

मेरे लिए, यह मेरे कोड की जटिलता कम कर देता है और समझ में आता है जब मैं इसे देख। तो, क्या यह अच्छा या बुरा रूप है (एक कोड गंध, यहां तक ​​कि)?

+1

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

+3

तथ्य यह है कि इन सभी चेकों की आवश्यकता है "केवल मामले में" मान शून्य है, खुद में एक गंध है, आईएमएचओ। ऐसा करके आप बग छुपा रहे हैं। – SimonJ

+1

@ सिमोनजे: अच्छा बिंदु। कम से कम इस मामले में, अगर एक 'शून्य' मूल्य की अपेक्षा नहीं की जाती है तो उसे अपवाद फेंकना चाहिए। – casablanca

उत्तर

5

यह वास्तव में निम्नलिखित से बचने के लिए अच्छा है करने के लिए इसे बदल क्योंकि यह बेकार में फिर से जाँच करता है स्थिति में से एक (तथ्य यह है कि संकलक इस दूर अनुकूलित करेंगे बिंदु के बगल में है - यह संभावित रूप से बनाता है

: अपने कोड को पढ़ने के लिए कोशिश कर रहा है लोगों) के लिए और अधिक काम 0
if (str != null && str == "SomeSpecialValue") 
{ 
    // ... 
} 
else if (str != null && str.Length > 1) 
{ 
    // ... 
} 

लेकिन यह भी कि तुम क्या सुझाव दिया, नीचे करने के लिए नहीं बल्कि विचित्र है:

if (str == null) { /* Do nothing */ } 
else if (str == "SomeSpecialValue") 
{ 
    // ... 
} 
else if (str.Length > 1) 
{ 
    // ... 
} 

मैं कहता हूँ यह विचित्र है, क्योंकि यह अपने इरादे obfuscates और खारिज कर देता है पाठक की उम्मीदों।यदि आप किसी शर्त की जांच करते हैं, तो लोग आपको संतुष्ट होने पर कुछ करने की उम्मीद करते हैं - लेकिन आप नहीं हैं। इसका कारण यह है अपने आशय नहीं वास्तव में करने के लिए प्रक्रिया अशक्त हालत, बल्कि एक नल पॉइंटर जब आप दो शर्तों आप वास्तव में में रुचि रखते हैं की जाँच से बचने के लिए है। वास्तव में, बल्कि करने के लिए दो वैचारिक राज्यों की तुलना में संभाल, एक विवेक प्रावधान (गैर अशक्त इनपुट) के साथ, इसे पढ़ता बजाय जैसे आप तीन वैचारिक राज्यों को संभालने के लिए है। यह कम स्पष्ट है - तथ्य यह है कि, computationally, आप इस तरह के तीन राज्यों बिंदु के पास है देखते हैं कह सकते हैं।

if (str != null) 
{ 
if (str == "SomeSpecialValue") 
{ 
    // ... 
} 
else if (str.Length > 1) 
{ 
    // ... 
} 
} 

इस बात से थोड़ा अधिक है: अशक्त के लिए जाँच करें, और उसके परिणाम ब्लॉक के भीतर अन्य शर्तों की जांच -

स्थिति इस तरह की में हमेशा की तरह मामले दृष्टिकोण के रूप में Oren एक सुझाव दिया है कोड गंध के मुद्दे के विपरीत, पठनीयता-बढ़ाने की शैली का।

संपादित: हालांकि, अगर आप do-कुछ भी नहीं शर्त पर सेट कर रहे हैं, मैं कर बहुत ज्यादा की तरह है कि आप एक "कुछ भी नहीं" टिप्पणी भी शामिल थे। अन्यथा, लोगों को लगता है कि आप बस कोड को पूरा करना भूल गए हैं।

+0

संपादित देखें - मैंने इसे लिया ("[NULL]" स्ट्रिंग) क्योंकि लोग उस पर लटका रहे थे। – palswim

+0

@palswim ठीक है। लेकिन ध्यान दें कि वास्तव में मेरे उत्तर का मुख्य बिंदु नहीं था। (लेकिन साथ ही, वह कोड कहीं से आया - अगर यह उत्पादन कोड है, तो यह लगभग निश्चित रूप से एक बुरी चीज है)। – user359996

+0

@ user359996: नहीं; मैं अपने उत्पादन कोड की प्रतिलिपि बनाना और पेस्ट नहीं करना चाहता था। मैं इस जगह पर एक उदाहरण के बारे में सोचने की कोशिश कर रहा था। – palswim

21

मैं इस-

if (str != null) 
{ 
if (str == "[NULL]") 
{ 
    // ... 
} 
else if (str.Length > 1) 
{ 
    // ... 
} 
} 

की तरह यह कर पसंद करते हैं मुझे लगता है कि आप हमेशा एक खाली शरीर के साथ "reword" कर सकते हैं एक if में एक शरीर के साथ निषेध है, और यह बेहतर लग रहा है और अधिक समझ में आता है कि।

+1

मुझे लगता है कि मेरे पास बहुत अधिक इंडेंटेशन का विचलन है। यह मुझे थोड़ा ऊर्ध्वाधर स्थान भी बचाता है, और कम से कम, मुझे लगता है कि संकलक इसे अच्छी तरह से संभाल लेगा। – palswim

+1

कंपाइलर इसे अच्छी तरह से संभाल लेगा, लेकिन आईएमएचओ जो आप कह रहे हैं वह एक अजीब तर्क है। क्यों कहें "अगर ... तो कुछ भी नहीं करें", जब आप कह सकते हैं "अगर नहीं .. .. करने के बजाय .." पहचान के बारे में, आप रिक्त स्थान की संख्या को कम कर सकते हैं टैब लेता है, जो कम से कम थोड़ा सा मदद कर सकता है। –

+2

कोड को उचित रूप से प्रारूपित नहीं करना चाहते हैं, कोड को ठीक से लिखने के खिलाफ एक अच्छा तर्क नहीं है। – nearlymonolith

2

आपका पहला उदाहरण पूरी तरह से मेरे लिए पठनीय है - सब पर गंध नहीं करता है।

4

इस विशेष मामले में मैं जल्दी वापस आ जाएगी और यह कोड आसान

if (string.IsNullOrEmpty(str)) { return; } 

पढ़ने के लिए मैं एक स्पष्ट वापसी कथन शामिल करना चाहते बनाता है।

+1

यह केवल तभी काम करता है जब फ़ंक्शन कुछ और नहीं करता लेकिन 'if ... else' block। – palswim

+0

यह वास्तव में समस्या के अर्थशास्त्र पर निर्भर करता है। बहुत ही कम तर्क का मतलब है "कुछ भी नहीं"। अक्सर इसका मतलब है कि किसी ने गलती की है, और चुपचाप लौटकर, आप समस्या को बढ़ा रहे हैं। यदि यह जीवन-समर्थन या सैन्य नहीं है, तो असफलता अक्सर एक अच्छा विचार है। – user359996

+0

मैं पूरी तरह से आपसे सहमत हूं और मैं हमेशा तेज़ी से विफल रहता हूं। मैं केवल इस विशेष प्रश्न का उत्तर दे रहा हूं जहां किसी भी कारण से उपयोग वापस करना है। यह अक्सर बैच प्रसंस्करण में होता है जहां आप असफल होने की बजाय बस छोड़ते हैं और संभावित रूप से लॉग करते हैं कि कौन सी इकाई छोड़ी गई थी। – softveda

2

यह सब संदर्भ पर निर्भर करता। यदि खाली बयान डालने पर कोड कथन को और अधिक पठनीय बनाता है, तो उसके लिए जाएं।

+0

हां, लेकिन जब आप ऐसा करते हैं तो हमेशा इसे दस्तावेज़ करें। या, यदि आप मेरे जैसे हैं और कोड बनाने की कोशिश करते हैं जिन्हें टिप्पणियों की आवश्यकता नहीं है और आप ऐसी भाषा में काम नहीं कर रहे हैं जो सब कुछ कक्षा में रहने के लिए मजबूर करता है, तो कुछ भी नाम नहीं है()। –

+0

मुझे पायथन के साथ काम करने के लिए उपयोग किया जाता है, जिसमें इसमें 'पास' शामिल है (कुछ भी करने का बयान नहीं)। –

2

यह पठनीय है, चाहे वह अच्छा या बुरा हो, आप जो हासिल करने की कोशिश कर रहे हैं उस पर निर्भर करता है - आम तौर पर लंबे समय से घोंसला "चला जाता है" प्रकार if कथन खराब हैं। फ्रेमवर्क में पके हुए स्थिर स्ट्रिंग विधियों के बारे में न भूलें: string.IsNullOrEmpty() और string.IsNullOrWhiteSpace()

आपकी if (str == null) { /* Do nothing */ } लाइन असामान्य है, लेकिन इसमें एक सकारात्मक बिंदु है: यह अन्य डेवलपर्स को आगे बता रहा है कि आप जानबूझ कर उस मामले के लिए कुछ भी नहीं कर रहे हैं, यदि आपके इरादे की संरचना आपके अस्पष्ट हो सकती है ,

if (str != null) 
{ 
    /* carry on with the rest of the tests */ 
} 
6

मैं सामान्य रूप से पहले if में एक return या कुछ ऐसे ही डाल दिया जाएगा:

void Foo() 
{ 
    if (str == null) { return; } 
    if (str == "SomeSpecialValue") 
    { 
     // ... 
    } 
    else if (str.Length > 1) 
    { 
     // ... 
    } 
} 

यदि आप ऐसा नहीं कर सकते हैं, समारोह if/else के बाद कुछ और है, क्योंकि, मैं कहेंगे यह रिफैक्टर करने का समय है, और if/else भाग को एक अलग फ़ंक्शन में विभाजित करने का समय है, जिससे आप जल्दी वापस आ सकते हैं।

+0

मुझे आपकी इंडेंटेशन शैली पसंद नहीं है, लेकिन ओपी की समस्या को हल करने के लिए कोड का यह टुकड़ा सबसे अच्छा तरीका है, आईएमएचओ। +1 – rmeador

+0

@ रेमेडोर: दिलचस्प; आप किस इंडेंटेशन शैली को पसंद करते हैं? – palswim

+0

यह वास्तव में "मेरी" इंडेंटेशन शैली नहीं है, मैंने अभी ओपी के साथ चिपकने की कोशिश की है। :) – jalf

3

हाँ यह एक कोड गंध है।

एक संकेत यह है कि आपने इस प्रश्न को से पूछने के लिए सोचा था।

एक और संकेत है कि कोड incomplete- लगता है जैसे कुछ वहाँ से संबंधित होना चाहिए है। यह पठनीय सुनिश्चित हो सकता है, लेकिन यह महसूस करता है।

जब कि कोड को पढ़ने, एक बाहरी व्यक्ति करता है, तो कोड मान्य/पूर्ण/सही/इरादा/विशेषण के रूप में है एक पल के लिए बंद करो और निर्धारित करने के लिए brainpower का उपयोग करना पड़ता है।

मैं कहता हूँ यह विचित्र है, क्योंकि यह आपके इरादे obfuscates और पाठक की उम्मीदों खारिज कर देता है:

user359996 सिर पर कील मारा।

+0

मुझे नहीं लगता कि "सवाल पूछने के लिए सोचना" एक बुरा संकेतक है। लगभग कोई भी कोड जो मैं देखता हूं, यहां तक ​​कि 'अच्छा कोड' के क्लासिक उदाहरण भी मेरे लिए अच्छा लग रहा है। उदाहरण के लिए, लगभग हर डिजाइन पैटर्न मुझे कोड गंध की तरह दिखता है। प्रक्रियात्मक कोड के लगभग हर उदाहरण में मुझे "दूसरे के लिए रुकना और मस्तिष्क शक्ति का उपयोग करना" है, यह जानने के लिए कि क्या इरादा था। – Ken

+1

@ केन सामान्य तौर पर "पूछने की सोच" कोड गंध का संकेत नहीं हो सकता है, लेकिन इस स्थिति में आईडी कहती है कि यह था। यदि कोई कोड आपके लिए अच्छा नहीं लग रहा है, तो आप या तो गलत स्रोत पढ़ रहे हैं, या किसी कारण से कोड की नज़र पसंद नहीं है। (कई) डिजाइन पैटर्न कोड गंध नहीं हैं ... शायद एक भाषा में कमजोरी का एक्सपोजर। उपर्युक्त उदाहरण के लिए- अपूर्ण दिखने वाले सरल कोड की तुलना में 'रोक दिया' पाने के लिए बेहतर चीजें हैं और मस्तिष्क शक्ति खर्च करें। मुझे खेद है कि प्रक्रियात्मक कोड आपको परेशानी का कारण बनता है। –

+0

instanceofTom: मुझे खेद है कि बिना किसी बयान के ब्रेसिज़ की एक जोड़ी आपको परेशानी का कारण बनती है। – Ken

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