कोडिंग कन्वेंशन - नामकरण एनम


289

क्या जावा में गणना नामकरण के लिए एक सम्मेलन है?

मेरी प्राथमिकता यह है कि एक एनुम एक प्रकार है। उदाहरण के लिए, आपके पास एक एनम है

Fruit{Apple,Orange,Banana,Pear, ... }

NetworkConnectionType{LAN,Data_3g,Data_4g, ... }

मैं इसका नामकरण करने का विरोध कर रहा हूं:

FruitEnum
NetworkConnectionTypeEnum

मैं समझता हूं कि यह जानना आसान है कि कौन सी फाइलें एनम हैं, लेकिन फिर आपके पास भी होंगी:

NetworkConnectionClass
FruitClass

इसके अलावा, स्थिरांक के लिए एक ही दस्तावेज है, जहां उन्हें घोषित करने के लिए, आदि।


2
कृपया इसे सामुदायिक विकी बनाएं। के रूप में एक भी स्वीकार्य जवाब नहीं है, और यह अन्यथा बंद हो जाएगा।
अलेक्जेंडर पोगरेबनीक

13
@ अलेक्सेंडर पोगरेबनीक नहीं, एक जवाब है।
टॉम हॉल्टिन -

जवाबों:


473

Enums कक्षाएं हैं और कक्षाओं के लिए सम्मेलनों का पालन करना चाहिए। एक enum के उदाहरण स्थिरांक हैं और स्थिरांक के लिए सम्मेलनों का पालन करना चाहिए। इसलिए

enum Fruit {APPLE, ORANGE, BANANA, PEAR};

FruitEnum को FruitClass से अधिक लिखने का कोई कारण नहीं है। आप केवल चार (या पाँच) वर्णों को बर्बाद कर रहे हैं जो कोई जानकारी नहीं जोड़ते हैं।

जावा स्वयं इस दृष्टिकोण की सिफारिश करता है और इसका उपयोग उनके उदाहरणों में किया जाता है


22
मैंने अपने एनम को इस तरह से नाम देना शुरू कर दिया, लेकिन पठनीयता के लिए, मैं अब फ्रूट.एपीपीएल के बजाय फ्रूट.एपल का उपयोग कर रहा हूं।

38
@Alter एक Enum उदाहरण क्यों बना होगा जैसे यह एक पठनीयता बढ़ाने वाला वर्ग था?
डीजेकेवर्थ

17
तकनीकी तौर पर, enum उदाहरणों हैं वर्गों। इसलिए उनके पास तरीके हो सकते हैं।
टेड होप

87
नहीं, एक एनुम उदाहरण एक उदाहरण है। एक एनम एक वर्ग है।
डीजेकेवर्थ

30
एक नामकरण पैटर्न का विचार जो मुझे Fruit.APPLE.chew () टाइप करता है, वास्तव में मुझे परेशान करता है। इसके अलावा, हालांकि यह एक बहुत बुरा अभ्यास होगा, APPLE को एक स्थिर (अपरिवर्तनीय) होना जरूरी नहीं है। पूर्ण java कक्षाओं के लिए enums के प्रचार के साथ, मुझे यकीन है कि कुछ के लिए विकसित सम्मेलनों का उपयोग कर रहा हूँ जो c (ऑब्जेक्ट्स में नहीं हैं, enums) हमेशा समझ में नहीं आता
बिल K

76

यह शायद मुझे बहुत सारे नए दोस्त नहीं बनाएगा, लेकिन यह जोड़ा जाना चाहिए कि C # लोगों की एक अलग गाइडलाइन है: enum के उदाहरण "पास्कल केस" (ऊपरी / निचला मामला मिश्रित) हैं। देखें stackoverflow चर्चा और MSDN गणन प्रकार नाम रखने हेतु निर्देश

जैसा कि हम एक सी # प्रणाली के साथ डेटा का आदान-प्रदान कर रहे हैं, मुझे उनके एनमों को बिल्कुल कॉपी करने के लिए लुभाया जाता है, जावा के "स्थिरांक में बड़े नाम हैं" सम्मेलन की अनदेखी। इसके बारे में सोचते हुए, मैं बहुत अधिक मूल्य नहीं देख रहा हूँ कि एनम इंस्टेंसेस के लिए अपरकेस तक ही सीमित है। कुछ उद्देश्यों के लिए .name () एक आसान शॉर्टकट है जो एक एनम कंटीन्यू के पठनीय प्रतिनिधित्व को प्राप्त करता है और एक मिश्रित केस का नाम अच्छे लगेंगे।

