Enum Naming Convention - Plural

267

Ich stelle diese Frage, obwohl ich ähnlich gelesen habe, aber nicht genau das, was ich bei der C # -Namenskonvention für Aufzählung und übereinstimmende Eigenschaft möchte

Ich habe festgestellt, dass ich die Tendenz habe, Enums im Plural zu benennen und sie dann als Singular zu verwenden. 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 kann jemand ein potenzielles Problem mit einer solchen Konvention finden? Ich habe allerdings eine "hässliche" Benennung mit dem Wort "Status":

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

public class SomeClass {
  /*
    some codes
  */

  public OrderStatuses OrderStatus {get; set;}

}

Zusätzliche Informationen: Vielleicht war meine Frage nicht klar genug. Ich muss oft nachdenken, wenn ich die Variablen meiner definierten Aufzählungstypen benenne. Ich kenne die Best Practice, aber es hilft mir nicht, diese Variablen leichter zu benennen.

Ich kann unmöglich alle meine Enum-Eigenschaften (sagen wir "Status") als "MyStatus" verfügbar machen.

Meine Frage: Kann jemand ein potenzielles Problem mit meiner oben beschriebenen Konvention finden? Es geht NICHT um Best Practice.

Umformulierung der Frage:

Nun, ich denke, ich sollte die Frage folgendermaßen stellen: Kann jemand eine gute generische Methode finden, um den Aufzählungstyp so zu benennen, dass die Benennung der Aufzählungsinstanz bei Verwendung ziemlich einfach ist?

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

Antworten:

333

Microsoft empfiehlt die Verwendung von Singular für Enums, es sei denn, das Enumstellt Bitfelder dar (verwenden Sie auch das FlagsAttribute). Siehe Aufzählungstyp Namenskonventionen (eine Untergruppe von Microsofts Richtlinien zur Benennung ).

Um auf Ihre Klarstellung zu antworten, sehe ich nichts Falsches an den folgenden Punkten:

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; }
}
Jason
quelle
20
Ja, das ist eine richtige Antwort. Diese Richtlinien werden im .Net Framework verwendet, z. B. enum DayOfWeek und Flags enum RegexOptions.
Alexander Zwitbaum
1
Ja, dies ist die empfohlene Praxis, ich begrüße es. Meine Frage wird jedoch nicht beantwortet.
OK,
1
@okw, um weiter auszuarbeiten, obwohl es hässlich aussieht, wenn Sie einen einzelnen Wert aus einer Flag-Enumeration benötigen, verwenden Sie die Singularform für das Feld / die Eigenschaft / das Argument. Wenn Sie das Setzen mehrerer Flags unterstützen, verwenden Sie den Plural. Wenn Ihre Aufzählung keine Flags-Aufzählung ist, verwenden Sie den Singular für den Typnamen und das Feld / die Eigenschaft / die Argumente.
Jonathan Dickinson
4
Hier ist der Link zur .NET 4.0-Version des Handbuchs zu Microsoft-Namenskonventionen, auf das in der Antwort verwiesen wird.
1
@Thomas Ich hatte noch nie ein Problem damit, ich kann nicht verstehen, warum es nicht funktionieren würde - sehe keinen Kontext, in dem es nicht eindeutig wäre, ob es sich um einen Typ oder eine Variable handelt, auf die verwiesen wird. dh OrderStatus == OrderStatus.Pendingwird als Variable für die linke und dann als Aufzählung auf der rechten Seite erkannt
James Hurley
39

Ich habe angefangen, Enums im Plural zu benennen, bin aber seitdem zu Singular gewechselt. Scheint nur im Zusammenhang mit dem Verwendungszweck sinnvoller zu sein.

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

Vergleichen mit:

Statuses myStatus = Statuses.Ready;

Ich finde, dass die Singularform im Kontext natürlicher klingt. Wir sind uns einig, dass wir bei der Deklaration der Aufzählung, die an einem Ort stattfindet, denken, "dies ist eine Gruppe von was auch immer", aber wenn wir sie verwenden, vermutlich an vielen Orten, denken wir, "dies ist was auch immer". .

