2009-09-10 23 views
186

que estoy haciendo esta pregunta pesar de haber leído similar pero no exactamente lo que quiero en C# naming convention for enum and matching propertyEnum convención de nomenclatura - Plural

descubrí que tengo una tendencia a nombrar las enumeraciones en plural y luego 'uso' como singular, ejemplo:

public enum EntityTypes { 
    Type1, Type2 
} 

public class SomeClass { 
    /* 
    some codes 
    */ 

    public EntityTypes EntityType {get; set;} 

} 

Por supuesto funciona y esta es mi estilo, pero ¿alguien puede encontrar un posible problema con estos convenios? Tengo un "feo" nombrar con la palabra "Estado" sin embargo:

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

public class SomeClass { 
    /* 
    some codes 
    */ 

    public OrderStatuses OrderStatus {get; set;} 

} 

Información adicional: Tal vez mi pregunta no era lo suficientemente claro. A menudo tengo que pensar mucho al nombrar las variables de mis tipos de enum definidos. Conozco la mejor práctica, pero no ayuda a facilitar mi trabajo de nombrar esas variables.

No puedo exponer todas mis propiedades enumeradas (digamos "Estado") como "MyStatus".

Mi pregunta: ¿Alguien puede encontrar un problema potencial con mi convención descrita anteriormente? NO se trata de las mejores prácticas.

Pregunta rephrase:

Bueno, supongo que debería hacer la pregunta de esta manera: ¿Alguien puede salir una buena forma genérica de nombrar el tipo de enumeración de tal manera que cuando se usa, la denominación de la enumeración ' instancia 'será bastante sencillo?

+4

public enum OrderState ... - public OrderState OrderStatus {get; establecer;} – Fraser

Respuesta

241

Microsoft recomienda el uso singular de Enum s menos que la Enum representa los campos de bits (utilizar el FlagsAttribute también). Vea Enumeration Type Naming Conventions (un subconjunto de Naming Guidelines de Microsoft).

para responder a su aclaración, no veo nada de malo en cualquiera de los siguientes:

public enum OrderStatus { Pending, Fulfilled, Error }; 

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

o

public enum OrderStatus { Pending, Fulfilled, Error }; 

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

Sí, esta es una respuesta correcta. Estas pautas se usan en .Net Framework, p. enum DayOfWeek y flags enum RegexOptions. –

+1

Sí, esta es la práctica recomendada, la recibo con agrado. Sin embargo, no responde mi pregunta. –

+1

@ o.k.w para seguir elaborando, aunque parece feo, si necesita un valor único de una enumeración de indicador, utilice la forma singular para el campo/propiedad/argumento. Si admite que tiene varias banderas establecidas, use el plural. Si su enumeración no es una enumeración de banderas, utilice el singular para el nombre del tipo y el campo/propiedad/argumentos. –

10

En general, la recomendación de mejores prácticas es singular, excepto aquellas enumeraciones que tienen el atributo [Flags] asociado a ellas (y que, por lo tanto, pueden contener campos de bits), que deben ser plurales.

Después de leer su pregunta editada, tengo la sensación de que puede pensar que el nombre de la propiedad o el nombre de la variable debe ser diferente del nombre del tipo de enumeración ... No es así. El siguiente es perfectamente bien ...

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

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

Es cierto, creo que mi método es una forma "rápida y perezosa" de evitar la necesidad de pensar en los nombres cuando se utilizan las enumeraciones. –

+1

En apoyo de su respuesta: en MSDN, desde [Nombre de los miembros de tipo] (https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-type-members) en el sección "Nombres de propiedades": ** ✓ CONSIDER ** dando a una propiedad el mismo nombre que su tipo. ** Ejemplo: ** 'public Color Color {get {...} set {...}}' – DavidRR

28

Empecé nombrar enumeraciones, en plural, pero desde entonces han cambiado a singular. Parece que tiene más sentido en el contexto de dónde se usan.

enum Status { Unknown = 0, Incomplete, Ready } 

Status myStatus = Status.Ready; 

Compare con:

Statuses myStatus = Statuses.Ready; 

puedo encontrar la forma singular para que suene más natural en su contexto. Estamos de acuerdo en que al declarar la enumeración, que ocurre en un lugar, pensamos "este es un grupo de elementos", pero al usarlo, presumiblemente en muchos lugares, estamos pensando "esto es lo que sea" .

+5

Un poco de reacción tardía (y tal vez un poco fuera de tema) pero: sugeriría usar el valor '0' para el valor desconocido, de esa manera una variable no inicializada es por defecto 'Desconocido'. – SvenL

