एनम नामकरण कन्वेंशन - बहुवचन


267

मैं इसी तरह के पढ़ने के बावजूद यह सवाल पूछ रहा हूं, लेकिन वास्तव में ऐसा नहीं है कि मैं एन # के लिए सी # नामकरण सम्मेलन और संपत्ति का मिलान चाहता हूं

मैंने पाया कि मेरे पास बहुवचन में नाम रखने की प्रवृत्ति है और फिर उन्हें एकवचन के रूप में उपयोग करना है, उदाहरण:

public enum EntityTypes {
  Type1, Type2
}

public class SomeClass {
  /*
    some codes
  */

  public EntityTypes EntityType {get; set;}

}

बेशक यह काम करता है और यह मेरी शैली है, लेकिन क्या किसी को इस तरह के सम्मेलन के साथ संभावित समस्या मिल सकती है? मेरे पास "स्थिति" शब्द के साथ एक "बदसूरत" नामकरण है:

public enum OrderStatuses {
  Pending, Fulfilled, Error, Blah, Blah
}

public class SomeClass {
  /*
    some codes
  */

  public OrderStatuses OrderStatus {get; set;}

}

अतिरिक्त जानकारी: शायद मेरा प्रश्न पर्याप्त स्पष्ट नहीं था। अपने परिभाषित एनम प्रकार के चर का नामकरण करते समय मुझे अक्सर कठिन सोचना पड़ता है। मैं सबसे अच्छा अभ्यास जानता हूं, लेकिन यह उन चरों के नामकरण के मेरे काम को आसान बनाने में मदद नहीं करता है।

मैं संभवतः अपने सभी एनम गुणों ("स्टेटस") को "MyStatus" के रूप में उजागर नहीं कर सकता।

मेरा प्रश्न: क्या ऊपर वर्णित मेरे अधिवेशन से किसी को संभावित समस्या हो सकती है? यह सबसे अच्छा अभ्यास के बारे में नहीं है।

प्रश्न प्रतिफल:

ठीक है, मुझे लगता है कि मुझे इस तरह से सवाल पूछना चाहिए: क्या कोई ईनम प्रकार के नामकरण का एक अच्छा सामान्य तरीका निकाल सकता है जैसे कि जब इस्तेमाल किया जाता है, तो एनम 'उदाहरण' का नामकरण बहुत सीधा होगा?


5
public enum OrderState ... - सार्वजनिक ऑर्डरस्ट्रीम ऑर्डरस्टैटस {प्राप्त करें; सेट;}
फ्रेजर

जवाबों:


333

Microsoft Enumजब तक Enumबिट फ़ील्ड का प्रतिनिधित्व नहीं करता है ( तब तक उपयोग करें) एकवचन का उपयोग करने की अनुशंसा करता है FlagsAttribute। देखें गणन प्रकार नामकरण सम्मेलनों (माइक्रोसॉफ्ट के के एक सबसेट नाम रखने हेतु निर्देश )।

आपके स्पष्टीकरण का जवाब देने के लिए, मुझे निम्नलिखित में से कुछ भी गलत नहीं है:

public enum OrderStatus { Pending, Fulfilled, Error };

public class SomeClass { 
    public OrderStatus OrderStatus { get; set; }
}

या

public enum OrderStatus { Pending, Fulfilled, Error };

public class SomeClass {
    public OrderStatus Status { get; set; }
}

20
हां, यह एक सही उत्तर है। इस गाइडलाइन्स का उपयोग .Net फ्रेमवर्क जैसे एनम डेऑफवेक और झंडे एनुम रेगेक्सओजेस में किया जाता है।
अलेक्जेंडर ज्विटबाम

1
हां, यह अनुशंसित अभ्यास है, मैं इसका स्वागत करता हूं। हालाँकि यह मेरे प्रश्न का उत्तर नहीं देता है।
okw

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