तो, हां, मैं जावा एनम नामकरण सम्मेलन के मूल्य पर सवाल उठाता हूं। यह तथ्य कि "प्रोग्रामिंग दुनिया का दूसरा हिस्सा" वास्तव में एक अलग शैली का उपयोग करता है, मुझे लगता है कि यह हमारे अपने धर्म पर संदेह करने के लिए वैध है।


7
TIL कि केवल Java या C # प्रोग्रामर ही वास्तविक प्रोग्रामर हैं, और उनकी संख्या बराबर है। #sarcasm
Mindwin

14
सी # एक अन्यथा महान भाषा है, लेकिन यह सिर्फ सादा मूर्खतापूर्ण है। सब कुछ C # में बहुत अधिक पास्कल मामला है, जो मूल रूप से एक ही नामकरण सम्मेलनों में होने के समान है; आप एक नाम देखकर कुछ नहीं हासिल करते हैं। आप यह नहीं बता सकते हैं कि यह एक वर्ग, विधि, संपत्ति, आदि है
बेसिनेटर

3
इसके अलावा, बूलियन व्यावहारिक रूप से एक एनम है, उदाहरण निचले हिस्से में सच और झूठ हैं। तो हाँ, सभी टोपियां बदसूरत हैं।
फ्लोरियन एफ

@FlorianF, प्राथमिक प्रकार के बूलियन को वर्ग बूलियन ( docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html ) के साथ भ्रमित न करें । वर्ग अपरकेस सम्मेलन का उपयोग करता है
IvoC

24

जैसा कि पहले ही कहा गया है, ओरेकल वेबसाइट ( http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html ) पर डॉक्स के अनुसार एनुम इंस्ट्रूमेंट्स अपरकेस होना चाहिए ।

हालाँकि, Oracle वेबसाइट ( http://www.oracle.com/technetwork/java/javaee/downloads/index.html ) पर एक JavaEE7 ट्यूटोरियल देख रहे हैं , मैं "ड्यूक की किताबों की दुकान" ट्यूटोरियल और एक कक्षा में ठोकर खाई tutorial\examples\case-studies\dukes-bookstore\src\main\java\javaeetutorial\dukesbookstore\components\AreaComponent.java), मुझे निम्नलिखित एनम परिभाषा मिली:

private enum PropertyKeys {
    alt, coords, shape, targetImage;
}

सम्मेलनों के अनुसार, इसे इस तरह देखा जाना चाहिए:

public enum PropertyKeys {
    ALT("alt"), COORDS("coords"), SHAPE("shape"), TARGET_IMAGE("targetImage");

    private final String val;

    private PropertyKeys(String val) {
        this.val = val;
    }

    @Override
    public String toString() {
        return val;
    }
}

तो ऐसा लगता है कि Oracle के लोग कभी-कभी सुविधा के साथ व्यापार सम्मेलन भी करते हैं।


13

हमारे कोडबेस में; हम आम तौर पर उस वर्ग में दुश्मनी की घोषणा करते हैं जो वे संबंधित हैं।

इसलिए आपके फलों के उदाहरण के लिए, हमारे पास एक फ्रूट क्लास होगा, और उसके अंदर एक एनुम जिसे फ्रूट्स कहा जाता है।

कोड में इसे संदर्भित करना इस तरह दिखता है: Fruit.Fruits.Apple, Fruit.Fruits.Pearआदि।

कॉन्स्टेंट उसी लाइन के साथ चलते हैं, जहां वे या तो उस कक्षा में परिभाषित हो जाते हैं जिसमें वे प्रासंगिक होते हैं (इसलिए कुछ ऐसा Fruit.ORANGE_BUSHEL_SIZE); या यदि वे "कॉन्स्टेंटमैनेजर" (या समतुल्य; जैसे ConstantManager.NULL_INT) नामक वर्ग में सिस्टम-वाइड (ints के लिए एक समान "शून्य मान" ) लागू करते हैं। (साइड नोट; हमारे सभी स्थिरांक ऊपरी मामले में हैं)

हमेशा की तरह, आपके कोडिंग मानक शायद खदान से अलग हैं; इसलिए YMMV।


5
मैं जोड़ना चाहता हूं कि ऐसा लगता है कि आजकल ऑब्जेक्ट फैक्ट्रीज़ का उपयोग प्लुरल्स का उपयोग करके किया जाता है, उदाहरण के लिए Listsऔर Maps। मेरी राय में यह एक अच्छा सम्मेलन है और मैं इसके अधिक व्यापक उपयोग का पूर्ण समर्थन करता हूं।
एस्को जू

हाँ, वे मेरे व्यक्तिगत कोडिंग मानकों के समान हैं, लेकिन मेरे कार्यस्थल कोडिंग मानकों से भिन्न हैं। हमारे पास काम के लिए कई मानक नहीं हैं, इसलिए मैं एक संदर्भ के रूप में उपयोग करने के लिए एक अच्छा दस्तावेज़ खोजने की कोशिश कर रहा हूं।

8
Fruit.Fruits.Appleमेरे लिए बहुत क्रियात्मक है, सचमुच DRY सिद्धांत को तोड़ते हुए :-) मैं पसंद करूंगा Fruit.Type.APPLE
पेटर तोर्क

