Convention de dénomination des énumérations - pluriel


267

Je pose cette question malgré la lecture similaire mais pas exactement ce que je veux à la convention de nommage C # pour l'énumération et la propriété correspondante

J'ai trouvé que j'avais tendance à nommer les énumérations au pluriel, puis à les «utiliser» au singulier, par exemple:

public enum EntityTypes {
  Type1, Type2
}

public class SomeClass {
  /*
    some codes
  */

  public EntityTypes EntityType {get; set;}

}

Bien sûr, cela fonctionne et c'est mon style, mais quelqu'un peut-il trouver un problème potentiel avec une telle convention? J'ai un nom "moche" avec le mot "Statut" cependant:

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

public class SomeClass {
  /*
    some codes
  */

  public OrderStatuses OrderStatus {get; set;}

}

Informations supplémentaires: Peut-être que ma question n'était pas assez claire. Je dois souvent réfléchir sérieusement lorsque je nomme les variables des types d'enum définis. Je connais la meilleure pratique, mais cela n'aide pas à faciliter mon travail de nommer ces variables.

Je ne peux pas exposer toutes mes propriétés enum (dites "Status") comme "MyStatus".

Ma question: quelqu'un peut-il trouver un problème potentiel avec ma convention décrite ci-dessus? Il ne s'agit PAS des meilleures pratiques.

Reformulation de la question:

Eh bien, je suppose que je devrais poser la question de cette façon: quelqu'un peut-il trouver un bon moyen générique de nommer le type d'énumération de telle sorte que lorsqu'il est utilisé, le nom de l'instance d'énumération sera assez simple?


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

Réponses:


333

Microsoft recommande d'utiliser le singulier pour Enums sauf si les Enumchamps de bits représentent (utilisez FlagsAttributeégalement le). Voir Conventions de dénomination des types d'énumération (un sous-ensemble des directives de dénomination de Microsoft ).

Pour répondre à votre clarification, je ne vois rien de mal à l'un ou l'autre des éléments suivants:

public enum OrderStatus { Pending, Fulfilled, Error };

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

ou

public enum OrderStatus { Pending, Fulfilled, Error };

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

20
Oui, c'est une bonne réponse. Ces lignes directrices sont utilisées dans le .Net Framework, par exemple enum DayOfWeek et flags enum RegexOptions.
Alexander Zwitbaum

1
Oui, c'est la pratique recommandée, je m'en réjouis. Mais cela ne répond pas à ma question.
okw

1
@okw pour élaborer davantage, même si cela semble laid, si vous avez besoin d'une seule valeur à partir d'une énumération d'indicateur, utilisez la forme singulière pour le champ / propriété / argument. Si vous le supportez avec plusieurs drapeaux, utilisez le pluriel. Si votre énumération n'est pas une énumération d'indicateurs, utilisez le singulier pour le nom de type et le champ / propriété / arguments.
Jonathan Dickinson

4
Voici le lien vers la version .Net 4.0 du guide des conventions de dénomination Microsoft lié à la réponse.

1
@Thomas Je n'ai jamais eu de problème avec ça, je ne vois pas pourquoi ça ne marcherait pas - je ne vois pas de contexte où il serait ambigu que ce soit un type ou une variable référencée. c.-à OrderStatus == OrderStatus.Pending- d. est reconnu comme une variable pour la gauche et ensuite une énumération sur la droite
James Hurley

39

J'ai commencé par nommer des énumérations au pluriel, mais j'ai depuis changé au singulier. Semble tout simplement plus logique dans le contexte de leur utilisation.

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

Comparer aux:

Statuses myStatus = Statuses.Ready;

Je trouve que la forme singulière semble plus naturelle dans son contexte. Nous sommes d'accord que lorsque nous déclarons l'énumération, qui se produit en un seul endroit, nous pensons "c'est un groupe de personnes", mais lorsque nous l'utilisons, vraisemblablement dans de nombreux endroits, nous pensons que "c'est celui qui est" .


6
Une réaction un peu tardive (et peut-être un peu hors sujet) mais: je suggérerais d'utiliser la valeur 0pour la valeur inconnue, de cette façon une variable non initialisée est par défaut Unknown.
SvenL

D'accord, @SvenL. Exemple mis à jour en conséquence.
Bob Kaufman

Souhaitez-vous vraiment mettre un [Flags]attribut sur votre exemple? Il n'est pas logique qu'un élément ait à la fois le statut «Incomplet» et «Prêt». Si c'était le cas enum [Flags]Steps { First, Second, Third }, nommeriez-vous vraiment votre variable completedStep?
Pakman

26

La situation ne s'applique jamais vraiment au pluriel.

Un enummontre un attribut de quelque chose ou d'un autre. Je vais donner un exemple:

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

Vous pouvez avoir un seul type, mais essayez de le penser au multiple plutôt qu'au pluriel:

Humour.Irony | Humour.Sarcasm

Plutôt que

Humours { Irony, Sarcasm }

Vous avez le sens de l'humour, vous n'avez pas le sens de l'humour.


5
Haha, eh bien, les programmeurs ne sont pas toujours grammaticalement / politiquement corrects. Dans votre cas, j'utilise probablement "HumourTypes". Mauvaise habitude je suppose.
okw

Et si je veux rechercher toutes les personnes qui ont un sens du sarcasme OU ont un sens de l'ironie, ne passerais-je pas la routine de recherche une instance de Humourscontenir Humours.Irony | Huomours.Sarcasm??
Charles Bretana

14

En général, la recommandation de meilleure pratique est singulière, à l'exception des énumérations auxquelles l'attribut [Flags] est attaché (et qui peuvent donc contenir des champs de bits), qui doivent être pluriels.