4
यहाँ जवाब में लिंक Microsoft नामकरण परंपराओं के .net 4.0 संस्करण का लिंक दिया गया है।

1
@ थोमस के साथ मुझे कभी कोई समस्या नहीं हुई, मैं यह नहीं देख सकता कि यह काम क्यों नहीं करेगा - एक संदर्भ नहीं देखें जहां यह अस्पष्ट होगा कि क्या यह एक प्रकार या चर संदर्भित किया जा रहा है। यानी OrderStatus == OrderStatus.Pendingबाईं ओर एक चर के रूप में पहचाना जाता है और फिर दाईं ओर एक गणना
जेम्स हर्ले

39

मैंने बहुवचन में नामकरण की शुरुआत की, लेकिन तब से एकवचन में बदल गया। बस लगता है कि वे कहाँ उपयोग किया जाता है के संदर्भ में अधिक समझ में आता है।

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

से तुलना:

Statuses myStatus = Statuses.Ready;

मुझे संदर्भ में अधिक स्वाभाविक ध्वनि के लिए एकवचन रूप मिला। हम सहमति में हैं कि जब एनम की घोषणा की जाती है, जो एक ही स्थान पर होती है, हम सोच रहे हैं "यह व्हाट्सएप का एक समूह है", लेकिन इसका उपयोग करते समय, संभवतः कई स्थानों पर, कि हम सोच रहे हैं "यह एक है जो" ।


6
थोड़ी देर की प्रतिक्रिया (और शायद थोड़ा ऑफ-टॉपिक) लेकिन: मैं 0अज्ञात मूल्य के लिए मूल्य का उपयोग करने का सुझाव दूंगा, इस तरह एक अनइंस्टाल्यूटेड चर डिफ़ॉल्ट रूप से होता है Unknown
स्वेनएल

सहमत, @SvenL तदनुसार अद्यतन उदाहरण।
बॉब कॉफमैन

क्या आप वास्तव में [Flags]अपने उदाहरण पर एक विशेषता डाल सकते हैं? यह दोनों "अधूरा" और "तैयार" दोनों की स्थिति के लिए कुछ के लिए कोई मतलब नहीं है। यदि आपके पास था enum [Flags]Steps { First, Second, Third }, तो क्या आप वास्तव में अपने चर को नाम देंगे completedStep?
पाकमन

26

स्थिति वास्तव में बहुवचन पर लागू नहीं होती है।

किसी enumचीज़ या किसी चीज़ का गुण दिखाता है। मैं एक उदाहरण दूंगा:

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

आपके पास एक प्रकार हो सकता है, लेकिन बहुवचन के बजाय इसे कई में सोचने का प्रयास करें:

Humour.Irony | Humour.Sarcasm

बजाय

Humours { Irony, Sarcasm }

आपके पास हास्य की भावना है, आपके पास हास्य की भावना नहीं है।


5
Haha, ठीक है, प्रोग्रामर हमेशा व्याकरणिक / राजनीतिक रूप से सही नहीं होते हैं। आपके मामले में, मैं "HumourTypes" का उपयोग करता हूं। बुरी आदत मुझे लगता है।
OKW

क्या होगा यदि मैं जो ताना का अनुभव हो या विडंबना की भावना है सभी व्यक्तियों के लिए खोज करना चाहते हैं, मैं नहीं खोज दिनचर्या का एक उदाहरण से होकर गुजरेगा Humoursयुक्त Humours.Irony | Huomours.Sarcasm??
चार्ल्स ब्रेटाना

14

सामान्य तौर पर, सबसे अच्छी अभ्यास सिफारिश एकवचन होती है, उन एनमों को छोड़कर जिनके पास [झंडे] विशेषता होती है, (और इसलिए उनमें बिट फ़ील्ड शामिल हो सकते हैं), जो बहुवचन होना चाहिए।

