2009-09-10 11 views
186

sto facendo questa domanda, nonostante avendo letto simili ma non esattamente quello che voglio a C# naming convention for enum and matching propertyEnum Naming Convention - Plurale

ho scoperto che ho la tendenza a nominare enumerazioni al plurale e poi 'uso' loro come singolare, esempio:

public enum EntityTypes { 
    Type1, Type2 
} 

public class SomeClass { 
    /* 
    some codes 
    */ 

    public EntityTypes EntityType {get; set;} 

} 

Naturalmente funziona e questo è il mio stile, ma chiunque può trovare potenziale problema con tale convenzione? Io ho un "brutto" denominazione con la parola "Stato", anche se:

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

public class SomeClass { 
    /* 
    some codes 
    */ 

    public OrderStatuses OrderStatus {get; set;} 

} 

Informazione supplementare: Forse la mia domanda non era abbastanza chiaro. Spesso devo pensare seriamente quando si nominano le variabili dei miei tipi enum definiti. Conosco le migliori pratiche, ma non aiuta a facilitare il mio compito di nominare quelle variabili.

Non posso esporre tutte le mie proprietà enum (ad esempio "Stato") come "MyStatus".

La mia domanda: Qualcuno può trovare potenziali problemi con la mia convenzione sopra descritta? Non si tratta delle migliori pratiche.

Domanda riformulare:

Beh, credo che dovrei porre la domanda in questo modo: Qualcuno può venire fuori un buon modo generico di nominare il tipo enum in modo tale che quando viene utilizzato, la denominazione del enum ' l'istanza 'sarà piuttosto semplice?

+4

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

risposta

241

Microsoft consiglia di utilizzare singolare per Enum s meno che il Enum rappresenta campi di bit (utilizzare il FlagsAttribute pure). Vedere Enumeration Type Naming Conventions (un sottoinsieme di Microsoft Naming Guidelines).

Per rispondere alla tua precisazione, non vedo niente di sbagliato con uno dei seguenti:

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ì, questa è una risposta corretta. Queste linee guida sono usate nel .Net Framework, ad es. enum DayOfWeek e flags enum RegexOptions. –

+1

Sì, questa è la pratica consigliata, la accolgo. Tuttavia non risponde alla mia domanda. –

+1

@ o.k.w per elaborare ulteriormente, anche se sembra brutto, se hai bisogno di un singolo valore da un enumeratore usa la forma singolare per il campo/proprietà/argomento. Se lo supporti avendo più flag impostati, usa il plurale. Se il tuo enum non è un enumeratore di bandiere, usa il singolare per il nome del tipo e il campo/proprietà/argomenti. –

10

In generale, la raccomandazione di best practice è singolare, tranne per quelle enumerazioni che hanno l'attributo [Flags] ad esse allegato (e che quindi può contenere campi di bit), che dovrebbe essere plurale.

Dopo aver letto la domanda modificata, ho la sensazione che si possa pensare che il nome della proprietà o il nome della variabile debba essere diverso dal nome del tipo enum ... Non è così. 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; } 
     } 
    } 
+0

Vero, credo che il mio metodo sia un modo "rapido e pigro" per evitare di dover pensare ai nomi quando si usano le enumerazioni. –

+1

A supporto della risposta: su MSDN, da [Nomi dei membri tipo] (https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-type-members) nel sezione "Nomi delle proprietà": ** ✓ CONSIDER ** attribuendo a una proprietà lo stesso nome del suo tipo. ** Esempio: ** 'Colore colore pubblico {ottieni {...} set {...}}' – DavidRR

28

ho iniziato denominazione enumerazioni al plurale ma da allora sono cambiato in singolare. Sembra solo avere più senso nel contesto in cui vengono utilizzati.

enum Status { Unknown = 0, Incomplete, Ready } 

Status myStatus = Status.Ready; 

confronta con:

Statuses myStatus = Statuses.Ready; 

