Соглашение об именовании Enum - множественное число

267

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

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

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

}

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

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

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

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

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

ОКВ
источник
5
публичное перечисление OrderState ... - публичное OrderState OrderStatus {get; set;}
Фрейзер

Ответы:

333

Microsoft рекомендует использовать единственное число для Enums, если они не 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; }
}
Ясон
источник
20
Да, это правильный ответ. Эти указания используются в .Net Framework, например enum DayOfWeek и flags enum RegexOptions.
Александр Звитбаум
1
Да, это рекомендуемая практика, я приветствую это. Однако это не отвечает на мой вопрос.
О
1
@okw для дальнейшей проработки, хотя это выглядит некрасиво, если вам нужно одно значение из перечисления флага, используйте форму единственного числа для поля / свойства / аргумента. Если вы поддерживаете его с несколькими установленными флагами, используйте множественное число. Если ваше перечисление не является перечислением flags, используйте единственное число для имени типа и поля / свойства / arguments.
Джонатан Дикинсон
4
Вот ссылка на .Net 4.0 версию руководства по соглашениям об именах Microsoft, на которую есть ссылка в ответе.
1
@ Томас У меня никогда не было проблем с этим, я не понимаю, почему это не сработает - не вижу контекста, в котором было бы неоднозначно, независимо от того, ссылаются ли на него тип или переменная. то OrderStatus == OrderStatus.Pendingесть распознается как переменная слева, а затем перечисление справа
Джеймс Херли
39

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

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

Сравнить с:

Statuses myStatus = Statuses.Ready;

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

Боб Кауфман
источник
6
Немного поздняя реакция (и, возможно, немного не по теме), но: я бы предложил использовать значение 0для неизвестного значения, таким образом, неинициализированная переменная по умолчанию Unknown.
SvenL
Согласен, @SvenL. Обновил пример соответственно.
Боб Кауфман
Вы бы действительно добавили [Flags]атрибут к своему примеру? Не имеет смысла иметь статус «Неполный» и «Готов». Если бы вы имели enum [Flags]Steps { First, Second, Third }, вы бы действительно назвали свою переменную completedStep?
Пакман
26

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

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

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

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

Humour.Irony | Humour.Sarcasm

Скорее, чем

Humours { Irony, Sarcasm }

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

Кайл Розендо
источник
5
Хаха, ну, программисты не всегда грамматически / политически корректны. В вашем случае я, вероятно, использую «HumourTypes». Дурная привычка, наверное.
О
Что если я захочу найти всех людей, у которых есть чувство сарказма, ИЛИ с чувством иронии, я бы не пропустил процедуру поиска, Humoursсодержащую Humours.Irony | Huomours.Sarcasm??
Чарльз Бретана
14

В общем, рекомендация передовой практики является единственной, за исключением тех перечислений, к которым прикреплен атрибут [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; }
      }
  }
Чарльз Бретана
источник
Правда, я предполагаю, что мой метод - это «быстрый и ленивый» способ избежать необходимости думать об именах при использовании перечислений.
О
1
В поддержку вашего ответа: в MSDN из Имена членов типа в разделе «Имена свойств»: ✓ УЧИТЕСЬ, присваивая свойству то же имя, что и его типу. Пример: public Color Color { get {...} set {...} }
DavidRR
10

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

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


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

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

вереск
источник
2
Я пришел сюда в поисках соглашения по именованию enum, после того как класс и enum были названы одинаково - и хотел иметь «что-то», чтобы сделать его более очевидным. Я думал о том, чтобы поставить префикс «E» (очевидно, для Enums), как мы префиксировали интерфейсы «I», но мне понравилось ваше решение, Хезер! Хороший!!!
Скотт
1
Из руководящих принципов разработки Microsoft: «НЕ используйте суффикс« Enum »в именах типов enum». docs.microsoft.com/en-us/dotnet/standard/design-guidelines/…
Торин Хоули
3
Возможно, вы пропустили ОЧЕНЬ ПЕРВОЕ предложение того, что я сказал? Вот, позвольте мне скопировать и вставить это для вас: «Это одно из немногих мест, где я не согласен с соглашением настолько, чтобы идти против него». Затем я продолжаю объяснять, почему.
Хизер
2
Я не иду против принципов "всеми возможными способами". Это гипербола. Я иду вразрез с руководящими принципами одним конкретным образом, что подтверждается обоснованием, которое я заявляю. Если вы хотите не согласиться, хорошо, перечислите причины своего несогласия; ваша гипербола не нужна и не продвигает вашу позицию.
Хизер,
1
Если возможно столкновение пространства имен, я не вижу проблем с добавлением Enum? Это не так, как будто автор предлагает постфиксировать все переменные с их типом. Автор также имеет гораздо более сильный случай, учитывая, что причина указана, тогда как M $ дает нулевое обоснование.
Джай Говиндани
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 и используйте префикс или суффикс в имени перечисления:

    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; }  
    }
MiloNC
источник
2
Гипотетическая ситуация и не хорошее решение. Зачем сначала использовать вложенные, enumа затем вкладывать их в еще один класс, если это вызывает проблемы?
Герт Арнольд
1
В случае Gender гораздо важнее иметь имя свойства as Genderи enum name как Sex. Итак isac.Gender = Sex.Male..
Nawfal
3
Я не уверен, почему этого парня осуждают. Эта ситуация является законной и далеко не гипотетической. Один вкладывает перечислимые типы в C # по тем же причинам, по которым можно использовать внутренний класс в Java ... потому что внутренний тип используется только во внешнем и нигде больше, и имеет смысл только в контексте внешнего, а не в другом месте. И из-за ограничений компилятора вы должны выбрать одно из упомянутых решений.
Натан Питман
Вам нужно будет установить его откуда-то, обычно вне класса или, возможно, при создании класса, и в этом случае вам нужно определить enum снаружи, если только вы не хотите отправить в Person.Gender.Male, Gender может применяться к другим чем просто люди, я думаю, что отсутствие вложенности - это лучшее решение.
Джим Вольф,
2
Другим, возможно, лучшим вариантом является ответ от «Serge - appTranslator».
Кертис Яллоп
6

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

Джереми Крон
источник
5

Приходит немного поздно ...

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

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

public enum EntityType { 
  Type1, Type2 
} 

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

}

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

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

Серж Вотье
источник
0

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

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

RenniePet
источник