2008-11-06 12 views
15

जब से मैं पहले लिखा थाबचाव की मुद्रा में कोडिंग प्रथाओं

if ($a = 5) { 
    # do something with $a, e.g. 
    print "$a"; 
} 

और

  • के सामान्य puzzling सत्र के माध्यम से चला गया क्यों परिणाम हमेशा सच
  • क्यों $ 5 एक हमेशा
है

जब तक मुझे एहसास नहीं हुआ, मैं तुलना करने के बजाए 5 से $ एक सौंपा गया था।

तो मैं ऊपर हालत उस तरह लिखने का फैसला किया

if (5 == $a) 
दूसरे शब्दों में

के रूप में:

हमेशा की तरह, तुलना ऑपरेटर के बाईं ओर निरंतर मूल्य जगह एक संकलन त्रुटि में परिणाम , क्या आप दूसरा "=" चिह्न जोड़ना भूल जाना चाहिए।

मैं कोडिंग इस बचाव की मुद्रा में कॉल करते हैं और यह रक्षात्मक-प्रोग्रामिंग, नहीं एल्गोरिथम पैमाने पर है, लेकिन कीवर्ड से कीवर्ड का चचेरा भाई है विश्वास करने के लिए करते हैं।

आपने किस रक्षात्मक कोडिंग प्रथाओं को विकसित किया है? बाद में


एक सप्ताह:

एक बड़ा सब जो जवाब या भविष्य में एक और उत्तर जोड़ सकते हैं करने के लिए "धन्यवाद"।

दुर्भाग्य से (या बल्कि सौभाग्य से!) कोई भी सही उत्तर नहीं है। इसके लिए मेरा सवाल व्यापक था, तथ्यों की बजाय विचारों या अनुभवों के सीखने के लिए और अधिक पूछना।

+0

मुझे लगा, अगर मुझे ऐसा करने के लिए याद किया जा सकता है, तो मुझे याद है == (दुख की बात है) – gbarry

+7

मैं विचार की सामान्य ट्रेन में झटका नापसंद करता हूं; मैं 5 का परीक्षण नहीं कर रहा हूं, मैं $ ए का परीक्षण कर रहा हूं। अगर परीक्षण की जा रही मात्रा पहले सूचीबद्ध है तो मुझे यह आसान लगता है। शायद मैं अल्पसंख्यक हूं - लेकिन मुझे तकनीक पसंद नहीं है, हालांकि मुझे सम्मान करने वाले लोगों द्वारा इसकी अनुशंसा की जाती है। –

+1

बेहतर होगा अगर आप तुलना में चर के लिए कुछ भी असाइन नहीं कर सके। जावा और सी # बनाया गया था, क्योंकि सी ++ इस तरह जाल से भरा था। तो यह असाइनमेंट समस्या अभी भी क्यों मौजूद है? – Silvercode

उत्तर

13

यह एक साधारण और स्पष्ट है, लेकिन मैंने कभी भी मेरे कोड में दो बार एक ही स्ट्रिंग को दोहराया नहीं है, क्योंकि मुझे पता है कि अगर मैं करता हूं तो मैं उनमें से एक को गलत वर्तनी दूंगा :) स्थिरांक, लोगों का उपयोग करें!

4

मैं भाषाओं का उपयोग जहां = सिर दर्द का

if a = 5: print a 

यह मैं बचाया है टन कर सकते हैं) बंद कर दिया।

एक और गंभीर नोट पर ... मैं अब if एस और for लूप लिखने के बाद हमेशा घुंघराले ब्रेसिज़ लिखता हूं, और फिर उन्हें बाद में भरता हूं। यह सुनिश्चित करता है कि मेरे ब्रैकेट हमेशा गठबंधन होते हैं।

+0

मैं सहमत हूं ... लेकिन इसमें इस तरह की सही दुनिया नहीं है, प्रोग्रामिंग भाषा की पसंद मेरा नहीं है ... – lexu