2
मुझे यह तरीका पसंद नहीं है। जिस तरह से यह नाम दिया गया है, एक Apple या तो एक फल है, या बहुत कम से कम यह भ्रामक है क्योंकि यह स्पष्ट नहीं है कि Apple एक फल नहीं है। मुझे पीटर का टाइप उदाहरण पसंद है। कम से कम तब यह स्व दस्तावेज है कि सेब एक प्रकार का फल है। हालांकि इस पूरे फल का उदाहरण बदबूदार है ...
मार्क पीटर्स

1
मुझे भी यह पसंद नहीं है। यदि If फल ’वर्ग किसी फल का प्रतिनिधित्व करता है (और उसे चाहिए) तो represent फल’ किसका प्रतिनिधित्व कर सकता है? यदि फ्रूट (द क्लास) वास्तव में फ्रूट से निपटने के लिए एक क्लास है, तो इसे "फ्रूटहैंडलर 'या' मैनमैनमैन 'नाम दिया जाना चाहिए।
डीजेकवर्थ

7

वे अभी भी प्रकार हैं, इसलिए मैं हमेशा कक्षाओं के लिए उपयोग किए जाने वाले समान नामकरण का उपयोग करता हूं।

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

सबसे अच्छा संदर्भ जो मुझे नामांकित स्थिरांक के लिए मिल सकता है, चर चर ट्यूटोरियल से आता है :

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



1

यदि मैं अपना $ 0.02 जोड़ सकता हूं, तो मैं सी में एनम मूल्यों के रूप में पास्कलकेस का उपयोग करना पसंद करता हूं।

सी में, वे मूल रूप से वैश्विक हैं, और PEER_CONNECTED वास्तव में थका हुआ है जैसा कि PeerConnected के विपरीत है।

साफ़ हवा में सांस लें।

सचमुच, यह मुझे साँस लेने में आसान बनाता है।

जावा में, जब तक आप उन्हें किसी दूसरे वर्ग से आयात नहीं करते तब तक कच्चे एनम नामों का उपयोग करना संभव है।

import static pkg.EnumClass.*;

अब, आप अयोग्य नामों का उपयोग कर सकते हैं, कि आप पहले से ही एक अलग तरीके से योग्य हैं।

मैं वर्तमान में (सी) जावा के लिए कुछ सी कोड को पोर्ट करने के बारे में सोच रहा हूं और वर्तमान में जावा कन्वेंशन (जो अधिक क्रियात्मक, अधिक लंबा और अधिक बदसूरत है) और मेरी सी शैली चुनने के बीच 'फटा हुआ' है।

PeerConnected स्विच स्टेटमेंट को छोड़कर PeerState.CONNECTED हो जाएगा, जहां यह कनेक्टेड है।

बाद के सम्मेलन के लिए कहने के लिए बहुत कुछ है और यह अच्छा लेकिन कुछ "मुहावरेदार वाक्यांशों" जैसा if (s == PeerAvailable)दिखता है if (s == PeerState.AVAILABLE)और जैसे उदासीन रूप से, यह मेरे लिए अर्थ का नुकसान है।

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

अब मुझे एहसास हुआ कि PascalCase जावा में पहले से ही व्यापक रूप से उपयोग किया जाता है, लेकिन बहुत ही भ्रमित यह वास्तव में नहीं होगा, बस जगह से एक बालक।


0
enum MyEnum {VALUE_1,VALUE_2}

(लगभग) कह की तरह है

class MyEnum {

    public static final MyEnum VALUE_1 = new MyEnum("VALUE_1");
    public static final MyEnum VALUE_2 = new MyEnum("VALUE_2");

    private final name;

    private MyEnum(String name) {
        this.name = name;
    }

    public String name() { return this.name }
}

इसलिए मुझे लगता है कि सभी टोपी कड़ाई से अधिक सही हैं, लेकिन फिर भी मैं वर्ग नाम सम्मेलन का उपयोग करता हूं क्योंकि मैं सभी टोपी से नफरत करता हूं

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