Bob Kaufman
quelle
6
Eine etwas späte Reaktion (und vielleicht ein wenig außerhalb des Themas), aber: Ich würde vorschlagen, einen Wert 0für den unbekannten Wert zu verwenden. Auf diese Weise ist standardmäßig eine nicht initialisierte Variable Unknown.
SvenL
Einverstanden, @SvenL. Beispiel entsprechend aktualisiert.
Bob Kaufman
Würden Sie [Flags]Ihrem Beispiel wirklich ein Attribut hinzufügen? Es ist nicht sinnvoll, dass etwas den Status "Unvollständig" und "Bereit" hat. Wenn ja enum [Flags]Steps { First, Second, Third }, würden Sie Ihre Variable wirklich benennen completedStep?
Pakman
26

Die Situation trifft nie wirklich auf den Plural zu.

An enumzeigt ein Attribut von etwas oder einem anderen. Ich werde ein Beispiel geben:

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

Sie können einen Typ haben, aber versuchen Sie, ihn im Vielfachen und nicht im Plural zu betrachten:

Humour.Irony | Humour.Sarcasm

Eher, als

Humours { Irony, Sarcasm }

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

Kyle Rosendo
quelle
5
Haha, Programmierer sind nicht immer grammatikalisch / politisch korrekt. In Ihrem Fall verwende ich wahrscheinlich "HumourTypes". Schlechte Angewohnheit, denke ich.
OK,
Was ist, wenn ich nach allen Personen suchen möchte, die ein Gefühl von Sarkasmus haben ODER ein Gefühl von Ironie haben, würde ich die Suchroutine nicht an eine Instanz übergeben, die Humoursenthält Humours.Irony | Huomours.Sarcasm?
Charles Bretana
14

Im Allgemeinen ist die Best-Practice-Empfehlung Singular, mit Ausnahme der Aufzählungen, denen das Attribut [Flags] zugeordnet ist (und die daher Bitfelder enthalten können), die Plural sein sollten.

Nach dem Lesen Ihrer bearbeiteten Frage habe ich das Gefühl, dass der Name der Eigenschaft oder der Variable vom Namen des Aufzählungstyps abweichen muss. Das Folgende ist vollkommen 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; }
      }
  }
Charles Bretana
quelle
Es stimmt, ich denke, meine Methode ist eine "schnelle und faule" Methode, um zu vermeiden, dass bei der Verwendung der Aufzählungen an Namen gedacht werden muss.
OK,
1
Zur Unterstützung Ihrer Antwort: Auf MSDN aus Namen von Typmitgliedern im Abschnitt "Namen von Eigenschaften": ✓ BEACHTEN Sie, dass Sie einer Eigenschaft den gleichen Namen wie ihrem Typ geben. Beispiel: public Color Color { get {...} set {...} }
DavidRR
10

Dies ist einer der wenigen Orte, an denen ich mit der Konvention nicht einverstanden bin, um dagegen zu verstoßen. TBH, ich hasse es, dass die Definition einer Aufzählung und die Instanz derselben den gleichen Namen haben können. Ich postfixiere alle meine Enums mit "Enum", weil dadurch klar wird, 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 verwirren, was die Aufzählung ist und was die Instanz davon ist.

Heidekraut
quelle
2
Ich kam hierher, um nach einer Namenskonvention für Aufzählungen zu suchen, nachdem ich eine Klasse und eine Aufzählung mit demselben Namen hatte - und wollte "etwas" haben, um es offensichtlicher zu machen. Ich dachte daran, es mit "E" zu versehen (für Enums natürlich), als würden wir Schnittstellen mit "I" voranstellen - aber ich mochte Ihre Lösung, Heather! Schön!!!
Scott
1
Aus den Designrichtlinien von Microsoft: "Verwenden Sie KEIN" Enum "-Suffix in Enum-Typnamen." docs.microsoft.com/en-us/dotnet/standard/design-guidelines/…
Thoryn Hawley
3
Vielleicht haben Sie den SEHR ERSTEN Satz von dem, was ich gesagt habe, verpasst? Lassen Sie es mich hier kopieren und für Sie einfügen: "Dies ist einer der wenigen Orte, an denen ich mit der Konvention nicht einverstanden bin, genug, um dagegen zu verstoßen." Ich erkläre dann weiter warum.
Heather
2
Ich verstoße nicht "in jeder Hinsicht" gegen die Richtlinien. Das ist Übertreibung. Ich gehe auf eine einzige, spezifische Weise gegen die Richtlinien vor, die durch die von mir angegebenen Überlegungen gestützt wird. Wenn Sie nicht zustimmen möchten, geben Sie Ihre Gründe für die Nichtübereinstimmung an. Ihre Übertreibung ist unnötig und verbessert Ihre Position nicht.
Heather
1
Wenn eine Namespace-Kollision möglich ist, sehe ich kein Problem beim Hinzufügen Enum? Es ist nicht so, als würde der Autor vorschlagen, alle Vars mit ihrem Typ zu fixieren. Der Autor hat auch einen viel stärkeren Fall, da ein Grund angegeben wird, während M $ keine Rechtfertigung liefert.
Jai Govindani
7

