java - डिफ़ॉल्ट फ़ील्ड आरंभीकरण पर भरोसा करना-खराब प्रोग्रामिंग शैली है?




default-value instance-variables (2)

क्यों पृथ्वी पर यह एक बुरा प्रोग्रामिंग अभ्यास है

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

... अगर यह व्यापक रूप से जावा एसई पुस्तकालयों स्रोत कोड में भी उपयोग किया जाता है ??

जावा स्रोत कोड वास्तव में ऐसा कुछ नहीं है जिस पर आपको अनुकरणीय कोडिंग अभ्यास के उदाहरण के रूप में भरोसा करना चाहिए। ऐसे कई मामले हैं जहां इस तरह के नियमों का उल्लंघन किया जाता है (कभी-कभी जानबूझकर मामूली प्रदर्शन में सुधार के लिए, और कभी-कभी गलती से या क्योंकि स्वीकृत शैली वर्षों में बदल गई है।)

मुझे आधिकारिक ओरेकल दस्तावेज़ का लिंक दिया गया था: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

कहा जाता है:

डिफ़ॉल्ट मान

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

मैं इस हिस्से पर जोर देना चाहता हूं:

ऐसे डिफ़ॉल्ट मूल्यों पर भरोसा करना, हालांकि, आमतौर पर खराब प्रोग्रामिंग शैली माना जाता है।

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


उद्धृत पाठ है:

"इस तरह के डिफ़ॉल्ट मूल्यों पर भरोसा करना, हालांकि, आमतौर पर खराब प्रोग्रामिंग शैली माना जाता है।"

निंदात्मक: "यह आमतौर पर माना जाता है कि" अक्सर यह कहने का एक तरीका है कि लेखक ने प्रस्तुत कथन के लिए एक आधिकारिक स्रोत खोजने की कोशिश नहीं की है।

इस मामले में दावा स्पष्ट रूप से संदिग्ध है। साक्ष्य: 5 में से 5 जावा स्टाइल गाइड सैंपल कुछ भी नहीं कहते हैं कि आपको डिफ़ॉल्ट मानों पर भरोसा करना चाहिए या नहीं:

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

ठीक। तो क्या यह वास्तव में जावा कोड की पठनीयता में सहायता करता है?

यह बहस का मुद्दा है।

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

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

मेरे दिमाग में, एक क्षेत्र के निरर्थक आरंभीकरण द्वारा प्राप्त की जाने वाली एकमात्र चीज आपके कोड के भविष्य के पाठक को संकेत देना है कि आपने प्रारंभिक मूल्य के बारे में सोचा है । (जैसा @GhostCat ने व्यक्त किया, डिफ़ॉल्ट आरंभीकरण इरादे का संचार नहीं करता है।)

लेकिन इसके विपरीत अगर मैं वह पाठक होता, तो मुझे जरूरी नहीं कि कोड लेखक की सोच पर भरोसा होता। तो इस "सिग्नल" का मूल्य भी संदिग्ध है।

विश्वसनीयता के बारे में क्या?

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

संक्षेप में, एक चर का रनटाइम व्यवहार जो स्पष्ट रूप से आरंभिक नहीं है, पूरी तरह से अनुमानित है।

C या C ++ जैसी भाषाओं में इसके विपरीत जहां चर को प्रारंभ नहीं किया जा सकता है, व्यवहार अनिर्दिष्ट है , और विभिन्न प्लेटफ़ॉर्म पर क्रैश और व्यवहार में अंतर पैदा कर सकता है। हमेशा स्पष्ट रूप से चर को शुरू करने का मामला यहां बहुत मजबूत है।

प्रदर्शन के बारे में क्या?

इससे कोई फर्क नहीं पड़ना चाहिए। जेआईटी संकलक एक निरर्थक आरंभीकरण और डिफ़ॉल्ट आरंभीकरण के समान ही व्यवहार करने में सक्षम होना चाहिए।





instance-variables