+0

De acuerdo, @SvenL. Ejemplo actualizado en consecuencia. –

+0

¿Realmente pondrías un atributo '[Flags]' en tu ejemplo? No tiene sentido que algo tenga un estado de "Incompleto" y "Listo". Si tuvieras 'enum [Flags] Steps {First, Second, Third}', ¿realmente nombrarías tu variable 'completedStep'? – Pakman

6

Mejores prácticas - utilizar singular. Usted tiene una lista de elementos que conforman un Enum. Usar un elemento en la lista suena extraño cuando dices Versions.1_0. Tiene más sentido decir Version.1_0 ya que solo hay una versión 1_0.

20

La situación nunca se aplica realmente al plural.

Un enum muestra un atributo de algo u otro. Voy a dar un ejemplo:

enum Humour 
{ 
    Irony, 
    Sarcasm, 
    Slapstick, 
    Nothing 
} 

Usted puede tener un tipo, pero trata de pensar en ella de lo múltiple, en lugar de en plural:

Humour.Irony | Humour.Sarcasm

En lugar de

Humours { Irony, Sarcasm }

Tiene sentido del humor, no tiene sentido de los humores.

+1

Jaja, bueno, los programadores no siempre son gramatical/políticamente correctos. En tu caso, es probable que use "HumourTypes". Mal hábito, supongo. –

+4

Sí, me encanta el humor británico. – Epaga

+0

¿Qué pasa si quiero buscar a todas las personas que tienen un Sentido de Sarcasmo O tienen un sentido de la ironía, no pasaría la rutina de búsqueda una instancia de 'Humours' que contenga' Humours.Irony | Huomours.Sarcasm' ?? –

0

Por otro hilo C# naming convention for enum and matching property alguien señaló lo que creo que es una muy buena idea:

"Sé que mi sugerencia va en contra de las convenciones de nomenclatura de .NET, pero yo personalmente enumeraciones prefijo con 'E' y banderas de enumeración con 'F' (similar a cómo prefijamos las interfaces con 'I'). "

4

Viniendo en un poco tarde ...

Hay una diferencia importante entre la pregunta y la you mention (que pedí ;-):

se pone la definición de enumeración de la clase, la cual le permite tener el mismo nombre para la enumeración y la propiedad:

public enum EntityType { 
    Type1, Type2 
} 

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

} 

En este caso, me gustaría seguir los guidelins MS y utilizar un nombre singular para la enumeración (plural de las banderas). Probablemente es la solución más fácil.

Mi problema (en el other question) es cuando la enumeración se define en el alcance de la clase, impidiendo el uso de una propiedad llamada exactamente después de la enumeración.

3

Si usted está tratando de escribir sencillo código, sin embargo prohibida la siguiente manera:

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

Sus opciones son:

  1. Ignorar la recomendación MS y el uso de un prefijo o sufijo en el nombre de enumeración :

    public class Person 
    { 
        public enum GenderEnum 
        { 
         Male, 
         Female 
        } 
        public GenderEnum Gender { get; set; } 
    } 
    
  2. Mueva la definición de enum fuera de la clase, preferiblemente en otra clase. Aquí es una solución fácil de lo anterior:

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

Situación hipotética y no es una buena solución. ¿Por qué utilizar un 'enum' anidado en primer lugar y luego anidarlo en otra clase si esto causa problemas? –

+1

En el caso de Género, es mucho más significativo tener el nombre de la propiedad como 'Género' y el nombre enum como 'Sexo'. Así 'isac.Gender = Sex.Male' .. – nawfal

+2

No estoy seguro de por qué este tipo está siendo votado negativamente. Esta situación es legítima y está lejos de ser hipotética. Uno anida tipos enum en C# por razones similares que uno podría usar una clase interna en Java ... porque el tipo interno se usa solo en el exterior y en ninguna otra parte, y tiene sentido solo en el contexto de lo externo y no en otro lugar. Y como resultado de las limitaciones del compilador, debe elegir una de las soluciones mencionadas. –

2

Este es uno de los pocos lugares que no estoy de acuerdo con la convención suficiente para ir en contra de ella. TBH, ODIO que la definición de una enumeración y la instancia de la misma puedan tener el mismo nombre.Postfijo todos mis Enumerados con "Enum" específicamente porque deja en claro cuál es el contexto en un uso dado. IMO hace que el código sea mucho más legible.

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


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

Nadie confundirá nunca qué es la enumeración y cuál es la instancia de la misma.

Cuestiones relacionadas