Enum Naming Convention - Plural

267

Estoy haciendo esta pregunta a pesar de haber leído algo similar pero no exactamente lo que quiero en la convención de nomenclatura de C # para la enumeración y la propiedad coincidente

Descubrí que tengo tendencia a nombrar enumeraciones en plural y luego 'usarlas' como singular, por ejemplo:

public enum EntityTypes {
  Type1, Type2
}

public class SomeClass {
  /*
    some codes
  */

  public EntityTypes EntityType {get; set;}

}

Por supuesto que funciona y este es mi estilo, pero ¿alguien puede encontrar un problema potencial con tal convención? Sin embargo, tengo un nombre "feo" con la palabra "Estado":

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 fue lo suficientemente clara. A menudo tengo que pensar mucho al nombrar las variables de mis tipos de enumeración definidos. Sé la mejor práctica, pero no ayuda a facilitar mi trabajo de nombrar esas variables.

No puedo exponer todas mis propiedades de enumeración (por ejemplo, "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.

Frase de pregunta:

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

OK W
fuente
55
public enum OrderState ... - public OrderState OrderStatus {get; set;}
Fraser

Respuestas:

333

Microsoft recomienda usar singular para Enums a menos que Enumrepresente campos de bits (use FlagsAttributetambién). Consulte Convenios de denominación de tipo de enumeración (un subconjunto de las Directrices de denominación de Microsoft ).

Para responder a su aclaración, no veo nada de malo en lo siguiente:

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; }
}
jason
fuente
20
Sí, esta es una respuesta correcta. Estas pautas se utilizan en .Net Framework, por ejemplo, enum DayOfWeek y flags enum RegexOptions.
Alexander Zwitbaum
1
Sí, esta es la práctica recomendada, lo agradezco. Sin embargo, no responde mi pregunta.
okw
1
@okw para más detalles, aunque parece feo, si necesita un solo valor de una enumeración de bandera, use la forma singular para el campo / propiedad / argumento. Si admite que tenga varios indicadores establecidos, use el plural. Si su enumeración no es una enumeración de marcas, use el singular para el nombre del tipo y el campo / propiedad / argumentos.
Jonathan Dickinson el
44
Aquí está el enlace a la versión .Net 4.0 de la guía de convenciones de nomenclatura de Microsoft enlazada en la respuesta.
1
@Thomas Nunca he tenido un problema con él, no puedo ver por qué no funcionaría; no veo un contexto en el que sería ambiguo si se hace referencia a un tipo o variable. OrderStatus == OrderStatus.Pendinges decir, se reconoce como una variable para la izquierda y luego una enumeración a la derecha
James Hurley
39

Comencé nombrando enumeraciones en plural pero desde entonces he cambiado a singular. Simplemente parece tener más sentido en el contexto de dónde se usan.

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

Comparar con:

Statuses myStatus = Statuses.Ready;

Encuentro que la forma singular suena más natural en contexto. Estamos de acuerdo en que al declarar la enumeración, que ocurre en un lugar, estamos pensando "este es un grupo de lo que sea", pero cuando lo usamos, presumiblemente en muchos lugares, estamos pensando "este es uno cualquiera" .

Bob Kaufman
fuente
66
Una pequeña reacción tardía (y tal vez un poco fuera de tema) pero: sugeriría usar el valor 0para el valor desconocido, de esa manera una variable no inicializada es por defecto Unknown.
SvenL
De acuerdo, @SvenL. Ejemplo actualizado en consecuencia.
Bob Kaufman
Sin [Flags]embargo, ¿realmente pondrías un atributo en tu ejemplo? No tiene sentido que algo tenga un estado de "Incompleto" y "Listo". Si lo hubiera hecho enum [Flags]Steps { First, Second, Third }, ¿realmente nombraría su variable completedStep?
Pakman
26

La situación nunca se aplica realmente al plural.

Un enummuestra un atributo de algo u otro. Daré un ejemplo:

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

Puede tener un tipo, pero trate de pensarlo en múltiples, en lugar de en plural:

Humour.Irony | Humour.Sarcasm

Más bien que

Humours { Irony, Sarcasm }

Tienes sentido del humor, no tienes sentido del humor.

Kyle Rosendo
fuente
55
Jaja, bueno, los programadores no siempre son gramatical / políticamente correctos. En su caso, probablemente use "HumourTypes". Mal hábito, supongo.
okw
¿Qué pasa si quiero buscar a todas las personas que tienen un sentido de sarcasmo o tienen un sentido de ironía, no pasaría la rutina de búsqueda una instancia de Humourscontener Humours.Irony | Huomours.Sarcasm?
Charles Bretana
14

En general, la recomendación de mejores prácticas es singular, a excepción de las enumeraciones que tienen el atributo [Flags] asociado (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 tiene que ser diferente del nombre del tipo de enumeración ... No lo hace. Lo siguiente está 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; }
      }
  }
