2009-09-10 16 views
186

Ich frage diese Frage trotz ähnlicher gelesen zu haben, aber nicht genau das, was ich bei C# naming convention for enum and matching property willEnum Naming Convention - Plural

Ich fand ich habe eine Tendenz Aufzählungen in Plural zu benennen und dann ‚Verwendung‘ sich als singuläre, Beispiel:

public enum EntityTypes { 
    Type1, Type2 
} 

public class SomeClass { 
    /* 
    some codes 
    */ 

    public EntityTypes EntityType {get; set;} 

} 

natürlich funktioniert es und das ist mein Stil, aber jeder potentielles Problem mit solchen Konvention finden kann? Ich habe eine „hässlich“ Benennung mit dem Wort „Status“ aber:

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

public class SomeClass { 
    /* 
    some codes 
    */ 

    public OrderStatuses OrderStatus {get; set;} 

} 

Zusätzliche Information: Vielleicht ist meine Frage nicht klar genug war. Ich muss oft nachdenken, wenn ich die Variablen der definierten Enum-Typen benenne. Ich kenne die Best Practice, aber es hilft nicht, meine Arbeit bei der Benennung dieser Variablen zu erleichtern.

Ich kann nicht alle meine enum Eigenschaften (sagen "Status") als "MyStatus".

Meine Frage: Kann jemand ein mögliches Problem mit meiner oben beschriebenen Vereinbarung finden? Es geht NICHT um Best Practice.

Frage neu formulieren:

Nun, ich denke, sollte ich die Frage so stellen: Kann jemand eine gute generische Art und Weise der Benennung der Enum-Typ kommen, so dass, wenn verwendet, die Benennung der Enumeration " Instanz 'wird ziemlich einfach sein?

+4

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

Antwort

241

Microsoft für Enum s unter Verwendung von Singular empfiehlt es sei denn, die Enum Bit-Felder darstellt (verwenden Sie die FlagsAttribute als auch). Siehe Enumeration Type Naming Conventions (eine Teilmenge von Microsofts Naming Guidelines).

auf Ihre Klarstellung zu antworten, ich sehe nichts falsch mit einem der folgenden:

public enum OrderStatus { Pending, Fulfilled, Error }; 

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

oder

public enum OrderStatus { Pending, Fulfilled, Error }; 

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

Ja, das ist eine korrekte Antwort. Diese Richtlinien werden im .Net-Framework verwendet, z. enum DayOfWeek und flags enum RegexOptions. –

+1

Ja, das ist die empfohlene Praxis, ich begrüße es. Aber es beantwortet meine Frage nicht. –

+1

@ o.k.w weiter zu erarbeiten, obwohl es hässlich aussieht, wenn Sie einen einzelnen Wert von einer Flag-Enumeration benötigen, verwenden Sie das Singular-Formular für das Feld/Eigenschaft/Argument. Wenn Sie mehrere Flags gesetzt haben, verwenden Sie den Plural. Wenn Ihre Enumeration keine Flag-Enumeration ist, verwenden Sie die Einzahl für den Typnamen und das Feld/Eigenschaft/Argumente. –

10

Im Allgemeinen ist die Best Practice-Empfehlung singulär, außer für Enumerationen, denen das Attribut [Flags] zugeordnet ist (und die daher Bitfelder enthalten können), die im Plural sein sollten.

Nachdem ich Ihre bearbeitete Frage gelesen habe, habe ich das Gefühl, dass Sie denken können, dass der Name der Eigenschaft oder der Variablenname sich von dem Namen des Enum-Typs unterscheiden muss. Im Folgenden ist völlig in Ordnung ...

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

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

Wahr, ich denke, meine Methode ist eine "schnelle und faule" Möglichkeit, die Notwendigkeit zu vermeiden, bei der Verwendung der Enums an Namen zu denken. –

+1

Zur Unterstützung Ihrer Antwort: auf MSDN, von [Namen von Typ-Mitgliedern] (https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-type-members) in der Abschnitt "Namen der Eigenschaften": ** ✓ ANSEHEN **, der einer Eigenschaft den gleichen Namen wie ihrem Typ gibt. ** Beispiel: ** 'public Color Color {get {...} set {...}}' – DavidRR

28

Ich begann Aufzählungen im Plural zu benennen, aber seit singulär verändert. Scheint nur sinnvoll im Zusammenhang mit dem, wo sie verwendet werden.

enum Status { Unknown = 0, Incomplete, Ready } 

Status myStatus = Status.Ready; 

vergleichen:

Statuses myStatus = Statuses.Ready; 

ich die Singularform finden in Kontext natürlicher klingen. Wir sind uns einig, dass wir bei der Deklaration der Enum, die an einem Ort stattfindet, denken "das ist eine Gruppe von was auch immer", aber wenn wir es benutzen, denken wir vermutlich an vielen Orten, dass "das ist was auch immer" .

+5

Eine kleine späte Reaktion (und vielleicht ein wenig off-topic) aber: ich würde vorschlagen, den Wert '0' zu verwenden Der unbekannte Wert, also eine nicht initialisierte Variable, ist standardmäßig 'Unbekannt'. – SvenL

+0

