डिफ़ॉल्ट मान - क्या वे अच्छे या बुरे हैं?


12

सामान्य रूप से डिफ़ॉल्ट मानों के बारे में प्रश्न - डिफ़ॉल्ट रिटर्न फ़ंक्शन मान, डिफ़ॉल्ट पैरामीटर मान, किसी चीज़ के गुम होने पर डिफ़ॉल्ट तर्क, अपवादों को संभालने के लिए डिफ़ॉल्ट तर्क, किनारे की स्थितियों को संभालने के लिए डिफ़ॉल्ट तर्क आदि।

एक लंबे समय के लिए मैंने डिफ़ॉल्ट मानों को "शुद्ध बुराई" चीज माना, कुछ ऐसा जो "तबाही को दबाता है" और बहुत कठिन परिणाम में कीड़े ढूंढता है। लेकिन हाल ही में मैंने कुछ तकनीकी ऋणों के रूप में डिफ़ॉल्ट मानों के बारे में सोचना शुरू कर दिया ... जो कि एक सीधी बुरी बात नहीं है, लेकिन कुछ ऐसा है जो कुछ "अल्पकालिक वित्तपोषण" प्रदान कर सकता है ताकि हम परियोजना को जीवित कर सकें (हममें से कितने लोग वहन कर सकते हैं) बंधक बाहर निकालने के बिना एक घर खरीदने के लिए?)।

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

फिर से - मैं यहां "औसत" मुख्यधारा के सॉफ़्टवेयर के बारे में बात कर रहा हूं (परमाणु ऊर्जा स्टेशन के लिए सॉफ़्टवेयर नहीं) - औसत वेब साइट या अकाउंटिंग सॉफ़्टवेयर के लिए एक यूआई आवेदन, जिसका अर्थ है कि लोग रहते हैं दांव पर नहीं, और न ही लाखों डॉलर। ।

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

तो मेरा सवाल है - क्या डिफ़ॉल्ट मान अच्छे या बुरे हैं। और अगर वे एक तकनीकी ऋण हैं - तो आप कैसे माप सकते हैं कि आप कितना उधार ले सकते हैं ताकि आप पुनर्भुगतान कर सकें?

वास्तव में किसी भी इनपुट की सराहना करेंगे।

चीयर्स।

संपादित करें:

यदि मैं विकास के दौरान कोनों को काटने के तरीके के रूप में डिफ़ॉल्ट मानों का उपयोग कर रहा हूं - और यदि कोनों में कीड़े और मुद्दों का परिणाम होता है - तो इन मुद्दों से उबरने की पद्धति क्या है?

जवाबों:


24

समझदार डिफ़ॉल्ट मानों के बिना कॉन्फ़िगरेशन पर कन्वेंशन की अवधारणा असंभव है । यहाँ मुख्य शब्द "समझदार" है। लायब्रेरी / सेवा / ढांचे के सभी उपयोगों के लिए डिफ़ॉल्ट मानों को कम से कम 80% (यदि अधिक नहीं) के लिए समझ में आता है।

अंगूठे के सामान्य नियम:

  • यदि कोई मान 80% या अधिक उपयोग के लिए समझदार है, तो उसे डिफ़ॉल्ट मान होना चाहिए
  • यदि कोई मान नहीं है जो अधिकांश मामलों के लिए उपयोग किया जाता है, तो चूक का उपयोग न करें।
  • डिफ़ॉल्ट मान सेटअप कोड से बेवकूफ गलतियों को रोकते हैं। यदि चूक अधिकांश मामलों के लिए उचित हैं, तो कम लोग काम करने वाले कॉन्फ़िगरेशन के साथ गड़बड़ करते हैं।
  • जब आप चूक का उपयोग करते हैं तो गैर-मानक कॉन्फ़िगरेशन अधिक दिखाई देते हैं।
  • बुरा चूक से भी बदतर हैं कोई चूक।

अनिवार्य रूप से, एक बार जब आप सीख जाते हैं कि डिफ़ॉल्ट कॉन्फ़िगरेशन कैसे काम करता है, तो आप गैर-मानक कॉन्फ़िगरेशन कैसे / कब करें, इसके बारे में शिक्षित निर्णय ले सकते हैं।


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

3
@ और अगर एक दर्जन कॉल Foo()और एक कॉल के लिए Foo("bar"), कि एक कॉल बाहर खड़ा है और इसलिए अधिक दिखाई देता है।
मैथ्यू शेर्ले

1
ठीक है, और अगर एफ़टीपी सेवा के अधिकांश उपयोग new FtpService()उस व्यक्ति का उपयोग करते हैं जो एक वैकल्पिक पोर्ट सेट करता है तो बाहर खड़ा होगा ( service.SetPort(12345))।
बेरिन लोरिट्श

43

