Enum Naming Convention - Plural


267

Sto facendo questa domanda nonostante abbia letto simili ma non esattamente quello che voglio alla convenzione di denominazione C # per enum e corrispondenti proprietà

Ho scoperto che ho la tendenza a nominare gli enum al plurale e poi a "usarli" come esempio singolare:

public enum EntityTypes {
  Type1, Type2
}

public class SomeClass {
  /*
    some codes
  */

  public EntityTypes EntityType {get; set;}

}

Ovviamente funziona e questo è il mio stile, ma qualcuno può trovare un potenziale problema con tale convenzione? Ho una denominazione "brutta" con la parola "Stato" però:

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

public class SomeClass {
  /*
    some codes
  */

  public OrderStatuses OrderStatus {get; set;}

}

Informazioni aggiuntive: forse la mia domanda non era abbastanza chiara. Spesso devo pensare intensamente quando nomina le variabili dei miei tipi di enum definiti. Conosco le migliori pratiche, ma non aiuta a facilitare il mio lavoro nel nominare quelle variabili.

Non posso esporre tutte le mie proprietà enum (dire "Status") come "MyStatus".

La mia domanda: qualcuno può trovare un potenziale problema con la mia convenzione sopra descritta? NON si tratta di buone pratiche.

Riforma della domanda:

Bene, suppongo che dovrei porre la domanda in questo modo: qualcuno può escogitare un buon modo generico di nominare il tipo di enum in modo tale che, se usato, la denominazione dell'istanza di enum sarà piuttosto semplice?


5
public enum OrderState ... - public OrderState OrderStatus {get; set;}
Fraser

Risposte:


333

Microsoft consiglia di utilizzare singolare per Enums a meno che non Enumrappresenti i campi bit (utilizzare FlagsAttributeanche il). Vedere Convenzioni di denominazione dei tipi di enumerazione (un sottoinsieme delle Linee guida per la denominazione di Microsoft ).

Per rispondere al tuo chiarimento, non vedo nulla di sbagliato in nessuno dei seguenti casi:

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

20
Sì, questa è una risposta corretta. Queste linee guida sono utilizzate nel .Net Framework, ad esempio enum DayOfWeek e flag enum RegexOptions.
Alexander Zwitbaum,

1
Sì, questa è la pratica consigliata, la accolgo con favore. Tuttavia non risponde alla mia domanda.
Ok,

1
@okw per elaborare ulteriormente, anche se sembra brutto, se hai bisogno di un singolo valore da un enum di flag usa la forma singolare per il campo / proprietà / argomento. Se lo supporti con più flag impostati, usa il plurale. Se il tuo enum non è un enum di flag, usa il singolare per il nome del tipo e il campo / proprietà / argomenti.
Jonathan Dickinson,

4
Ecco il link alla versione .Net 4.0 della guida alle convenzioni di denominazione Microsoft collegata alla risposta.

1
@Thomas Non ho mai avuto problemi con esso, non riesco a capire perché non funzioni - non vedo un contesto in cui sarebbe ambiguo se si fa riferimento a un tipo o una variabile. vale a dire OrderStatus == OrderStatus.Pendingviene riconosciuta come variabile per la sinistra e quindi un elenco a destra
James Hurley

39

Ho iniziato a nominare enum al plurale ma da allora sono diventato singolare. Sembra avere più senso nel contesto in cui vengono utilizzati.

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

Confrontare con:

Statuses myStatus = Statuses.Ready;

Trovo che la forma singolare suoni più naturale nel contesto. Siamo d'accordo sul fatto che quando dichiariamo l'enum, che accade in un posto, stiamo pensando "questo è un gruppo di whatevers", ma quando lo usiamo, presumibilmente in molti posti, che stiamo pensando "questo è uno qualunque" .


