c++ - क्या इस फ़ंक्शन में सभी नियंत्रण पथों पर स्पष्ट वापसी मान हैं?




templates return (2)

मेरे पास किसी भी प्रकार के डेटा के लिए एकता पर केंद्रित एक हेडवाइड स्टेप फंक्शन है , जिसका उपयोग करके मैंने एनकोड किया है:

template <typename T>
int h1(const T& t){
   if (t < 1){
       return 0;
   } else if (t >= 1){
       return 1;
   }
}

कोड समीक्षा में, मेरे समीक्षक ने मुझे बताया कि सभी नियंत्रण मार्गों पर स्पष्ट वापसी नहीं है। और संकलक मुझे चेतावनी नहीं देता है। लेकिन मैं सहमत नहीं हूं; स्थितियाँ परस्पर अनन्य हैं। इससे मैं कैसे निपटूं?


जैसा कि कहा गया है, कुछ विशेष संख्याएं दोनों < और >= , इसलिए आपका समीक्षक बस सही है।

सवाल यह है कि क्या आप इसे इस तरह से कोडित करना चाहते हैं? आप अपने और दूसरों के लिए जीवन को इतना कठिन बनाने पर भी विचार क्यों करते हैं (जिन लोगों को आपका कोड बनाए रखने की आवश्यकता है)? बस यह तथ्य कि आप काफी चतुर हैं कि < और >= सभी मामलों को कवर करना चाहिए इसका मतलब यह नहीं है कि आपको कोड को आवश्यक से अधिक जटिल बनाना होगा। कोड के लिए भौतिक विज्ञान क्या जाता है: चीजों को जितना संभव हो उतना सरल बनाएं, लेकिन सरल नहीं (मेरा मानना ​​है कि आइंस्टीन ने यह कहा है)।

इसके बारे में सोचो। आप क्या हासिल करने का प्रयास कर रहे हैं? कुछ इस तरह से होना चाहिए: 'रिटर्न 0 यदि इनपुट 1 से कम है, तो 1 वापस करें।' आपने जो किया है उसे कहकर बुद्धिमत्ता बढ़ाई गई है ... ओह, लेकिन इसका मतलब है कि मैं 1 वापस करता हूं यदि टी अधिक से अधिक या बराबर है। 1. इस तरह के अनावश्यक 'एक्स से तात्पर्य वाई' को अनुचर की ओर से अतिरिक्त विचार कार्य की आवश्यकता होती है। अगर आपको लगता है कि यह एक अच्छी बात है, तो मैं खुद से कुछ साल के कोड रखरखाव करने की सलाह दूंगा।

अगर यह मेरी समीक्षा थी, तो मैं एक और टिप्पणी करूंगा। यदि आप 'if' स्टेटमेंट का उपयोग करते हैं, तो आप मूल रूप से सभी शाखाओं में अपनी इच्छानुसार कुछ भी कर सकते हैं। लेकिन इस मामले में, आप 'कुछ भी' नहीं करते हैं। आप जो करना चाहते हैं, वह 0 या 1 पर निर्भर करता है, भले ही टी <1 या नहीं। उन मामलों में, मुझे लगता है कि '?:' का बयान इफ स्टेटमेंट की तुलना में बहुत बेहतर और पठनीय है। इस प्रकार:

return t<1 ? 0 : 1;

मुझे पता है?: ऑपरेटर को कुछ कंपनियों में मना किया जाता है, और मुझे लगता है कि एक भयानक काम करना है। ?: आमतौर पर विनिर्देशों के साथ बहुत बेहतर मेल खाता है, और यह कोड को पढ़ने में बहुत आसान बना सकता है (यदि देखभाल के साथ उपयोग किया जाता है) ...


यह इस बात पर निर्भर करता है कि टेम्पलेट का उपयोग कैसे किया जाता है। एक int , आप ठीक हैं।

लेकिन , अगर t एक IEEE754 फ़्लोटिंग पॉइंट double टाइप है जिसका मान NaN सेट है, न तो t < 1 और न ही t >= 1 true और इसलिए प्रोग्राम कंट्रोल if block के अंत तक पहुँच जाता है! यह फ़ंक्शन को एक स्पष्ट मूल्य के बिना वापस जाने का कारण बनता है; जिसका व्यवहार अपरिभाषित है।

(एक अधिक सामान्य मामले में, जहां T < और >= ऑपरेटरों को इस तरह से ओवरलोड करता है जैसे सभी संभावनाओं को कवर नहीं करने के लिए, प्रोग्राम नियंत्रण बिना स्पष्ट return साथ ब्लॉक के अंत तक पहुंच जाएगा।)

यहाँ कहानी का नैतिक यह तय करना है कि कौन सी शाखा डिफ़ॉल्ट होनी चाहिए, और यह एक else मामला बनाना चाहिए।







code-coverage