आपके संपादित प्रश्न को पढ़ने के बाद, मुझे लगता है कि आप सोच सकते हैं कि संपत्ति का नाम या चर नाम enum प्रकार नाम से अलग होना चाहिए ... यह नहीं है। निम्नलिखित पूरी तरह से ठीक है ...

  public enum Status { New, Edited, Approved, Cancelled, Closed }

  public class Order
  {
      private Status stat;
      public Status Status
      { 
         get { return stat; }
         set { stat = value; }
      }
  }

सच है, मुझे लगता है कि मेरी पद्धति एक 'त्वरित और आलसी' तरीका है, जो कि एनम का उपयोग करते समय नामों के बारे में सोचने से बचना चाहिए।
OKW

1
अपने जवाब के समर्थन में: MSDN पर, से प्रकार सदस्यों के नाम : खंड "गुण का नाम" में ✓ विचार अपने प्रकार के रूप में एक संपत्ति में एक ही नाम दे रही है। उदाहरण: public Color Color { get {...} set {...} }
18

10

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

public enum PersonTypesEnum {
    smart,
    sad,
    funny,
    angry
}


public class Person {   
    public PersonTypesEnum PersonType {get; set;}
}

कोई भी कभी भी भ्रमित नहीं करेगा कि एनम क्या है और इसका उदाहरण क्या है।


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

1
Microsoft के डिज़ाइन अपराधियों से: "एनम टाइप के नामों में" Enum "प्रत्यय का प्रयोग न करें।" docs.microsoft.com/en-us/dotnet/standard/design-guidelines/…
Thoryn Hawley

3
शायद आपने मेरे द्वारा कही गई बहुत पुरानी सजा को याद कर लिया? यहां, मैं इसे आपके लिए कॉपी और पेस्ट कर दूं: "यह उन कुछ जगहों में से एक है, जो मैं सम्मेलन के खिलाफ असहमत हूं, इसके खिलाफ जाने के लिए पर्याप्त है।" मैं फिर समझाता हूं कि क्यों।
हीथ

2
मैं "हर संभव तरीके से" दिशा निर्देशों के खिलाफ नहीं जा रहा हूँ। वह अतिशय है। मैं एक एकल, विशिष्ट तरीके से दिशानिर्देशों के खिलाफ जा रहा हूं, जो कि तर्क I द्वारा समर्थित है। यदि आप असहमत होना चाहते हैं, तो ठीक है, असहमत होने के अपने कारणों को सूचीबद्ध करें; आपका हाइपरबोले अनावश्यक है और आपकी स्थिति को आगे नहीं बढ़ाता है।
हीदर

1
यदि कोई नाम स्थान टकराव संभव है, तो मुझे कोई समस्या नहीं दिख रही है Enum? ऐसा नहीं है कि लेखक अपने प्रकार के साथ सभी संस्करणों को पोस्टफिक्सिंग का प्रस्ताव दे रहा है। लेखक के पास बहुत अधिक मजबूत मामला है जो एक कारण प्रदान किया गया है, जबकि एम $ शून्य औचित्य प्रदान करता है।
जय गोविंदानी

7

यदि आप सीधा लिखने की कोशिश कर रहे हैं, तो इस तरह से निषिद्ध कोड:

    public class Person
    {
        public enum Gender
        {
            Male,
            Female
        }
        //Won't compile: auto-property has same name as enum
        public Gender Gender { get; set; }  
    }

आपके विकल्प हैं:

  1. MS अनुशंसा को अनदेखा करें और enum नाम पर एक उपसर्ग या प्रत्यय का उपयोग करें:

    public class Person
    {
        public enum GenderEnum
        {
            Male,
            Female
        }
        public GenderEnum Gender { get; set; }
    }
  2. कक्षा के बाहर एनम परिभाषा को स्थानांतरित करें, अधिमानतः किसी अन्य कक्षा में। यहाँ ऊपर के लिए एक आसान समाधान है:

    public class Characteristics
    {
        public enum Gender
        {
            Male,
            Female
        }
    }
    public class Person
    {
        public Characteristics.Gender Gender { get; set; }  
    }