6
Una piccola reazione tardiva (e forse un po 'fuori tema) ma: suggerirei di usare il valore 0per il valore sconosciuto, in questo modo una variabile non inizializzata è di default Unknown.
SvenL

D'accordo, @SvenL. Esempio aggiornato di conseguenza.
Bob Kaufman,

Porresti davvero un [Flags]attributo sul tuo esempio? Non ha senso che qualcosa abbia uno stato sia "Incompleto" che "Pronto". Se lo avessi enum [Flags]Steps { First, Second, Third }, chiameresti davvero la tua variabile completedStep?
Pakman,

26

La situazione non si applica mai realmente al plurale.

An enummostra un attributo di qualcosa o un altro. Faccio un esempio:

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

Puoi avere un tipo, ma prova a pensarlo nel multiplo, piuttosto che nel plurale:

Humour.Irony | Humour.Sarcasm

Piuttosto che

Humours { Irony, Sarcasm }

Hai un senso dell'umorismo, non hai un senso dell'umorismo.


5
Haha, beh, i programmatori non sono sempre grammaticalmente / politicamente corretti. Nel tuo caso, probabilmente uso "HumourTypes". Cattiva abitudine immagino.
Ok,

E se volessi cercare tutti gli individui che hanno un Senso di Sarcasmo O hanno un senso di ironia, non passerei alla routine di ricerca un'istanza di Humourscontenimento Humours.Irony | Huomours.Sarcasm??
Charles Bretana,

14

In generale, la raccomandazione delle migliori pratiche è singolare, ad eccezione di quegli enum che hanno l'attributo [Flags] allegato (e che quindi possono contenere campi di bit), che dovrebbero essere al plurale.

Dopo aver letto la tua domanda modificata, ho la sensazione che potresti pensare che il nome della proprietà o il nome della variabile debbano essere diversi dal nome del tipo di enum ... No. Quanto segue è perfettamente bene ...

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

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

È vero, immagino che il mio metodo sia un modo "rapido e pigro" per evitare la necessità di pensare ai nomi quando si usano gli enumeratori.
Ok,

1
A supporto della tua risposta: su MSDN, da Nomi dei membri del tipo nella sezione "Nomi delle proprietà": ✓ CONSIDERARE che una proprietà abbia lo stesso nome del suo tipo. Esempio: public Color Color { get {...} set {...} }
DavidRR

10

Questo è uno dei pochi posti in cui non sono abbastanza d'accordo con la convenzione per andare contro di essa. TBH, ODIO il fatto che la definizione di un enum e l'istanza di esso possano avere lo stesso nome. Postfisso tutti i miei Enum con "Enum" in particolare perché chiarisce qual è il contesto di esso in ogni dato utilizzo. IMO rende il codice molto più leggibile.

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


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

Nessuno confonderà mai qual è l'enum e qual è l'istanza di esso.


2
Sono venuto qui in cerca di una convenzione di denominazione di enum, dopo aver avuto una classe e un enum con lo stesso nome - e volevo avere "qualcosa" per renderlo più ovvio. Stavo pensando di prefissarlo con "E" (ovviamente per Enums) come prefissiamo le interfacce con "I" - ma mi è piaciuta la tua soluzione Heather! Ben fatto!!!
Scott,

1
Dalle linee guida di progettazione di Microsoft: "NON utilizzare un suffisso" Enum "nei nomi dei tipi di enum." docs.microsoft.com/en-us/dotnet/standard/design-guidelines/…
Thoryn Hawley

3
Forse ti sei perso la PRIMA frase di quello che ho detto? Qui, lascia che ti copi e lo incolli per te: "Questo è uno dei pochi posti in cui non sono abbastanza d'accordo con la convenzione per andare contro di essa". Poi continuo a spiegare perché.
Heather,

2
Non vado contro le linee guida "in ogni modo possibile". Questa è iperbole. Sto andando contro le linee guida in un unico modo specifico, che è supportato dal ragionamento che dichiaro. Se vuoi essere in disaccordo, bene, elenca le tue ragioni per dissentire; la tua iperbole non è necessaria e non fa avanzare la tua posizione.
Heather,

1
Se è possibile una collisione dello spazio dei nomi, non vedo alcun problema con l'aggiunta Enum? Non è come se l'autore proponesse di postfissare tutti i vari tipi con il loro tipo. L'autore ha anche un caso molto più forte dato che viene fornita una ragione, mentre M $ fornisce giustificazione zero.
Jai Govindani,

7

Se stai cercando di scrivere un codice semplice, ma proibito come questo:

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

Le tue opzioni sono:

  1. Ignora la raccomandazione MS e usa un prefisso o suffisso sul nome dell'enum:

    public class Person
    {
        public enum GenderEnum
        {
            Male,
            Female
        }
        public GenderEnum Gender { get; set; }
    }
  2. Spostare la definizione enum all'esterno della classe, preferibilmente in un'altra classe. Ecco una soluzione semplice a quanto sopra:

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

2
Situazione ipotetica e non una buona soluzione. Perché utilizzare un nidificato enumin primo luogo e quindi nidificarlo in un'altra classe se ciò causa problemi?
Gert Arnold,

1
Nel caso del genere, è molto più significativo avere il nome della proprietà come Gendere il nome enum come Sex. Quindi isac.Gender = Sex.Male...
nawfal,

3
Non sono sicuro del motivo per cui questo ragazzo viene sottoposto a downgrade. Questa situazione è legittima ed è tutt'altro che ipotetica. Uno nidifica i tipi enum in C # per ragioni simili che si potrebbe usare una classe interna in Java ... perché il tipo interno è usato solo nell'esterno e in nessun altro posto, e ha senso solo nel contesto dell'esterno e non altrove. E a causa delle limitazioni del compilatore, devi scegliere una delle soluzioni menzionate.
Nathan Pitman,

Dovrai impostarlo da qualche parte, di solito al di fuori della classe, o forse durante la costruzione della classe, nel qual caso hai bisogno che l'enum sia definito all'esterno, a meno che tu non voglia inviare Person.Gender.Male, Gender potrebbe applicare a più non solo le persone, penso che non averlo nidificato sia comunque la soluzione migliore.
Jim Wolff,

2
Un'altra opzione, forse migliore, è la risposta di "Serge - appTranslator".
Curtis Yallop,

6

Best practice: utilizzare singolare. Hai un elenco di elementi che compongono un Enum. L'uso di un elemento nell'elenco suona strano quando dici Versions.1_0. Ha più senso dire che Version.1_0esiste solo una versione 1_0.


5

In arrivo un po 'in ritardo ...

C'è una differenza importante tra la tua domanda e quella che menzioni (che ho chiesto ;-):

Metti la definizione di enum fuori dalla classe, che ti permette di avere lo stesso nome per l'enum e la proprietà:

public enum EntityType { 
  Type1, Type2 
} 

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

}

In questo caso, seguirei le linee guida MS e userò un nome singolare per l'enum (plurale per le bandiere). Probaby è la soluzione più semplice.

Il mio problema ( nell'altra domanda ) è quando l'enum è definito nell'ambito della classe, impedendo l'uso di una proprietà chiamata esattamente dopo l'enum.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.