Einverstanden, @SvenL. Das Beispiel wurde entsprechend aktualisiert. –

+0

Würden Sie wirklich ein '[Flags]' Attribut auf Ihrem Beispiel obwohl setzen? Es macht keinen Sinn, dass etwas den Status "Unvollständig" und "Bereit" hat. Wenn Sie 'enum [Flags] Steps {First, Second, Third}' hätten, würden Sie Ihre Variable 'completedStep' wirklich nennen? – Pakman

6

Best Practice - singular verwenden. Sie haben eine Liste von Elementen, aus denen ein Enum besteht. Die Verwendung eines Elements in der Liste klingt seltsam, wenn Sie Versions.1_0 sagen. Es macht mehr Sinn, Version.1_0 zu sagen, da es nur eine 1_0 Version gibt.

20

Die Situation gilt nie wirklich für Plural.

Ein enum zeigt ein Attribut von etwas oder einem anderen. Ich gebe ein Beispiel:

enum Humour 
{ 
    Irony, 
    Sarcasm, 
    Slapstick, 
    Nothing 
} 

Sie einen Typ haben, aber versuchen, daran zu denken, in dem mehrere, anstatt Plural:

Humour.Irony | Humour.Sarcasm

Statt

Humours { Irony, Sarcasm }

Sie haben einen Sinn für Humor, Sie haben keinen Sinn für Humor.

+1

Haha, naja, Programmierer sind nicht immer grammatikalisch/politisch korrekt. In Ihrem Fall verwende ich wahrscheinlich "HumourTypes". Schlechte Angewohnheit denke ich. –

+4

Ja, ich liebe britischen Humor. – Epaga

+0

Was, wenn ich nach allen Personen suchen möchte, die einen Sinn für Sarkasmus haben ODER einen Sinn für Ironie haben, würde ich die Suchroutine eine Instanz von 'Humours' mit 'Humours.Irony | Huomours.Sarcasm' –

0

Auf dem anderen Thread C# naming convention for enum and matching property jemand darauf hingewiesen, was ich denke, eine sehr gute Idee ist:

„weiß, dass ich meinen Vorschlag .NET Regeln für die Namensgebung geht gegen, aber ich persönlich Präfix Aufzählungen mit‚E‘und Enum-Flaggen mit 'F' (ähnlich wie wir Schnittstellen mit 'I' voranstellen). "

4

spät in etwas kommen ...

Es gibt einen wichtigen Unterschied zwischen Ihrer Frage und den einem you mention (was ich ;-) fragte:

Sie setzen die Enumerationsdefinition aus der Klasse, die Damit können Sie den gleichen Namen für die eNUM und die Eigenschaft haben:

public enum EntityType { 
    Type1, Type2 
} 

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

} 

In diesem Fall würde ich die MS guidelins folgen und einen einzigartigen Namen für die eNUM (Plural für Flags) verwenden. Es ist wahrscheinlich die einfachste Lösung.

Mein Problem (in der other question) ist, wenn die Enumeration im Bereich der Klasse definiert ist, verhindert die Verwendung einer Eigenschaft genau nach der Enumeration benannt.

3

Wenn Sie versuchen, einfach zu schreiben, noch verboten Code wie folgt:

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

Optionen sind verfügbar:

  1. die MS Empfehlung ignorieren und einen Präfix oder Suffix auf den Enum-Namen verwenden :

    public class Person 
    { 
        public enum GenderEnum 
        { 
         Male, 
         Female 
        } 
        public GenderEnum Gender { get; set; } 
    } 
    
  2. Verschieben Sie die Enum-Definition vorzugsweise außerhalb der Klasse in eine andere Klasse. Hier ist eine einfache Lösung für das oben:

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

Hypothetische Situation und keine gute Lösung. Warum sollte man zuerst eine verschachtelte 'enum' verwenden und sie dann in eine andere Klasse verschachteln, wenn dies Probleme verursacht? –

+1

Im Fall von Geschlecht ist es viel sinnvoller, den Namen der Eigenschaft als "Geschlecht" zu haben und den Namen als "Geschlecht" zu bezeichnen. Also 'isac.Gender = Sex.Male' .. – nawfal

+2

Ich bin mir nicht sicher, warum dieser Typ downvoted wird. Diese Situation ist legitim und keineswegs hypothetisch. Man nistet Enum-Typen in C# aus ähnlichen Gründen, dass man eine innere Klasse in Java verwenden könnte ... weil der innere Typ nur im äußeren und nirgendwo sonst verwendet wird und nur im Kontext des äußeren und nicht anderswo Sinn macht. Und als Ergebnis der Einschränkungen des Compilers müssen Sie eine der genannten Lösungen auswählen. –

2

Dies ist einer der wenigen Orte, die ich mit der Konvention nicht einverstanden genug gehen dagegen. TBH, ich HASSE, dass die Definition eines Enums und die Instanz davon den gleichen Namen haben können.Ich postfixe alle meine Enums mit "Enum", weil es klar macht, welchen Kontext es in einer bestimmten Verwendung hat. IMO macht es den Code viel lesbarer.

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


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

Niemand wird jemals verwechseln, was das Enum ist und was die Instanz davon ist.