2
हाइपोथेटिकल स्थिति और एक अच्छा समाधान नहीं। enumपहली जगह में एक नेस्टेड का उपयोग क्यों करें और फिर इसे एक और वर्ग में घोंसला दें यदि यह परेशानी का कारण बनता है?
गर्ट अर्नोल्ड

1
जेंडर के मामले में, संपत्ति के नाम के रूप में Genderऔर enum नाम के रूप में इसका अधिक अर्थपूर्ण है Sex। तो isac.Gender = Sex.Male..
नवफाल

3
मुझे यकीन नहीं है कि इस आदमी को क्यों उखाड़ा जा रहा है। यह स्थिति वैध है और काल्पनिक से बहुत दूर है। एक घोंसला सी # में समान कारणों से टाइप करता है कि कोई जावा में एक आंतरिक वर्ग का उपयोग कर सकता है ... क्योंकि आंतरिक प्रकार का उपयोग केवल बाहरी और कहीं नहीं किया जाता है, और केवल बाहरी और अन्य जगहों के संदर्भ में समझ में आता है। और संकलक सीमाओं के परिणामस्वरूप, आपको वर्णित समाधानों में से एक को चुनना होगा।
नाथन पिटमैन

आपको इसे कहीं से, आमतौर पर कक्षा के बाहर, या शायद कक्षा का निर्माण करते समय सेट करना होगा, इस स्थिति में आपको बाहर परिभाषित करने की आवश्यकता होगी, जब तक कि आप व्यक्ति में नहीं भेजना चाहते। सिर्फ लोगों की तुलना में, मुझे लगता है कि यह घोंसला नहीं होना वैसे भी सबसे अच्छा समाधान है।
जिम वोल्फ

2
एक और, संभवतः बेहतर विकल्प "सर्ज - एपट्रांसलेटर" से जवाब है।
कर्टिस येलोप

6

सर्वोत्तम अभ्यास - एकवचन का उपयोग करें। आपके पास एक Enum बनाने वाली वस्तुओं की एक सूची है। जब आप कहते हैं तो सूची में किसी आइटम का उपयोग करना अजीब लगता है Versions.1_0। यह कहने में अधिक समझदारी है Version.1_0क्योंकि केवल 1_0 संस्करण है।


5

थोड़ी देर में आ रहा है ...

वहाँ अपने प्रश्न और एक के बीच एक महत्वपूर्ण अंतर है आप का उल्लेख (जो मैंने पूछा ;-):

आप एनम की परिभाषा को कक्षा से बाहर कर देते हैं, जो आपको एनम और संपत्ति के लिए एक ही नाम रखने की अनुमति देता है:

public enum EntityType { 
  Type1, Type2 
} 

public class SomeClass { 
  public EntityType EntityType {get; set;} // This is legal

}

इस मामले में, मैं एमएस दिशानिर्देशों का पालन करूंगा और एनम (झंडे के लिए बहुवचन) के लिए एक विलक्षण नाम का उपयोग करूंगा। यह सबसे आसान उपाय है।

मेरी समस्या ( दूसरे प्रश्न में ) है जब एनम को वर्ग के दायरे में परिभाषित किया गया है, जो एनम के ठीक बाद नाम वाली संपत्ति के उपयोग को रोकता है।


0

एनम और मिलान संपत्ति के लिए दूसरे सूत्र C # नामकरण सम्मेलन पर किसी ने कहा कि मुझे लगता है कि एक बहुत अच्छा विचार है:

"मुझे पता है कि मेरा सुझाव .NET नामकरण सम्मेलनों के खिलाफ जाता है, लेकिन मैं व्यक्तिगत रूप से 'ई' के साथ उपसर्ग करता हूं और 'एफ' के साथ एनम के झंडे लगाता हूं (इसी तरह हम 'आई' के साथ इंटरफैस करते हैं)।"

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