8

हमेशा if/for/while के बाद घुंघराले ब्रेसिज़ डालें ... भले ही केवल एक ही कथन हो। बीटीडब्लू डी। क्रॉकफोर्ड सोचता है कि यह भी बेहतर है: Required blocks

+0

पर्ल ने (और elsif) और अन्य के लिए घुंघराले ब्रेसिज़ को अनिवार्य किया है। –

+0

हाँ, लेकिन पर्ल में एक यूनरी _ ऑपरेटर भी है, है ना? कोशिश मत करो और मुझे विश्वास दिलाएं कि पर्ल पठनीयता की चमकदार बीकन है :-) – endian

+0

मैंने अभी एक और प्रश्न पर एक उत्तर पोस्ट किया है कि "ब्रेस करने या न करने के लिए" मुद्दा उचित इंडेंटिंग प्रथाओं से निकटता से संबंधित है। – staticsan

3

एक उत्परिवर्तनीय वस्तु की प्रतिलिपि लौटाना, यानी एक सरणी की एक प्रति, म्यूटेबल ऑब्जेक्ट स्वयं नहीं।

if(boolean) 
    oneliner(); 
nextLineOfCode(); 

के समान नहीं है:

+0

मैं सहमत हूं, दुनिया में जहां गति और स्मृति समस्या नहीं है। – billjamesdev

+0

... और यह शायद ही एक रक्षात्मक * कोडिंग * अभ्यास है ... – Rich

+0

क्या आप कभी भी लीकिंग संदर्भ के साथ समस्याओं में भाग लेते थे? – dhiller

16

हमेशा ब्रेसेस का उपयोग करें

if(boolean) 
{ 
    oneliner(); 
} 
nextLineOfCode(); 

oneliner() एक #defined समारोह है, और यह कोड का फिर अपने अगली पंक्ति में परिभाषित नहीं किया गया है अचानक अगर() के अधीन हो जाता है। यही बात तो कोड के अगले टुकड़े ब्रेसिज़ के साथ छोरों आदि के लिए लागू होता है कभी नहीं अनजाने पर सशर्त हो जाता है/आदि

+1

यदि ऑनलाइनर() को # परिभाषित किया जाना चाहिए लेकिन नहीं है, तो आपके पास एक अविकसित फ़ंक्शन (सी ++ में त्रुटि, सी में अनुमत) के लिए एक कॉल है। यदि oneliner() # खाली शरीर के साथ परिभाषित किया गया है, तो आपके पास अर्ध-कॉलन है यदि if के बाद खाली बयान दिया गया हो। दोनों मामलों में, संरचनाएं समान हैं। –

+1

हे भगवान, हाँ! हमेशा ब्रेसिज़ का प्रयोग करें! – endian

14

शीर्ष 3 बचाव की मुद्रा में कोडिंग प्रथाओं मैं काम कर रहे हैं के लिए

  1. इकाई परीक्षण
  2. इकाई परीक्षण
  3. इकाई परीक्षण

आप बैकअप लेना एक अच्छा इकाई परीक्षण की तुलना में अपने कोड की गुणवत्ता के लिए कोई बेहतर रक्षा नहीं है।

+1

लेकिन एक यूनिट परीक्षण कुछ ऐसा होता है जो कोडिंग के दौरान होता है, कोडिंग के दौरान नहीं। यह करना एक अच्छी बात है, लेकिन कोडिंग अभ्यास नहीं। – Treb

+0

मेरी राय में यूनिट परीक्षण एक रक्षात्मक प्रोग्रामिंग अभ्यास है (एक आयातक वाला, बिना मत जाओ!), लेकिन रक्षात्मक कोडिंग उदाहरण नहीं ... आपके परीक्षण में "opps-ative" कोडिंग त्रुटि पकड़ी नहीं गई है ... कई मामलों में "कोडिंग" और "प्रोग्रामिंग" – lexu

