नामकरण सम्मेलन: अंतिम क्षेत्र (स्थिर नहीं)


23

आज मैंने finalजावा कक्षाओं में खेतों के नामकरण के बारे में एक सहकर्मी के साथ चर्चा की ।

अपने चयन finalक्षेत्रों में भी स्थिरांक माना जाना चाहिए क्योंकि उदाहरण के निर्माण के बाद उनके मूल्यों में बदलाव नहीं होगा।

इससे finalखेतों के लिए निम्नलिखित नामकरण सम्मेलन होगा :

public class Foo {
    private static final String BLA_BLA = "bla";

    private final String BAR_BATZ;

    ...
}

मेरी राय में केवल static finalक्षेत्रों को ही स्थिरांक माना जाना चाहिए, जबकि ऐसे क्षेत्र जो केवल finalसामान्य कैमेलकेस नामकरण सम्मेलन का पालन करना चाहिए।

public class Foo {
    private static final String BLA = "bla";

    private final String barBatz;

    ...
}

अब मैं थोड़ा अनिश्चित हूं क्योंकि वह मुझसे कहीं अधिक अनुभवी प्रोग्रामर है और मैं आमतौर पर उसकी राय से सहमत हूं और उसे बहुत अच्छा डेवलपर मानता हूं।

इस पर कोई इनपुट?


आपके उदाहरण स्थिरांक नहीं हैं; आपने उन्हें संकलन समय पर कोई मान नहीं सौंपा है। एर्गो, वे स्थिरांक के लिए नामकरण सम्मेलनों का पालन नहीं करते हैं।
रॉबर्ट हार्वे

@RobertHarvey धन्यवाद, आप सही हैं। इसका ...मतलब किसी भी संभावित निर्माता का प्रतीक था जो finalक्षेत्र को सेट करता है , लेकिन यह स्पष्ट रूप से static finalक्षेत्र के लिए संभव नहीं है ।
साशा वुल्फ

1
@Zeeker आपको उन static { }ब्लॉकों में दिलचस्पी हो सकती है, जिनका उपयोग क्लास लोड होने पर एक बार के भीतर स्थिर फ़ील्ड सेट करने के लिए किया जा सकता है। जावा में स्थिर निर्माणकर्ता के साथ संबंधित कार्य

@RobertHarvey मैं उन लोगों से परिचित हूं। लेकिन फिर भी धन्यवाद।
साशा वुल्फ

1
मैं कहूंगा कि चूंकि चर एक उदाहरण के अंतर्गत आता है, यह उदाहरण से उदाहरण के लिए अलग होगा, इसलिए यह एक स्थिरांक के रूप में लागू नहीं होता है। मैं ऊंट मामले का उपयोग करेगा।
फ्लोरियन एफ

जवाबों:


20

सन (और अब ओरेकल) ने जावा प्रोग्रामिंग लैंग्वेज के लिए कोड कन्वेंशन नामक एक दस्तावेज बनाए रखा । इसके लिए अंतिम अद्यतन '99 में था, लेकिन स्टाइल गाइड लाइन का सार रहता है।

अध्याय 9 में नामकरण सम्मेलनों को शामिल किया गया है।

एक पहचानकर्ता प्रकार के लिए 'स्थिरांक':

घोषित वर्ग कांस्टेबल और ANSI स्थिरांक के चर सभी के नाम अपरकेस ("_") द्वारा अलग किए गए शब्दों के साथ होने चाहिए। (डिबगिंग में आसानी के लिए ANSI स्थिरांक से बचा जाना चाहिए।)

दिए गए उदाहरण:

static final int MIN_WIDTH = 4;

static final int MAX_WIDTH = 999;

static final int GET_THE_CPU = 1;

