Convenção de Nomenclatura Enum - Plural

267

Estou fazendo esta pergunta, apesar de ter lido semelhante, mas não exatamente o que eu quero na convenção de nomenclatura C # para enum e propriedade correspondente

Descobri que tenho uma tendência a nomear enums no plural e depois 'usá-las' como singular, por exemplo:

public enum EntityTypes {
  Type1, Type2
}

public class SomeClass {
  /*
    some codes
  */

  public EntityTypes EntityType {get; set;}

}

Claro que funciona e esse é o meu estilo, mas alguém pode encontrar um problema em potencial com essa convenção? Eu tenho um nome "feio" com a palavra "Status":

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

public class SomeClass {
  /*
    some codes
  */

  public OrderStatuses OrderStatus {get; set;}

}

Informações adicionais: Talvez minha pergunta não tenha sido clara o suficiente. Muitas vezes tenho que pensar bastante ao nomear as variáveis ​​dos meus tipos de enumeração definidos. Conheço a melhor prática, mas não ajuda a facilitar meu trabalho de nomear essas variáveis.

Não é possível expor todas as minhas propriedades de enum (diga "Status") como "MyStatus".

Minha pergunta: alguém pode encontrar um problema em potencial com minha convenção descrita acima? NÃO é sobre as melhores práticas.

Pergunta reformulada:

Bem, acho que devo fazer a pergunta desta maneira: alguém pode apresentar uma boa maneira genérica de nomear o tipo de enum, de modo que, quando usada, a nomeação da 'instância' do enum seja bastante direta?

okw
fonte
5
enumeração pública OrderState ... - public OrderState OrderStatus {get; set;}
Fraser

Respostas:

333

A Microsoft recomenda o uso de singular para Enums, a menos que os Enumcampos de bits representem (use FlagsAttributetambém). Consulte Convenções de nomenclatura de tipos de enumeração (um subconjunto das Diretrizes de nomenclatura da Microsoft ).

Para responder ao seu esclarecimento, não vejo nada de errado com um dos seguintes:

public enum OrderStatus { Pending, Fulfilled, Error };

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

ou

public enum OrderStatus { Pending, Fulfilled, Error };

public class SomeClass {
    public OrderStatus Status { get; set; }
}
Jason
fonte
20
Sim, esta é uma resposta correta. Essas diretrizes são usadas no .Net Framework, por exemplo, enum DayOfWeek e flags enum RegexOptions.
Alexander Zwitbaum 10/09/09
1
Sim, esta é a prática recomendada. No entanto, isso não responde à minha pergunta.
okw 10/09/09
1
@okw para aprofundar, embora pareça feio, se você precisar de um único valor de uma flag enum, use a forma singular para o campo / propriedade / argumento. Se você o suporta com vários sinalizadores definidos, use o plural. Se sua enumeração não for uma enumeração de sinalizadores, use o singular para o nome do tipo e o campo / propriedade / argumentos.
Jonathan Dickinson
4
Aqui está o link para a versão .Net 4.0 do guia de convenções de nomenclatura da Microsoft vinculado na resposta.
1
@ Thomas Eu nunca tive um problema com isso, não vejo por que não funcionaria - não vejo um contexto em que seria ambíguo se é um tipo ou variável que está sendo referenciada. ou seja, OrderStatus == OrderStatus.Pendingé reconhecida como uma variável para a esquerda e, em seguida, uma enumeração à direita
James Hurley
39

Comecei nomeando enums no plural, mas depois mudei para singular. Apenas parece fazer mais sentido no contexto de onde eles são usados.

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

Comparado a:

Statuses myStatus = Statuses.Ready;

Acho que a forma singular soa mais natural no contexto. Estamos de acordo em que, ao declarar o enum, que acontece em um só lugar, estamos pensando "este é um grupo de coisas assim", mas ao usá-lo, presumivelmente em muitos lugares, que estamos pensando "este é um que seja" .

Bob Kaufman
fonte
6
Uma reação um pouco tardia (e talvez um pouco fora de tópico), mas: eu sugeriria o uso de valor 0para o valor desconhecido, dessa maneira uma variável não inicializada é por padrão Unknown.
SvenL
De acordo, @SvenL. Exemplo atualizado de acordo.
Bob Kaufman
Você realmente colocaria um [Flags]atributo no seu exemplo? Não faz sentido que algo tenha um status de "Incompleto" e "Pronto". Se você tivesse enum [Flags]Steps { First, Second, Third }, você realmente nomearia sua variável completedStep?
Pakman 01/02
26

A situação nunca se aplica realmente ao plural.

Um enummostra um atributo de algo ou de outro. Vou dar um exemplo:

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

Você pode ter um tipo, mas tente pensar no múltiplo, e não no plural:

Humour.Irony | Humour.Sarcasm

Ao invés de

Humours { Irony, Sarcasm }

Você tem senso de humor, não tem senso de humor.

Kyle Rosendo
fonte
5
Haha, bem, os programadores nem sempre são gramaticalmente / politicamente corretos. No seu caso, eu provavelmente uso "HumourTypes". Mau hábito, eu acho.
okw 10/09/09
E se eu quiser procurar todas as pessoas que têm um senso de sarcasmo OU ter um senso de ironia, eu não passaria na rotina de pesquisa uma instância que Humourscontenha Humours.Irony | Huomours.Sarcasm?
Charles Bretana
14

Em geral, a recomendação de melhores práticas é singular, exceto aquelas enumerações que possuem o atributo [Flags] anexado a elas (e que, portanto, podem conter campos de bits), que devem ser plurais.