+4

की (मेरी वास्तव में) परिभाषाओं पर निर्भर करता है, एक इकाई परीक्षण कार्यान्वयन से पहले लिखा जाता है। हां, यह एक कोडिंग अभ्यास है। –

2

अनावश्यक परीक्षण से बचें। उदाहरण

  1. अगर (bool == सच)
  2. सूचक जांच करता है कि (सूचक)

संपादित करें: अगर (सूचक) पढ़ने योग्य नहीं है तो आजकल मैं अगर पसंद करते हैं (शून्य = सूचक)

+0

मैं बिंदु 1 के साथ पूरी तरह से सहमत हूं, लेकिन बिंदु 2 के लिए, मैं पसंद करता हूं (सूचक! = NULL) क्योंकि यह कोड को पढ़ने में आसान बनाता है। चर और घुंघराले ब्रेसिज़ को हमेशा प्रारंभ करने के लिए – RobH

2

युगल बातें:

  • हाँ, 1 लाइन ब्लॉक। ब्रेसिज़ का उपयोग करें ... बिल्ली, सबसे अच्छा आईडीई आपके लिए बना देगा।
  • लिखने के बाद अपने कोड को टिप्पणी करें, या यदि आपने समय से पहले किया तो अपनी टिप्पणियां दोबारा पढ़ें। सुनिश्चित करें कि आपका कोड अभी भी करता है जो टिप्पणियां कहता है।
  • यूनिट परीक्षण आपके कोड को फिर से पढ़ने के लिए एक बड़ी फॉलबैक है।
  • हमेशा एक अपवाद लॉग करें ... या, कभी भी डीबग में ऐसा कहने के बिना अपवाद नहीं पकड़ें।
5
  • हमेशा प्रारंभ चर
  • उपयोग const मैं जहाँ भी
  • (mutable का उपयोग किए बिना) स्मृति या अन्य संसाधनों के नंगे गतिशील आवंटन
  • हमेशा का उपयोग करें घुंघराले ब्रेसिज़
  • कोड उपयोग-मामले से बच सकते हैं और कोडिंग कार्यान्वयन से पहले किसी भी वर्ग के लिए परीक्षण
  • जितनी उपयोगी चेतावनियां मैं कर सकता हूं (-Wall -Wextra -ansi -pedantic -Werror न्यूनतम पर)
  • समस्या का समाधान करने वाले सबसे सरल उपकरण का उपयोग करें (मेरे वर्तमान वातावरण में, यह bash ->grep -> awk -> पायथन -> सी ++) है।
+1

+1। –

5

व्यक्तिगत रूप से, मैं इस रक्षात्मक शैली को नापसंद करता हूं, यह कोड को हार्ड रो पढ़ता है।

वीसी कंपाइलर चेतावनी स्तर 4 इस (संभव) त्रुटि को स्पॉट करेगा।
"चेतावनी C4706: सशर्त अभिव्यक्ति के भीतर काम"

आप केवल इस विशेष संकलक चेतावनी सक्षम कर सकते हैं किसी भी स्तर पर:

#pragma warning(3,4706) 
+0

जब आप ऐसा करते हैं तो जीसीसी डिफ़ॉल्ट रूप से आपको चेतावनी देगा; यह आपको अपने इरादे को स्पष्ट करने के लिए नेस्टेड माता-पिता के अंदर एक असाइनमेंट देने की सलाह देता है। – Rich

+0

सी # कंपाइलर इसके बारे में भी शिकायत करेगा: स्पष्ट रूप से प्रकार 'xyz' को 'bool' में परिवर्तित नहीं कर सकता है। –

7

जब एक निरंतर के साथ एक स्ट्रिंग तुलना, लिखने

if ("blah".equals(value)){} 

बजाय

if (value.equals("blah")){} 
NullPointerException को रोकने के लिए