trovo al singolare al suono più naturale nel contesto. Siamo d'accordo che quando dichiariamo l'enum, che accade in un posto, stiamo pensando "questo è un gruppo di whatevers", ma quando lo si usa, presumibilmente in molti posti, stiamo pensando "questo è uno qualsiasi" .

+5

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

+0

Concordato, @SvenL. Esempio aggiornato di conseguenza. –

+0

Vuoi davvero mettere un attributo '[Flags]' sul tuo esempio? Non ha senso che qualcosa abbia uno stato sia "Incomplete" che "Ready". Se tu avessi 'enum [Flags] Steps {First, Second, Third}', chiameresti davvero la tua variabile 'completedStep'? – Pakman

6

Best Practice: utilizzare singolare. Hai una lista di oggetti che compongono un Enum. L'uso di un elemento nell'elenco sembra strano quando dici Versions.1_0. Ha più senso dire Version.1_0 poiché esiste solo una versione 1_0.

20

La situazione non si applica mai al plurale.

Un enum mostra un attributo di qualcosa o di un altro. Faccio un esempio:

enum Humour 
{ 
    Irony, 
    Sarcasm, 
    Slapstick, 
    Nothing 
} 

Si può avere un solo tipo, ma provo penso nel molteplice, piuttosto che al plurale:

Humour.Irony | Humour.Sarcasm

Piuttosto che

Humours { Irony, Sarcasm }

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

+1

Haha, beh, i programmatori non sono sempre grammaticalmente/politicamente corretti. Nel tuo caso, probabilmente userò "HumourTypes". Cattiva abitudine, credo. –

+4

Sì, io amo l'umorismo britannico. – Epaga

+0

Che cosa succede se voglio cercare tutti gli individui che hanno un senso del sarcasmo o avere un senso dell'ironia, non dovrei passare la routine di ricerca un'istanza di 'Humours' che contiene' Humours.Irony | Huomours.Sarcasm' ?? –

0

D'altro thread C# naming convention for enum and matching property qualcuno ha sottolineato quello che penso sia una buona idea:

"So che il mio suggerimento va contro le convenzioni di denominazione di .NET, ma io personalmente enumerazioni prefisso con 'E' e bandiere enum con 'F' (simile a come prefisso Interfacce con 'I'). "

4

Venendo in un po 'tardi ...

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

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

public enum EntityType { 
    Type1, Type2 
} 

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

} 

In questo caso, mi piacerebbe seguire le guidelins MS e utilizzare un nome singolare per l'enumerazione (plurale per le bandiere). È probabilmente la soluzione più semplice.

Il mio problema (nello other question) è quando l'enum è definito nell'ambito della classe, impedendo l'utilizzo di una proprietà denominata esattamente dopo l'enum.

3

Se si sta tentando di scrivere semplice, il codice ancora proibito in questo modo:

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

Le opzioni disponibili sono:

  1. Ignorare la raccomandazione MS e utilizzare un prefisso o suffisso sul nome 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 facile 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é usare un enumerato annidato in primo luogo e poi annidarlo in un'altra classe se questo crea problemi? –

+1

In caso di genere, è molto più significativo avere il nome della proprietà come 'Sesso 'e il nome enum come' Sesso'. Quindi 'isac.Gender = Sex.Male' .. – nawfal

+2

Non sono sicuro del motivo per cui questo ragazzo è stato svalutato. Questa situazione è legittima e lontana dall'ipotetico. Uno nidifica i tipi di enum in C# per ragioni simili che si potrebbe usare una classe interna in Java ... perché il tipo interno è usato solo nell'esterno e da nessun'altra parte, e ha senso solo nel contesto esterno e non altrove. E come risultato dei limiti del compilatore, devi scegliere una delle soluzioni menzionate. –

2

Questo è uno dei pochi posti che non sono d'accordo con la convenzione sufficiente per andare contro di esso. TBH, I HATE che la definizione di enum e l'istanza di esso possono avere lo stesso nome.Postisso tutto il mio Enum con "Enum" in modo specifico perché rende chiaro quale contesto ha in un 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 potrà mai confondere ciò è l'enum e qual è l'istanza di esso.

Problemi correlati