Charles Bretana
fuente
Es cierto, supongo que mi método es una forma 'rápida y perezosa' de evitar la necesidad de pensar en nombres al usar las enumeraciones.
okw
1
Para respaldar su respuesta: en MSDN, desde Nombres de miembros de tipo en la sección "Nombres de propiedades": ✓ CONSIDERE dar a una propiedad el mismo nombre que su tipo. Ejemplo: public Color Color { get {...} set {...} }
DavidRR
10

Este es uno de los pocos lugares en los que no estoy de acuerdo con la convención lo suficiente como 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. Pongo todas mis Enums con "Enum" específicamente porque deja en claro cuál es el contexto en un uso determinado. En mi opinión, 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.

Brezo
fuente
2
Vine aquí buscando una convención de nomenclatura de enumeración, después de tener una clase y enumeración con el mismo nombre, y quería tener "algo" para hacerlo más obvio. Estaba pensando prefijarlo con "E" (para Enums obviamente) como prefijamos las interfaces con "I", ¡pero me gustó su solución Heather! ¡¡¡Buena esa!!!
Scott
1
De las líneas de diseño de Microsoft: "NO use un sufijo" Enum "en los nombres de tipo enum". docs.microsoft.com/en-us/dotnet/standard/design-guidelines/…
Thoryn Hawley
3
¿Quizás te perdiste la PRIMERA frase de lo que dije? Aquí, déjame copiarlo y pegarlo para ti: "Este es uno de los pocos lugares en los que no estoy de acuerdo con la convención lo suficiente como para ir en contra de ella". Luego paso a explicar por qué.
Heather
2
No voy en contra de las pautas "en todas las formas posibles". Eso es una hipérbole. Voy en contra de las pautas de una manera única y específica, respaldada por el razonamiento que afirmo. Si quieres estar en desacuerdo, bien, enumera tus razones para estar en desacuerdo; su hipérbole es innecesaria y no avanza su posición.
Heather
1
Si existe una posible colisión en el espacio de nombres, ¿no veo ningún problema al agregar Enum? No es como si el autor estuviera proponiendo postfixing todos los vars con su tipo. El autor también tiene un caso mucho más fuerte dado que se proporciona una razón, mientras que M $ proporciona una justificación cero.
Jai Govindani
7

Si está intentando escribir un código sencillo pero prohibido 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; }  
    }

Sus opciones son:

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

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

    public class Characteristics
    {
        public enum Gender
        {
            Male,
            Female
        }
    }
    public class Person
    {
        public Characteristics.Gender Gender { get; set; }  
    }
    
MiloNC
fuente
2
Situación hipotética y no es una buena solución. ¿Por qué usar un anidado enumen primer lugar y luego anidarlo en otra clase si esto causa problemas?
Gert Arnold
1
En el caso de Gender, es mucho más significativo tener el nombre de propiedad como Gendery el nombre de enumeración como Sex. Entonces isac.Gender = Sex.Male..
nawfal
3
No estoy seguro de por qué este tipo está siendo rechazado. Esta situación es legítima y está lejos de ser hipotética. Uno anida los tipos de enumeración en C # por razones similares por las que uno podría usar una clase interna en Java ... porque el tipo interno se usa solo en el exterior y en ningún otro lugar, y tiene sentido solo en el contexto del exterior y no en otro lugar. Y como resultado de las limitaciones del compilador, debe elegir una de las soluciones mencionadas.
Nathan Pitman
Tendrá que configurarlo desde algún lugar, generalmente fuera de la clase, o tal vez al construir la clase, en cuyo caso necesita que la enumeración se defina afuera, a menos que desee enviar Person.Gender.Male, Gender podría aplicarse a más que solo personas, creo que no tenerlo anidado es la mejor solución de todos modos.
Jim Wolff
2
Otra opción, posiblemente mejor, es la respuesta de "Serge - appTranslator".
Curtis Yallop
6

Mejor práctica: use singular. Tienes una lista de elementos que componen una enumeración. Usar un elemento en la lista suena extraño cuando dices Versions.1_0. Tiene más sentido decirlo Version.1_0ya que solo hay una versión 1_0.

Jeremy Cron
fuente
5

Llegando un poco tarde ...

Hay una diferencia importante entre su pregunta y la que menciona (que pregunté ;-):

Pones la definición de enumeración fuera de la clase, lo que te 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, seguiría las guías de MS y usaría un nombre singular para la enumeración (plural para banderas). Es probablemente la solución más fácil.

Mi problema (en la otra pregunta ) es cuando la enumeración se define en el alcance de la clase, evitando el uso de una propiedad nombrada exactamente después de la enumeración.

Serge Wautier
fuente