Depois de ler sua pergunta editada, sinto que você pode pensar que o nome da propriedade ou o nome da variável deve ser diferente do nome do tipo de enumeração ... Não é. O seguinte está perfeitamente bem ...

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

  public class Order
  {
      private Status stat;
      public Status Status
      { 
         get { return stat; }
         set { stat = value; }
      }
  }
Charles Bretana
fonte
É verdade que acho que meu método é uma maneira "rápida e preguiçosa" de evitar a necessidade de pensar em nomes ao usar as enumerações.
okw 10/09/09
1
Para apoiar sua resposta: no MSDN, em Nomes de membros do tipo na seção "Nomes de propriedades": CONSIDERAR fornecer uma propriedade com o mesmo nome que seu tipo. Exemplo: public Color Color { get {...} set {...} }
DavidRR
10

Este é um dos poucos lugares em que discordo da convenção o suficiente para ir contra ela. TBH, ODEIO que a definição de uma enumeração e a instância dela possam ter o mesmo nome. Posfixo todos os meus Enums com "Enum" especificamente porque deixa claro qual é o contexto dele em um determinado uso. OMI torna o código muito mais legível.

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


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

Ninguém jamais confundirá qual é a enum e qual é a instância dela.

Urze
fonte
2
Eu vim aqui procurando uma convenção de nomeação de enum, depois de ter uma classe e enum com o mesmo nome - e queria ter "algo" para torná-lo mais óbvio. Eu estava pensando em prefixá-lo com "E" (para Enums, obviamente) como prefixamos interfaces com "I" - mas gostei da sua solução Heather! Agradável!!!
Scott
1
Nas diretrizes de design da Microsoft: "NÃO use o sufixo" Enum "nos nomes dos tipos de enum." docs.microsoft.com/en-us/dotnet/standard/design-guidelines/…
Thoryn Hawley
3
Talvez você tenha perdido a PRIMEIRA frase do que eu disse? Aqui, deixe-me copiar e colar para você: "Este é um dos poucos lugares que eu discordo da convenção o suficiente para ir contra ela". Depois, explico o porquê.
Heather
2
Não vou contra as orientações "de todas as formas possíveis". Isso é hipérbole. Vou contra as diretrizes de uma maneira única e específica, apoiada no raciocínio que afirmo. Se você quer discordar, tudo bem, liste seus motivos para discordar; sua hipérbole é desnecessária e não avança em sua posição.
Heather
1
Se for possível uma colisão de namespace, não vejo problema em adicionar Enum? Não é como se o autor estivesse propondo pós-fixar todos os vars com seu tipo. O autor também tem um argumento muito mais forte, uma vez que o motivo é fornecido, enquanto o M $ fornece justificação zero.
Jai Govindani
7

Se você está tentando escrever um código simples, mas proibido, como este:

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

Suas opções são:

  1. Ignore a recomendação da MS e use um prefixo ou sufixo no nome da enumeração:

    public class Person
    {
        public enum GenderEnum
        {
            Male,
            Female
        }
        public GenderEnum Gender { get; set; }
    }
  2. Mova a definição de enum para fora da classe, de preferência para outra classe. Aqui está uma solução fácil para o acima:

    public class Characteristics
    {
        public enum Gender
        {
            Male,
            Female
        }
    }
    public class Person
    {
        public Characteristics.Gender Gender { get; set; }  
    }
MiloNC
fonte
2
Situação hipotética e não uma boa solução. Por que usar um aninhado enumem primeiro lugar e aninhá-lo em outra classe, se isso causa problemas?
Gert Arnold
1
No caso de Gender, é muito mais significativo ter o nome da propriedade como Gendere o nome da enumeração como Sex. Então isac.Gender = Sex.Male..
nawfal
3
Não sei por que esse cara está sendo votado. Esta situação é legítima e está longe de ser hipotética. Um ninho enum digita em C # por razões semelhantes que se pode usar uma classe interna em Java ... porque o tipo interno é usado apenas no exterior e em nenhum outro lugar, e faz sentido apenas no contexto do exterior e não em outro lugar. E como resultado das limitações do compilador, você precisa escolher uma das soluções mencionadas.
19613 Nathan Pitman
Você precisará defini-lo de algum lugar, geralmente fora da classe, ou talvez ao construí-la, caso em que você precisa que a enum seja definida fora, a menos que queira enviar Person.Gender.Male, Gender poderia se aplicar a mais do que apenas pessoas, acho que não aninhar é a melhor solução de qualquer maneira.
Jim Wolff
2
Outra opção, possivelmente melhor, é a resposta de "Serge - appTranslator".
Curtis Yallop
6

Prática recomendada - use singular. Você tem uma lista de itens que compõem um Enum. Usar um item da lista parece estranho quando você diz Versions.1_0. Faz mais sentido dizer Version.1_0que existe apenas uma versão 1_0.

Jeremy Cron
fonte
5

Chegando um pouco tarde ...

Há uma diferença importante entre sua pergunta e a que você mencionou (que eu perguntei ;-):

Você coloca a definição de enum fora da classe, o que permite que você tenha o mesmo nome para o enum e a propriedade:

public enum EntityType { 
  Type1, Type2 
} 

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

}

Nesse caso, eu seguiria as diretrizes da MS e usaria um nome singular para o enum (plural para sinalizadores). É provavelmente a solução mais fácil.

Meu problema (na outra pergunta ) é quando o enum é definido no escopo da classe, impedindo o uso de uma propriedade nomeada exatamente após o enum.

Serge Wautier
fonte