एक और हालिया दस्तावेज़ में - वहाँ में फिसल गया। से चर (जावा ट्यूटोरियल> सीखना जावा भाषा> भाषा की मूल बातें :

यदि आपके द्वारा चुना गया नाम केवल एक शब्द का है, तो उस शब्द को सभी लोअरकेस अक्षरों में लिखें। यदि इसमें एक से अधिक शब्द हैं, तो प्रत्येक बाद वाले शब्द के पहले अक्षर को कैपिटल में लिखें। नाम gearRatioऔर currentGearइस सम्मेलन के प्रमुख उदाहरण हैं। यदि आपका वैरिएबल एक स्थिर मान संग्रहीत करता है, जैसे कि static final int NUM_GEARS = 6, कन्वेंशन थोड़ा बदलता है, प्रत्येक अक्षर को कैपिटलाइज़ करता है और बाद के शब्दों को अंडरस्कोर कैरेक्टर के साथ अलग करता है। अधिवेशन द्वारा, अंडरस्कोर चरित्र का उपयोग कहीं और नहीं किया जाता है।

जावा के लिए कई स्थैतिक विश्लेषक इसे लागू करना चाहते हैं। उदाहरण के लिए चेकस्टाइल लागू होता है:

जाँचता है कि निरंतर नाम प्रारूप संपत्ति द्वारा निर्दिष्ट प्रारूप के अनुरूप हैं। एक स्थिर और अंतिम क्षेत्र या एक इंटरफ़ेस / एनोटेशन फ़ील्ड है, सिवाय serialVersionUIDऔर serialPersistentFields। प्रारूप एक नियमित अभिव्यक्ति है और इसके लिए चूक है ^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$


यह वास्तव में कोड लिखने वाले समुदाय के सम्मेलनों के लिए उकसाता है ... और आदर्श रूप से इसे समान रखते हुए।

ऊपर दिए गए उदाहरणों को static finalउन लोगों के रूप में दिया गया है जो संभवतः सी सम्मेलनों से लिए गए हैं #define- जो सी की तरह, रनटाइम के बजाय संकलन के दौरान कोड में बदल दिए जाते हैं।

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

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



@ रोबर्टहेरवे I कुछ स्थितियों के बारे में सोच सकता है जहां एक उदाहरण क्षेत्र एक स्थिर की तरह व्यवहार कर रहा है। एक फैक्ट्री, उदाहरण के लिए, किसी ऐसी चीज़ को आबाद करना जो अन्यथा वस्तु में एक स्थिर वस्तु होगी ... हालांकि ये बल्कि ऐसे उदाहरणों से मिलते हैं जो मेरे सिर को चोट पहुँचाते हैं और सिर्फ यह सोचते हैं कि कोई ऐसा क्यों करेगा।

इस विस्तृत उत्तर के लिए धन्यवाद। ऑब्जेक्ट के क्रमांकन के बारे में लिटमस टेस्ट ने मेरे लिए सौदा किया।
सास्का वुल्फ

एक सहकर्मी ने हाल ही में यह कहते हुए वैध बिंदु बनाया कि, एक बार, संपादक स्थिर / स्थिर फाइनल आदि को उजागर करने में बहुत अच्छे नहीं थे, इसलिए यह नामकरण सम्मेलन महत्वपूर्ण था। इन दिनों IDE बहुत अच्छे हैं, इसलिए हम शायद उनके लिए अच्छे दिखने वाले नाम बना सकते हैं, जैसे: के MinWidthबजाय MIN_WIDTH। एक और सवाल है: स्थिर अंतिम लकड़हारे के बारे में क्या? आप उन्हें फोन करते हैं LOG/ LOGGERया log/ logger। व्यक्तिगत रूप से, logकोड के साथ बेहतर इनलाइन दिखता है, लेकिन असंगतता कब स्वीकार्य है, अगर सभी पर?
ndtreviv

5

BAR_BATZइस उदाहरण में एक स्थिर नहीं है। के निर्माता Fooइसे ऑब्जेक्ट स्तर पर विभिन्न मूल्यों पर सेट कर सकते हैं। उदाहरण के लिए

public class Foo {
    private final String BAR_BATZ;

    Foo() {
       BAR_BATZ = "ascending";
    } 

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