मैं कुछ समय से इस मुद्दे के बारे में सोच रहा था और मैं अन्य डेवलपर्स से राय लेने के लिए उत्सुक था।
मेरे पास प्रोग्रामिंग की एक बहुत ही रक्षात्मक शैली है। मेरा विशिष्ट ब्लॉक या तरीका इस तरह दिखता है:
T foo(par1, par2, par3, ...)
{
// Check that all parameters are correct, return undefined (null)
// or throw exception if this is not the case.
// Compute and (possibly) return result.
}
इसके अलावा, गणना के दौरान, मैं उन्हें इंगित करने से पहले सभी बिंदुओं की जांच करता हूं। मेरा विचार यह है कि, अगर कुछ बग है और कुछ NULL पॉइंटर को कहीं दिखाई देना चाहिए, तो मेरे प्रोग्राम को यह अच्छी तरह से संभालना चाहिए और गणना को जारी रखने से इनकार करना चाहिए। बेशक यह लॉग या कुछ अन्य तंत्र में एक त्रुटि संदेश के साथ समस्या को सूचित कर सकता है।
इसे और अधिक अमूर्त तरीके से रखने के लिए, मेरा दृष्टिकोण है
if all input is OK --> compute result
else --> do not compute result, notify problem
अन्य डेवलपर्स, उनमें से मेरे कुछ सहयोगी, एक और रणनीति का उपयोग करते हैं। उदाहरण के लिए, वे संकेत की जाँच नहीं करते हैं। वे मानते हैं कि कोड का एक टुकड़ा सही इनपुट दिया जाना चाहिए और अगर इनपुट गलत है तो क्या होता है इसके लिए जिम्मेदार नहीं होना चाहिए। इसके अलावा, यदि कोई NULL पॉइंटर अपवाद प्रोग्राम को क्रैश करता है, तो परीक्षण के दौरान बग आसानी से मिल जाएगा और निश्चित होने की अधिक संभावना है।
इस पर मेरा जवाब सामान्य रूप से है: लेकिन क्या होगा यदि परीक्षण के दौरान बग नहीं मिला है और प्रकट होता है जब उत्पाद पहले से ही ग्राहक द्वारा उपयोग किया जा रहा है? बग के लिए खुद को प्रकट करने का एक पसंदीदा तरीका क्या है? क्या यह एक ऐसा कार्यक्रम होना चाहिए जो एक निश्चित कार्रवाई नहीं करता है, लेकिन फिर भी काम करना जारी रख सकता है, या एक प्रोग्राम जो क्रैश हो जाता है और उसे फिर से चालू करने की आवश्यकता है?
सारांश
गलत इनपुट से निपटने के लिए आप दोनों में से कौन सा दृष्टिकोण सुझाएगा?
Inconsistent input --> no action + notification
या
Inconsistent input --> undefined behaviour or crash
संपादित करें
उत्तर और सुझाव के लिए धन्यवाद। मैं अनुबंध से भी डिजाइन का प्रशंसक हूं। लेकिन यहां तक कि अगर मुझे उस व्यक्ति पर भरोसा है जिसने मेरे तरीकों को कॉल करने वाले कोड को लिखा है (शायद यह खुद है), अभी भी बग हो सकते हैं, जिससे गलत इनपुट हो सकता है। इसलिए मेरा दृष्टिकोण यह है कि किसी विधि को सही इनपुट पारित न किया जाए।
इसके अलावा, मैं समस्या को पकड़ने और इसके बारे में सूचित करने के लिए एक तंत्र का उपयोग करूंगा। एक विकास प्रणाली पर, यह उपयोगकर्ता को सूचित करने के लिए एक संवाद खोलेगा। एक उत्पादन प्रणाली में यह सिर्फ लॉग में कुछ जानकारी लिखेगा। मुझे नहीं लगता कि अतिरिक्त जांच से प्रदर्शन संबंधी समस्याएं हो सकती हैं। मुझे यकीन नहीं है कि यदि दावे पर्याप्त हैं, अगर उन्हें उत्पादन प्रणाली में बंद कर दिया जाता है: शायद उत्पादन में कुछ स्थिति उत्पन्न होगी जो परीक्षण के दौरान नहीं हुई थी।
वैसे भी, मैं वास्तव में आश्चर्यचकित था कि कई लोग विपरीत दृष्टिकोण का पालन करते हैं: उन्होंने एप्लिकेशन को "ऑन-उद्देश्य" को क्रैश कर दिया क्योंकि वे बनाए रखते हैं कि इससे परीक्षण के दौरान बग ढूंढना आसान हो जाएगा।