web-dev-qa-db-ja.com

列挙命名規則-複数

列挙型と一致するプロパティのC#命名規則

私は列挙型を複数形で命名し、それらを単数形として「使用する」傾向があることがわかりました、例:

public enum EntityTypes {
  Type1, Type2
}

public class SomeClass {
  /*
    some codes
  */

  public EntityTypes EntityType {get; set;}

}

もちろん動作し、これが私のスタイルですが、そのような慣習に潜在的な問題を見つけることができる人はいますか?ただし、「ステータス」という単語で「ugい」名前を付けています。

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

public class SomeClass {
  /*
    some codes
  */

  public OrderStatuses OrderStatus {get; set;}

}

追加情報:私の質問が十分に明確ではなかったのかもしれません。定義済みの列挙型の変数に名前を付けるとき、よく考える必要があります。私はベストプラクティスを知っていますが、これらの変数に名前を付けるという仕事を楽にするのに役立ちません。

すべての列挙型プロパティ(たとえば "Status")を "MyStatus"として公開することはできません。

私の質問:上記の私の慣習に関する潜在的な問題を誰でも見つけることができますか? ベストプラクティスではありません。

質問の言い換え:

さて、私はこの方法で質問をする必要があると思います:誰かが列挙型を命名する良い一般的な方法を出して、使用されたときに列挙「インスタンス」の命名が非常に簡単になるでしょうか?

231
o.k.w

Microsoftは、Enumがビットフィールドを表す場合を除き、Enumsに単数形を使用することをお勧めします( FlagsAttribute も使用します)。 列挙型の命名規則 (Microsoftの 命名ガイドライン のサブセット)を参照してください。

あなたの説明に対応するために、私は次のいずれかに問題はないと思います。

public enum OrderStatus { Pending, Fulfilled, Error };

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

または

public enum OrderStatus { Pending, Fulfilled, Error };

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

列挙型の名前を複数形で始めましたが、その後単数形に変更しました。それらがどこで使用されているのかという文脈では、より理にかなっているようです。

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

と比較:

Statuses myStatus = Statuses.Ready;

文脈上、単数形はより自然に聞こえます。 1つの場所で発生するenumを宣言するとき、「これは何かのグループ」と考えていますが、おそらく多くの場所でそれを使用するとき、「これは1つのもの」と考えていることに同意します。

32
Bob Kaufman

状況が複数形に実際に適用されることはありません。

enumは、何らかの属性を示します。例を挙げます。

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

1つのタイプを使用できますが、複数ではなく複数で考えてみてください。

Humour.Irony | Humour.Sarcasm

のではなく

Humours { Irony, Sarcasm }

あなたにはユーモアのセンスがあり、ユーモアのセンスはありません。

22
Kyle Rozendo

一般に、[Flags]属性が付加された列挙型(したがってビットフィールドを含むことができる)は複数である必要があることを除いて、ベストプラクティスの推奨事項は単数形です。

編集した質問を読んだ後、プロパティ名または変数名は列挙型名と異なる必要があると思うかもしれません...そうではありません。以下は完全に問題ありません...

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

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

これは私がそれに反対するのに十分なコンベンションに同意しない数少ない場所の1つです。 TBH、私は、列挙型の定義とそのインスタンスが同じ名前を持つことができることを嫌います。すべての列挙型に「Enum」を後置します。これは、特定の使用法でのコンテキストが明確になるためです。 IMOはコードをより読みやすくします。

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


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

列挙型とそのインスタンスを混同することはありません。

10
Heather

ベストプラクティス-単数形を使用します。列挙を構成するアイテムのリストがあります。 Versions.1_0と言うと、リスト内のアイテムを使用すると奇妙に聞こえます。 1_0バージョンは1つしかないため、Version.1_0と言う方が理にかなっています。

6
Jeremy Cron

次のような簡単でありながら禁止されたコードを記述しようとしている場合:

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

オプションは次のとおりです。

  1. MSの推奨事項を無視して、enum名にプレフィックスまたはサフィックスを使用します。

    public class Person
    {
        public enum GenderEnum
        {
            Male,
            Female
        }
        public GenderEnum Gender { get; set; }
    }
    
  2. クラスの外側、できれば別のクラスに列挙定義を移動します。上記の簡単な解決策は次のとおりです。

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

少し遅れて...

あなたの質問と質問との間には重要な違いがあります あなたが言及 (私は尋ねました;-):

クラスから列挙定義を配置すると、列挙とプロパティに同じ名前を付けることができます。

public enum EntityType { 
  Type1, Type2 
} 

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

}

この場合、MSガイドリンに従い、enumに単数名を使用します(フラグには複数形)。 probabyが最も簡単なソリューションです。

私の問題( 他の質問 )は、enumがクラスのスコープで定義され、enumの直後に指定されたプロパティを使用できないことです。

4
Serge Wautier

他のスレッドで 列挙型と一致するプロパティのC#命名規則 誰かが私が非常に良い考えだと思うことを指摘しました:

「私の提案は.NETの命名規則に反することは知っていますが、個人的に列挙型には「E」を、列挙型フラグには「F」を付けます(インターフェイスに「I」を付ける方法に似ています)。

0
RenniePet