Wenn Sie versuchen, einfachen, aber verbotenen Code wie diesen zu schreiben:

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

Ihre Optionen sind:

  1. Ignorieren Sie die MS-Empfehlung und verwenden Sie ein Präfix oder Suffix für den Namen der Aufzählung:

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

    public class Characteristics
    {
        public enum Gender
        {
            Male,
            Female
        }
    }
    public class Person
    {
        public Characteristics.Gender Gender { get; set; }  
    }
MiloNC
quelle
2
Hypothetische Situation und keine gute Lösung. Warum sollte man ein verschachteltes Element enumzuerst verwenden und es dann in einer weiteren Klasse verschachteln, wenn dies Probleme verursacht?
Gert Arnold
1
Im Fall von Geschlecht ist es viel sinnvoller, den Eigenschaftsnamen als Genderund den Aufzählungsnamen als zu haben Sex. Also isac.Gender = Sex.Male..
Nawfal
3
Ich bin mir nicht sicher, warum dieser Typ herabgestimmt wird. Diese Situation ist legitim und alles andere als hypothetisch. Man verschachtelt Aufzählungstypen in C # aus ähnlichen Gründen, wie man eine innere Klasse in Java verwenden könnte ... weil der innere Typ nur im äußeren und nirgendwo anders verwendet wird und nur im Kontext des äußeren und nicht anderswo Sinn macht. Aufgrund von Compiler-Einschränkungen müssen Sie eine der genannten Lösungen auswählen.
Nathan Pitman
Sie müssen es von irgendwo aus festlegen, normalerweise außerhalb der Klasse, oder möglicherweise beim Erstellen der Klasse. In diesem Fall muss die Aufzählung außerhalb definiert werden, es sei denn, Sie möchten Person.Gender.Male senden. Geschlecht könnte für mehr gelten Ich denke, es ist sowieso die beste Lösung, wenn man es nicht verschachtelt hat.
Jim Wolff
2
Eine weitere, möglicherweise bessere Option ist die Antwort von "Serge - appTranslator".
Curtis Yallop
6

Best Practice - Verwenden Sie Singular. Sie haben eine Liste von Elementen, aus denen eine Aufzählung besteht. Die Verwendung eines Elements in der Liste klingt seltsam, wenn Sie sagen Versions.1_0. Es ist sinnvoller zu sagen, Version.1_0da es nur eine 1_0-Version gibt.

Jeremy Cron
quelle
5

Kommt etwas spät ...

Es gibt einen wichtigen Unterschied zwischen Ihrer und der von Ihnen erwähnten Frage (die ich gestellt habe ;-):

Sie haben die Aufzählungsdefinition aus der Klasse entfernt, sodass Sie für die Aufzählung und die Eigenschaft denselben Namen haben können:

public enum EntityType { 
  Type1, Type2 
} 

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

}

In diesem Fall würde ich den MS-Richtlinien folgen und einen singulären Namen für die Aufzählung verwenden (Plural für Flags). Es ist wahrscheinlich die einfachste Lösung.

Mein Problem (in der anderen Frage ) ist, wenn die Aufzählung im Bereich der Klasse definiert wird, wodurch die Verwendung einer Eigenschaft verhindert wird, die genau nach der Aufzählung benannt ist.

Serge Wautier
quelle
0

Auf der anderen Thread- C # -Namenskonvention für Enum und Matching-Eigenschaft jemand darauf hingewiesen, was ich für eine sehr gute Idee halte:

"Ich weiß, dass mein Vorschlag gegen die .NET-Namenskonventionen verstößt, aber ich persönlich stelle Enums mit 'E' und Enum-Flags mit 'F' voran (ähnlich wie wir Interfaces mit 'I' voranstellen)."

RenniePet
quelle