उदाहरण के लिए एक पुस्तकालय जो एफ़टीपी प्रोटोकॉल को लागू करता है ले लो। डिफ़ॉल्ट रूप से FTP के पोर्ट 21 पर संचालित होने की उम्मीद है। अब मुझे बहुत परेशान होना पड़ेगा अगर मुझे हर बार पोर्ट 21 का उपयोग करने के लिए निर्दिष्ट करना होगा ताकि मैं एक यादृच्छिक एफ़टीपी वर्ग का एक ऑब्जेक्ट बना सकूं। यदि मुझे एक अलग पोर्ट की आवश्यकता है, तो मुझे निर्दिष्ट करें।

डिफॉल्ट्स पूरी तरह से ठीक हैं जब वे डेन डिफॉल्ट होते हैं।


21
+1। आखिरी बार आपने http://programmers.stackexchange.com:80/questions/?sort=newest&pagesize=50एड्रेस बार में कब टाइप किया था?
जोर्ग डब्ल्यू मित्तग

1
तो, आप कैसे मापते हैं / अनुमान लगाते हैं / डिफ़ॉल्ट डिफ़ॉल्ट चर का एक स्तर स्तर ect के।

5
एक उचित डिफ़ॉल्ट मूल्य के बारे में सोचने में कितना समय लगता है।
अलेक्जेंडर गेसलर

1
@ और, नीचे मेरा जवाब देखें। यदि कोई मान 80% या अधिक उपयोगों के लिए अच्छा है, तो यह एक अच्छा डिफ़ॉल्ट है।
बेरिन लोरिट्श

2
@Berin Loritsch: यदि डिफ़ॉल्ट मान का उपयोग सुरक्षित रूप से विफल होने के लिए किया जाता है, तो आप तर्क दे सकते हैं कि यह तब भी अच्छा है जब इसका उपयोग केवल 1% समय के लिए किया जाता है।
ओस्टरवाल

18

आप शायद डिफ़ॉल्ट कुंजी मैपिंग, डिफ़ॉल्ट माउस बटन मैपिंग, डिफ़ॉल्ट ब्राउज़र, सिस्टम डिफ़ॉल्ट भाषा में टाइपिंग, बूट लोडर में डिफ़ॉल्ट ओएस से बूटिंग, डिफ़ॉल्ट तैनात मेनू, डिफ़ॉल्ट रंग योजना, डिफ़ॉल्ट फ़ॉन्ट के साथ एक डिफ़ॉल्ट कीबोर्ड लेआउट का उपयोग कर रहे हैं चौड़ाई / ऊंचाई / चेहरे / शैली, डिफ़ॉल्ट चरित्र सेट, डिफ़ॉल्ट मॉनिटर रिज़ॉल्यूशन, डिफ़ॉल्ट ... आपको विचार मिलता है।

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

इसके अलावा, "कैच-ऑल" अपवाद हैंडलिंग यकीनन एक डिज़ाइन दोष है, जिसे आप "डिफ़ॉल्ट" कह सकते हैं।


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

तो अपने मूल प्रश्न में जोड़ने के लिए - यदि मैं विकास के दौरान कोनों को काटने के तरीके के रूप में डिफ़ॉल्ट मानों का उपयोग कर रहा हूं - और यदि कोनों में कीड़े और मुद्दे होते हैं - तो इन मुद्दों से उबरने का सबसे अच्छा तरीका क्या है?

1
जहां तक ​​अपवादों की बात है, तो एक लेख है जिसमें कहा गया है कि थ्रेड - प्रति अपवाद एक कैच होना चाहिए , यदि कोई हो तो। इसका उपयोग त्रुटि रिपोर्टिंग के लिए किया जाएगा, इसलिए आप कार्यक्रम को "एकल" के रूप में देख रहे हैं उसी तरह ओएस एक प्रक्रिया को देखेगा। चूंकि आपको अंतिम उपयोगकर्ता (और उम्मीद है कि डेवलपर्स) लूप में मिला है, आप वास्तव में अपवाद को "निगल" नहीं रहे हैं - इसलिए यह सब अच्छा है। यहाँ लेख: codeproject.com/KB/altecture/exceptionbestpractices.aspx
Rei Miyasaka

1
के रूप में कीड़ों से बचने के लिए चूक का उपयोग करने के लिए - कैसे लगातार टिप्पणी है कि आप + f / mac + f के लिए उपयोग कर सकते हैं? उदाहरण के लिए, Visual Studio वास्तव में कोई भी टिप्पणी दिखाता TODO: or TEMP:है जो कार्य सूची में शुरू होती है । अगर मैं कभी विकास के लिए एक कोने को काट रहा हूं, तो मैं यह सुनिश्चित करने के लिए बहुत सावधानी बरतने की कोशिश करता हूं कि मैं वहां एक टीडीओ लगाऊं - फिर, एक बार में, मैं वापस जाने और सुनिश्चित करने के लिए "सभी ढूंढ" करूंगा। कोई भी महत्वपूर्ण बिल्ड में नहीं जाता है।
री मियासाका

