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


20

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

कहा जाता है:

डिफ़ॉल्ट मान

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

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

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

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


5
हुह। मुझे कभी नहीं पता था कि बयान वहां था। मैं वास्तव में उन पर भरोसा करना अच्छा अभ्यास मानता हूं। private int count = 0;कोड है जो कुछ भी नहीं करता है, और कोड जो कुछ नहीं करता है वह अव्यवस्था है। यह java.lang से कक्षाएं आयात करने या वर्ग घोषित करने जैसा है extends Object
VGR

2
... या public abstractइंटरफ़ेस में एक विधि होना।
mumpitz

1
सार्वजनिक सार के साथ क्या गलत है?
जॉन कीट्स

1
पहेली का एक टुकड़ा C ++ से आ सकता है। यह एक लोकप्रिय भाषा है, और डिफ़ॉल्ट आरंभीकरण बनाम शून्य आरंभीकरण से निपटने के लिए बग का एक निरंतर स्रोत है। C ++ में, यह सीधे तौर पर सभी असाधारण मामलों में चूक पर भरोसा करने के लिए एक बुरा विचार है। कि सांस्कृतिक रूप से जावा में लीक हो सकता है।
कोरट अमोन

@ जॉनकेट्स - मेरा जावा थोड़ा कठोर है, लेकिन privateएक इंटरफेस में तरीकों का कोई मतलब नहीं होगा, और abstractनिहित है।
स्कॉट स्मिथ

जवाबों:


6

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

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

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

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

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


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

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

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

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

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

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


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

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

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

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


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

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


19

सरल: डिफ़ॉल्ट मानों पर भरोसा इरादे का संचार नहीं करता है।

क्या आप वास्तव में उस क्षेत्र को 0 से शुरू करना चाहते हैं, या क्या आप एक मान निर्दिष्ट करना भूल गए हैं?

और निश्चित रूप से, एक अशक्त संदर्भ उन दो चीजों का आधा हिस्सा है जिन्हें आपको नलपॉइंट अपवाद में चलाने की आवश्यकता है।

अंत में, चूक का उपयोग करने का अर्थ है कि आपके पास गैर अंतिम क्षेत्र हैं। जिसे आप जहां संभव हो टाल दें।

एकमात्र काउंटर तर्क यह है: उन चीजों को क्यों लिखना चाहिए जो आपके पास नहीं हैं? लेकिन मुझे लगता है कि सूचीबद्ध नुकसान ट्रम्पेट है, इस प्रकार 0 को स्पष्ट रूप से संकलित करने से बेहतर है कि किसी क्षेत्र को असाइन करना।


3
फिर से: इरादे का संचार नहीं - क्या होगा अगर "मैनी द मेंटेनर" आपके कोड को देख रहा है और यह नहीं जानता कि एक विशिष्ट डेटा प्रकार के लिए डिफ़ॉल्ट क्या है। वह मान रहा है कि यह 0 है जब यह वास्तव में NULL है और यह एक === चेक पर पूरा बग है (या मान और प्रकार के लिए समान समानता की जांच जावा में है, बराबर) (?)। घंटे की खोज (एक अनुभवहीन प्रोग्रामर के लिए) कुछ सरल का परिणाम हो सकता है। शैतान के वकील की भूमिका निभाने की कोशिश कर रहे पी.एस. मैं कहता हूं कि पूरे दिन डिफॉल्ट्स का उपयोग करें (भले ही मैं कभी न करूं) और अपने कोड को बनाए रखने के लिए होशियार लोगों (या विस्तार पर कम से कम अधिक ध्यान) प्राप्त करें।
23

@TCooper जब मैनर मेंटेनर जावा के बारे में इतना कम जानता है, तो उसके पास वास्तविक विश्व जावा कोड को छूने वाला कोई व्यवसाय नहीं है। लेकिन मैं अंतर्निहित धारणा से सहमत हूं। यह newbies के लिए चीजों को कठिन बनाता है।
घोस्टकट ने मोनिका सी।

12

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

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

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

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


2
यह शायद सही है, हालांकि मैं इससे सहमत नहीं हूं।
VGR

3
@ वीजीआर जितना मैं इस दावे से सहमत हूं कि डिफ़ॉल्ट मूल्यों पर निर्भर होना उप-इष्टतम है, मैं उस कारण के लिए तटस्थ तरीके से वाक्यांश के लिए सावधान था। कोड की गुणवत्ता व्यक्तिपरक है, और मैं अच्छी तरह से जानता हूं कि यह किसी भी तरह से एक सार्वभौमिक दृष्टिकोण नहीं है।
माइकल बेरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.