Соглашение об именовании Enum - множественное число - PullRequest
234 голосов
/ 10 сентября 2009

Я задаю этот вопрос, несмотря на то, что прочитал похожее, но не совсем то, что я хочу, в Соглашение об именовании C # для перечисления и соответствующего свойства

Я обнаружил, что имею тенденцию называть перечисления во множественном числе, а затем использовать их как единственное число, например:

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;}

}

Дополнительная информация: Может быть, мой вопрос не был достаточно ясен. Мне часто приходится задумываться над именами переменных моих определенных типов перечислений. Я знаю лучшую практику, но это не помогает облегчить мою работу по именованию этих переменных.

Я не могу выставить все свои свойства enum (скажем, «Status») как «MyStatus».

Мой вопрос: может ли кто-нибудь найти потенциальную проблему с моим соглашением, описанным выше? Это НЕ о наилучшей практике.

Перефразировать вопрос:

Ну, я думаю, мне следует задать вопрос следующим образом: может кто-нибудь изобрел хороший общий способ именования типа enum, такой, что при использовании имя enum 'instance' будет довольно простым?

Ответы [ 9 ]

300 голосов
/ 10 сентября 2009

Microsoft рекомендует использовать единственное число для Enum с, если Enum не представляет битовые поля (также используйте FlagsAttribute). См. Соглашения об именах типов перечисления (подмножество Указаний Microsoft по именованию ).

Чтобы ответить на ваши разъяснения, я не вижу ничего плохого ни в одном из следующих:

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; }
}
33 голосов
/ 10 сентября 2009

Я начал именовать перечисления во множественном числе, но с тех пор изменился на единственное число. Просто кажется, что это имеет больше смысла в контексте того, где они используются.

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

Сравнить с:

Statuses myStatus = Statuses.Ready;

Я считаю, что форма единственного числа звучит более естественно в контексте. Мы согласны с тем, что при объявлении enum, которое происходит в одном месте, мы думаем «это группа whatevers», но при использовании этого, предположительно во многих местах, мы думаем, что «это один из всех» .

23 голосов
/ 10 сентября 2009

Ситуация никогда не распространяется на множественное число.

enum показывает атрибут того или иного. Я приведу пример:

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

Вы можете иметь один тип, но попробуйте думать об этом во множественном, а не во множественном числе:

Humour.Irony | Humour.Sarcasm

Вместо

Humours { Irony, Sarcasm }

У вас есть чувство юмора, у вас нет чувства юмора.

12 голосов
/ 10 сентября 2009

В общем, рекомендация наилучшей практики является единственной, за исключением тех перечислений, к которым прикреплен атрибут [Flags] (и которые поэтому могут содержать битовые поля), которые должны быть во множественном числе.

После прочтения вашего отредактированного вопроса у меня возникает ощущение, что вы можете подумать, что имя свойства или имя переменной должно отличаться от имени типа enum ... Это не так. Следующее совершенно нормально ...

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

  public class Order
  {
      private Status stat;
      public Status Status
      { 
         get { return stat; }
         set { stat = value; }
      }
  }
10 голосов
/ 06 декабря 2017

Это одно из немногих мест, где я не согласен с соглашением настолько, чтобы пойти против него. Я ненавижу, что определение перечисления и его экземпляра могут иметь одно и то же имя. Я постфиксирую все свои Enums с помощью «Enum» специально, потому что он проясняет, каков его контекст в любом данном использовании. ИМО делает код более читабельным.

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


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

Никто никогда не будет путать, что такое enum и каков его экземпляр.

6 голосов
/ 10 сентября 2009

Лучшая практика - используйте единственное число. У вас есть список предметов, которые составляют Enum. Использование элемента в списке звучит странно, когда вы говорите Versions.1_0. Имеет смысл сказать Version.1_0, поскольку существует только одна версия 1_0.

4 голосов
/ 06 августа 2012

Если вы пытаетесь написать простой, но запрещенный код, подобный этому:

    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 и использовать префикс или суффикс в имени перечисления:

    public class Person
    {
        public enum GenderEnum
        {
            Male,
            Female
        }
        public GenderEnum Gender { get; set; }
    }
    
  2. Переместите определение enum за пределы класса, предпочтительно в другой класс. Вот простое решение выше:

    public class Characteristics
    {
        public enum Gender
        {
            Male,
            Female
        }
    }
    public class Person
    {
        public Characteristics.Gender Gender { get; set; }  
    }
    
4 голосов
/ 03 октября 2011

Опаздывает ...

Есть важное различие между вашим вопросом и тем, который вы упомянули (который я спросил; -):

Вы выводите определение enum из класса, что позволяет вам иметь одно и то же имя для enum и свойства:

public enum EntityType { 
  Type1, Type2 
} 

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

}

В этом случае я бы следовал указаниям MS и использовал бы единственное имя для enum (множественное число для флагов). Это, вероятно, самое простое решение.

Моя проблема (в другом вопросе ) заключается в том, что enum определен в области видимости класса, предотвращая использование свойства, названного точно после перечисления.

0 голосов
/ 15 апреля 2010

В другом потоке Соглашение об именах C # для enum и соответствующего свойства кто-то указал на то, что я считаю очень хорошей идеей:

«Я знаю, что мое предложение противоречит соглашениям об именах .NET, но я лично префикс enum с« E », а флаги enum с« F »(аналогично тому, как мы префиксируем интерфейсы с« I »)."

...