वूप्स, मेरा मतलब विकास में मदद करने के लिए कठोर-कोडित मूल्यों का उपयोग करना है। वैसे, मुझे बस एहसास हुआ कि "हार्ड-कोडेड वैल्यूज़" शायद "डिफॉल्ट वैल्यू" के बजाय आपके द्वारा खोजा जाने वाला शब्द है।
री मियासका

3

डिफॉल्ट्स का उपयोग तब किया जाना चाहिए जब वे उपयोगकर्ता या डेवलपर को दोहराए जाने वाले कार्यों को करने से बचाते हैं। उन्हें कभी भी त्रुटियों या अपवादों का सामना नहीं करना चाहिए। त्रुटियों को रोकने के लिए उनका उपयोग करना एक बुरा अभ्यास नहीं है, लेकिन केवल इतनी देर तक कि रोकथाम कुछ बुरा होने का मुखौटा नहीं लगाती है। डिफ़ॉल्ट मान सब कुछ की तरह एक उपकरण है। उचित रूप से उपयोग किए जाने पर वे आपको बहुत अधिक सिरदर्द और समय बचा सकते हैं। अनुचित तरीके से उपयोग किए जाने पर वे पूरे घर को नीचे ला सकते हैं।


सी ++ की तरह अपने पूरे पैर को उड़ाने ...
मतीन उल्हाक

1
@ मंटू: अरे, लिस्प ने मुझे '03 'में लंगड़ा कर दिया।
जोएल एथरटन

3

आपके द्वारा बताई गई समस्याओं का मूल कारण प्रति डिफ़ॉल्ट डिफ़ॉल्ट मान नहीं है, लेकिन इंटरफ़ेस अनुबंध, व्याख्या गलतफहमी और / या अमान्य मान्यताओं को बदलने के कारण एकीकरण समस्याएं हैं। मूल रूप से ये सभी (विशिष्ट उदाहरण) अनुचित संचार का परिणाम प्रतीत होते हैं - क्लाइंट और डेवलपर के बीच, या विभिन्न डेवलपर्स / टीमों के बीच। पर्याप्त रूप से, ये समस्याएं अमान्य डिफ़ॉल्ट मानों के रूप में प्रकट हो सकती हैं, लेकिन अनगिनत अन्य रूपों में भी।

मूल कारण को संभालो, लक्षण को नहीं।

और यह भी ध्यान दें, कि - जैसा कि दूसरों ने उत्कृष्ट उदाहरणों के साथ बताया है - डिफ़ॉल्ट मान, जब बुद्धिमानी से उपयोग किया जाता है, तो उपयोगकर्ताओं के जीवन को काफी आसान बना सकते हैं। और वह अंततः हमारा उद्देश्य है, है ना?


"अनुचित संचार" मूल कारण हो सकता है, लेकिन बहुत ज्यादा कुछ के लिए एक मूल कारण नहीं है? और जब से "मेरा अंतिम उद्देश्य" लागत विवश वातावरण में समय पर "अच्छा-पर्याप्त" सॉफ़्टवेयर वितरित करना है, मैं यह जानना चाहता था कि अच्छे / बुरे लोगों से बुरे को कैसे बताएं।

@ और, संचार (या इसकी कमी) एक परियोजना की सफलता / विफलता में एक प्रमुख कारक है, लेकिन केवल एक होने से दूर है। हालांकि, जब यह अपराधी है, तो इसे ठीक से निपटा जाना चाहिए, अन्यथा आपकी परियोजना लगभग निश्चित रूप से बर्बाद हो गई है। मुझे बुरे लोगों को अच्छे लोगों से अलग करने के लिए किसी भी जादू के उपकरण का पता नहीं है: IMHO को समस्या डोमेन के सावधानीपूर्वक विश्लेषण, मामलों का उपयोग करने आदि और, अच्छी तरह से, बहुत सारे संचार की आवश्यकता होती है।
पेटर टॉर्क

1

डिफ़ॉल्ट मान जो संचार प्रोटोकॉल / कन्वेंशन का हिस्सा नहीं हैं, वे बुरे हैं। "एक हिस्सा नहीं" होने से मेरा मतलब है कि वे दस्तावेज नहीं हैं जहां प्रोटोकॉल सख्त है, या वे बस उम्मीद नहीं कर रहे हैं, जहां प्रोटोकॉल ढीला है।

यदि डिफ़ॉल्ट मान का दस्तावेजीकरण / उम्मीद की जाती है, तो यह अभी भी बुराई हो सकती है, लेकिन यह सुरक्षित जीवन भी हो सकता है। यह डोमेन क्षेत्र पर निर्भर करता है। यह बहुत बार होता है जब वे बहुत खतरनाक हो सकते हैं (जैसे डिफ़ॉल्ट दवा की खुराक, डिफ़ॉल्ट लिफ्ट फर्श, डिफ़ॉल्ट कार चालन दिशा), और कभी-कभी यह खतरनाक हो सकता है कि उनके पास न हो (जैसे डिफ़ॉल्ट कार चालन दिशा, डिफ़ॉल्ट बैठक का समय)।

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