। लेकिन यह एकमात्र समय है जब मैं सुझाए गए कोडिंग-शैली का उपयोग करता हूं (कारण "अगर (ए = 1) ..." जावा में संभव नहीं है)।

+0

एमएमएम, अच्छा, मुझे यह पसंद है। – endian

+0

बस सावधान रहें यदि आपकी प्रोग्रामिंग भाषा समानता ऑपरेटरों (या विधि के बराबर) का उपयोग कर ** केस सेंसिटीवी ** स्ट्रिंग तुलना करता है। –

+0

मुझे यह पसंद नहीं है क्योंकि यह शून्य मान को नहीं पकड़ता है, जो एक बग हो सकता है या नहीं भी हो सकता है। – Cojones

7

जब मैं जावास्क्रिप्ट दुनिया में हूं, तो मैं हमेशा याद रखने की कोशिश करता हूं कि रिटर्न कुंजी शब्द के समान ही एक कार्य के वापसी मूल्य को हमेशा शुरू करना है।

function one(){ 
    return { 
     result:"result" 
    }; 
} 

function two(){ 
    return 
    { 
     result:"result" 
    }; 
} 

ये 2 फ़ंक्शन एक ही मान वापस नहीं करेंगे। पहला फ़ंक्शन ऑब्जेक्ट को "परिणाम" पर सेट किए गए संपत्ति परिणामों के साथ वापस कर देगा। दूसरा फ़ंक्शन undefined लौटाएगा। यह वास्तव में एक साधारण गलती है और यह जावास्क्रिप्ट की अति उत्साही अर्ध-कॉलन सम्मिलन रणनीति के कारण होता है। अर्ध-कॉलन जावास्क्रिप्ट में अर्द्ध-वैकल्पिक हैं और इसके कारण जावास्क्रिप्ट इंजन सेमी-कॉन्स जोड़ देगा जहां ऐसा लगता है कि यह होना चाहिए। चूंकि return वास्तव में एक वैध कथन है, रिटर्न स्टेटमेंट के बाद अर्ध-कॉलन डाला जाएगा और शेष कार्य अनिवार्य रूप से अनदेखा कर दिया जाएगा।

+4

एक और कारण जावास्क्रिप्ट बुराई क्यों है। – endian

+2

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

+0

वाह - मैं कभी नहीं जानता था! जानकारी के लिए धन्यवाद। यह एक प्रश्न/उत्तर खुद ही देता है। –

5

मेरे ब्लॉग से:

  1. सकारात्मक सोचो और जल्दी वापसी के साथ साथ गहरी घोंसले से बचें।

    के बजाय अगर (मूल्य! = नल) { ... मूल्य के साथ कुछ करना ... } वापसी

    लिखने

    अगर (मूल्य == नल) { वापसी } ... मूल्य के साथ कुछ करें ...

  2. "स्ट्रिंग स्थिरांक" से बचें (यानी एक से अधिक स्थानों में उद्धरणों में एक ही पाठ)। हमेशा एक वास्तविक निरंतर परिभाषित करें (एक नाम और एक वैकल्पिक टिप्पणी जिसका अर्थ है) और इसका उपयोग करें।

1

स्थापित Resharper;) तो मैं लिखने के लिए अगर मैंने कुछ गलत :)

+0

क्या यह पर्ल/पायथन/बैश के साथ काम करता है ... आत्म अनुशासन करता है .. और हाँ, यह एक तरह से लंगड़ा तर्क है .- ( – lexu

+0

@lexu: नहीं, लेकिन यह एक व्यक्तिपरक प्रश्न है, और मैं पर्ल, पायथन या बैश का उपयोग नहीं करता :) – badbadboy

2

एम्बेडेड सी प्रोग्रामिंग के लिए कई सुझाव लेख Rules for Defensive C Programming में किया था "5 == एक" चेतावनी दी पाने के लिए की जरूरत नहीं है embedded.com से।

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