列挙型命名規則-複数


267

列挙型と一致するプロパティのC#命名規則で似ているが正確ではないにもかかわらず、私はこの質問をしている

enumに複数の名前を付け、それらを単数形として「使用」する傾向があることがわかりました。例:

public enum EntityTypes {
  Type1, Type2
}

public class SomeClass {
  /*
    some codes
  */

  public EntityTypes EntityType {get; set;}

}

もちろんそれはうまくいき、これは私のスタイルですが、誰かがそのような慣習で潜在的な問題を見つけることができますか?「ステータス」という言葉を使った「醜い」ネーミングがあります。

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

public class SomeClass {
  /*
    some codes
  */

  public OrderStatuses OrderStatus {get; set;}

}

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

すべての列挙型プロパティ(「ステータス」など)を「MyStatus」として公開することはできません。

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

質問の言い換え:

ええと、私はこの方法で質問をする必要があると思います:誰かが列挙型に名前を付ける優れた一般的な方法を使用して、列挙型「インスタンス」の命名がかなり簡単になるようにすることができますか?


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

回答:


333

マイクロソフトはEnumEnumがビットフィールドを表す場合を除いて、sに単数形を使用することをお勧めします(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; }
}

20
はい、これは正解です。このガイドラインは、.Netフレームワークで使用されます。たとえば、列挙型DayOfWeekやフラグ列挙型RegexOptionsなどです。
Alexander Zwitbaum、2009

1
はい、これは推奨される方法です。私はそれを歓迎します。しかしそれは私の質問に答えません。
okw 09/10/09

1
@okwはさらに複雑になりますが、見苦しく見えますが、フラグ列挙型から単一の値が必要な場合は、field / property / argumentに単数形を使用してください。複数のフラグを設定してサポートする場合は、複数を使用してください。列挙型がフラグ列挙型でない場合は、型名とフィールド/プロパティ/引数に単数形を使用します。
ジョナサンディキンソン

4
これは回答でリンクされているMicrosoft命名規則ガイドの.Net 4.0バージョンへのリンクです。

1
@Thomas問題が発生したことがないので、なぜ機能しないのかわかりません。型と変数のどちらが参照されていても、あいまいになるコンテキストはありません。つまりOrderStatus == OrderStatus.Pending、左側の変数として認識され、次に右側の列挙型として認識されます
James Hurley

39

私は複数形で列挙型の名前を付け始めましたが、その後単数形に変更しました。どこで使用されているかを考えると、もっと意味があるようです。

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

次と比較:

Statuses myStatus = Statuses.Ready;

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


6
少し遅い反応(そしておそらく少し話題から外れています)が:0不明な値に値を使用することをお勧めしますUnknown。そのようにして、初期化されていない変数はデフォルトです。
SvenL 2016年

同意し、@ SvenL。それに応じて例を更新しました。
Bob Kaufman

本当に[Flags]あなたの例に属性を入れますか?ステータスが「未完了」と「準備完了」の両方であることは意味がありません。もしあればenum [Flags]Steps { First, Second, Third }、本当に変数に名前を付けますcompletedStepか?
パックマン2018

26

状況が実際に複数に当てはまることはありません。

enum何かまたは他の属性を示します。例を挙げましょう:

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

タイプは1つでもかまいませんが、複数ではなく複数で考えてみてください。

Humour.Irony | Humour.Sarcasm

のではなく

Humours { Irony, Sarcasm }

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


5
ハハ、まあ、プログラマーは必ずしも文法的/政治的に正しいとは限りません。あなたの場合、私はおそらく「HumourTypes」を使うでしょう。悪い癖だと思います。
okw 09/10/09

皮肉の感覚を持っている、または皮肉の感覚を持っているすべての個人を検索したい場合、私は検索ルーチンにHumours包含のインスタンスを渡さないでしょうHumours.Irony | Huomours.Sarcasmか?
Charles Bretana 2014

14

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

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

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

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

確かに、私の方法は、列挙型を使用するときに名前を考える必要を回避する「迅速で怠惰な」方法だと思います。
okw 09/10/09

1
あなたの答えを支持するために:MSDN のセクション「プロパティの名前」のタイプメンバーの名前から:プロパティにそのタイプと同じ名前を与えるCONSIDER例: public Color Color { get {...} set {...} }
DavidRR 2017

10

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

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


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

誰がenumと何がインスタンスであるかを混同することは決してありません。


2
私はクラスと列挙型に同じ名前を付けた後、列挙型の命名規則を探してここに来ました-そしてそれをより明確にするために「何か」を持ちたかったのです。インターフェースの前に「I」を付けるように、「E」(明らかにEnumsの場合)を前に付けることを考えていましたが、私はあなたのソリューションHeatherが気に入りました!良いですね!!!
スコット

1
Microsoftの設計ガイドライン:「列挙型の名前には「Enum」サフィックスを使用しないでください。」docs.microsoft.com/en-us/dotnet/standard/design-guidelines/...
Thorynホーレー

3
たぶん、私が言ったことの非常に最初の文を見逃したのですか?ここで、それをコピーして貼り付けさせてください:「これは私が慣習に反対するのに十分反対する数少ない場所の1つです。」次に、その理由を説明します。
ヘザー

2
私は「あらゆる方法で」ガイドラインに反対するつもりはありません。それは誇張です。私は単一の特定の方法でガイドラインに反対します。これは、私が述べた推論によってサポートされています。同意しない場合は、同意しない理由を記入してください。あなたの誇張は不要であり、あなたの立場を前進させません。
ヘザー

1
名前空間の衝突が発生する可能性がある場合、Enum?を追加しても問題はありません。それは、作成者がすべての変数をそのタイプで後置することを提案しているようではありません。著者は理由が提供されていることを考えるとはるかに強力なケースを持っていますが、M $はゼロの正当化を提供します。
Jai Govindani、

7

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

    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の推奨を無視し、列挙名にプレフィックスまたはサフィックスを使用します。

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

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

2
架空の状況であり、適切な解決策ではありません。なぜenum最初にネストを使用し、問題が発生する場合はさらに別のクラスにネストするのですか?
Gert Arnold、

1
Genderの場合、プロパティ名をとしてGender、列挙名をとして持つ方がはるかに意味がありますSex。したがって、isac.Gender = Sex.Male..
nawfal 2013年

3
なぜこの男が反対票を投じられているのかはわかりません。この状況は正当であり、仮説にはほど遠いものです。Javaで内部クラスを使用するのと同じような理由でC#で列挙型をネストします...内部タイプは外部でのみ使用され、他では使用されないため、外部のコンテキストでのみ意味があり、他では使用できません。コンパイラの制限の結果として、言及されたソリューションの1つを選択する必要があります。
Nathan Pitman 2013

あなたはそれをどこかから、通常はクラスの外から、またはおそらくクラスを構築するときに設定する必要があります。人だけではなく、入れ子にしないことがとにかく最善の解決策だと思います。
ジムウォルフ

2
別の、おそらくより良いオプションは、「Serge-appTranslator」からの回答です。
Curtis Yallop

6

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


5

少し遅れて来ています...

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

enum定義をクラスの外に置きます。これにより、enumとプロパティに同じ名前を付けることができます。

public enum EntityType { 
  Type1, Type2 
} 

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

}

この場合、私はMSガイドリンに従い、列挙型に単一の名前を使用します(フラグには複数)。これは最も簡単な解決策です。

別の質問の)私の問題は、列挙型がクラスのスコープで定義されており、列挙型の直後に名前が付けられたプロパティを使用できない場合です。


0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.