Après avoir lu votre question modifiée, j'ai l'impression que vous pouvez penser que le nom de la propriété ou le nom de la variable doit être différent du nom du type d'énumération ... Ce n'est pas le cas. Ce qui suit est parfaitement bien ...

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

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

Certes, je suppose que ma méthode est un moyen «rapide et paresseux» d'éviter de penser à des noms lors de l'utilisation des énumérations.
okw

1
À l'appui de votre réponse: sur MSDN, à partir des noms des membres de type dans la section "Noms des propriétés": ✓ CONSIDÉRER en donnant à une propriété le même nom que son type. Exemple: public Color Color { get {...} set {...} }
DavidRR

10

C'est l'un des rares endroits où je suis assez en désaccord avec la convention pour aller à son encontre. TBH, je déteste que la définition d'une énumération et son instance puissent avoir le même nom. Je postfixe tous mes Enums avec "Enum" spécifiquement parce qu'il indique clairement quel est le contexte dans une utilisation donnée. OMI, il rend le code beaucoup plus lisible.

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


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

Personne ne confondra jamais ce qu'est l'énumération et quelle en est l'instance.


2
Je suis venu ici à la recherche d'une convention de dénomination d'énumération, après avoir nommé une classe et une énumération identiques - et je voulais avoir «quelque chose» pour le rendre plus évident. Je pensais le préfixer avec "E" (pour Enums évidemment) comme nous préfixons les interfaces avec "I" - mais j'ai aimé votre solution Heather! Joli!!!
Scott

1
D'après les lignes directrices de conception de Microsoft: "NE PAS utiliser de suffixe" Enum "dans les noms de type enum." docs.microsoft.com/en-us/dotnet/standard/design-guidelines/…
Thoryn Hawley

3
Peut-être avez-vous manqué la TRÈS PREMIÈRE phrase de ce que j'ai dit? Ici, permettez-moi de le copier et de le coller pour vous: "C'est l'un des rares endroits où je suis assez en désaccord avec la convention pour aller contre.". Je continue ensuite à expliquer pourquoi.
Heather

2
Je ne vais pas à l'encontre des directives "de toutes les manières possibles". C'est hyperbole. Je vais à l'encontre des lignes directrices d'une manière unique et spécifique, qui est étayée par le raisonnement que j'énonce. Si vous voulez être en désaccord, très bien, énumérez vos raisons d'être en désaccord; votre hyperbole est inutile et ne fait pas avancer votre position.
Heather

1
S'il y a une collision d'espace de noms possible, je ne vois aucun problème à ajouter Enum? Ce n'est pas comme si l'auteur proposait de postfixer tous les vars avec leur type. L'auteur a également un cas beaucoup plus solide étant donné qu'une raison est fournie, alors que M $ fournit une justification nulle.
Jai Govindani

7

Si vous essayez d'écrire du code simple mais pourtant interdit comme ceci:

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

Vos options sont:

  1. Ignorez la recommandation MS et utilisez un préfixe ou un suffixe sur le nom de l'énumération:

    public class Person
    {
        public enum GenderEnum
        {
            Male,
            Female
        }
        public GenderEnum Gender { get; set; }
    }
  2. Déplacez la définition d'énumération en dehors de la classe, de préférence dans une autre classe. Voici une solution simple à ce qui précède:

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

2
Situation hypothétique et pas une bonne solution. Pourquoi utiliser un imbriqué enumen premier lieu, puis l'imbriquer dans une autre classe si cela pose problème?
Gert Arnold

1
En cas de genre, il est beaucoup plus significatif d'avoir le nom de propriété as Genderet le nom d'énumération as Sex. Alors isac.Gender = Sex.Male..
nawfal

3
Je ne sais pas pourquoi ce type est sous-voté. Cette situation est légitime et loin d'être hypothétique. On imbrique des types énum en C # pour des raisons similaires que l'on pourrait utiliser une classe interne en Java ... car le type interne est utilisé uniquement à l'extérieur et nulle part ailleurs, et n'a de sens que dans le contexte de l'extérieur et pas ailleurs. Et en raison des limitations du compilateur, vous devez choisir l'une des solutions mentionnées.
Nathan Pitman

Vous devrez le définir à partir de quelque part, généralement en dehors de la classe, ou peut-être lors de la construction de la classe, auquel cas vous aurez besoin que l'énumération soit définie à l'extérieur, sauf si vous voulez envoyer Person.Gender.Male, Gender pourrait s'appliquer à plus que de simples personnes, je pense que ne pas l'avoir imbriqué est de toute façon la meilleure solution.
Jim Wolff

2
Une autre option, peut-être meilleure, est la réponse de "Serge - appTranslator".
Curtis Yallop

6

Meilleure pratique - utilisez le singulier. Vous avez une liste d'éléments qui composent un Enum. L'utilisation d'un élément de la liste semble étrange lorsque vous dites Versions.1_0. Il est plus logique de dire Version.1_0qu'il n'y a qu'une seule version 1_0.


5

J'arrive un peu tard ...

Il y a une différence importante entre votre question et celle que vous mentionnez (que j'ai posée ;-):

Vous mettez la définition d'énumération hors de la classe, ce qui vous permet d'avoir le même nom pour l'énumération et la propriété:

public enum EntityType { 
  Type1, Type2 
} 

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

}

Dans ce cas, je suivrais les lignes directrices de MS et utiliserais un nom singulier pour l'énumération (pluriel pour les drapeaux). C'est probablement la solution la plus simple.

Mon problème (dans l' autre question ) est lorsque l'énumération est définie dans la portée de la classe, empêchant l'utilisation d'une propriété nommée exactement après l'énumération.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.