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


93

私は自分のステータスプロパティを列挙型として保持するクラスを実装していることがよくあります。Status列挙型とStatus型のONE Statusプロパティがあります。この名前の競合を解決するにはどうすればよいですか?

public class Car
{
  public enum Status
  {
    Off,
    Starting,
    Moving
  };

  Status status = Status.Off;

  public Status Status // <===== Won't compile =====
  {
    get { return status; }
    set { status = value; DoSomething(); }
  }
}

Status列挙型がさまざまなタイプに共通である場合、それをクラスの外に置いて問題を解決します。ただし、ステータスは車にのみ適用されるため、クラス外で列挙型を宣言することは意味がありません。

この場合、どの命名規則を使用しますか?

注意:この質問は、この質問の回答のコメントで部分的に議論されました。それがなかったので、メインの問題、それは多くの可視性を取得できませんでした。

編集:Filip Ekbergは、「ステータス」の特定のケースに対してIMOの優れた回避策を提案しています。それでも、Michael Preweckiの回答のように、列挙型/プロパティの名前が異なるソリューションについて読むのは興味深いでしょう。

EDIT2(2010年5月):私のお気に入りの解決策は、Chris Sの提案に従って列挙型の名前を複数形にすることです。MSのガイドラインによると、これはフラグ列挙型にのみ使用する必要があります。しかし、私はそれをますます好きになりました。現在は通常の列挙型にも使用しています。


1
enumをクラス内にネストしたい場合、これに対する多くの良い解決策はないと思います。私は実際には列挙型を分離することを好んでいますが、問題はありませんが、ネストすることについて哲学的にあなたの主張を見ることができます。
クレイグ・シアラー

回答:


32

私は1ユーロをディスカッションに追加しますが、おそらく新しいことは何も追加していません。

明らかな解決策は、StatusをネストされたEnumから移動することです。ほとんどの.NET列挙型(おそらくWindows.Forms名前空間の一部を除く)はネストされていないため、APIを使用する開発者がクラス名にプレフィックスを付ける必要があるため、使用が面倒です。

言及されていないことの1つは、MSDNガイドラインによるフラグ列挙型は、おそらくすでに知っている複数形の名詞であることです(ステータスは単純な列挙型なので、単数名詞を使用する必要があります)。

状態(列挙型は状態と呼ばれます)は呼応的です。「ステータス」は、英語のように英語がラテン語から吸収された名詞の主格です。動詞は名詞にその状態を表す名前であり、主格は動詞の主語です。

つまり、言い換えると、車が動いているとき、それが動詞です。動いていることがそのステータスです。しかし、車は止まらず、エンジンも止まります。エンジンも起動しません(ここで例を選択したので、これは関係ないかもしれません)。

public class Car
{
  VehicleState _vehicleState= VehicleState.Stationary;

  public VehicleState VehicleState 
  {
    get { return _vehicleState; }
    set { _vehicleState = value; DoSomething(); }
  }
}

public enum VehicleState
{
    Stationary, Idle, Moving
}

状態はそのような一般化された名詞ですが、それがどの状態を参照しているのかを説明した方がいいのではないでしょうか。上記のように

私のビューでもタイプの例はリーダーのタイプではなく、データベースを参照しています。リーダーのタイプに必ずしも関連しないリーダーのデータベース製品を説明している場合は、それをお勧めします(たとえば、リーダーのタイプは転送のみ、キャッシュなど)。そう

reader.Database = Databases.Oracle;

列挙型を使用する代わりにドライバと継承チェーンとして実装されているため、実際にはこれは決して発生しません。そのため、上の行は自然に見えません。


24
私の理解では、フラグは単純な列挙型ではなく、複数形にする必要があります。
Serge Wautier、2009年

8
enumをクラスから移動することについては、CarStateがCar.Stateよりも便利な理由をまだ理解していません。ただし、この列挙型がこのクラスの動作のみを説明している場合、クラスから列挙型を取得することのプラス面は理解できません。
Serge Wautier、2009年

FileOptionsのような名詞句は名詞だけではなく、書くべきだったので、答えを更新しました。私はclassname.Enumは単なる設定だと思います-フレームワークで私がコピーしたものの例を見つけることができません。
クリスS

MSはフラグは複数形にしておくべきだと言っていますが、時間の経過とともに、その解決策はますます好きになりました。列挙型にも使用しています。したがって、私は考えを変えて、フィリップの代わりにあなたの答えを受け入れました。
Serge Wautier、2009年

1
私はここで1年半遅れていることを知っていpublic class EngineStateますpublic enum EngineStateが、例の中にあるはずですよね?
デビッドマードック

36

「オフ」、「開始」、「移動」の定義は、私が「状態」と呼ぶものです。そして、あなたが「状態」を使用していることを示唆しているとき、それはあなたの「ステータス」です。そう!

public class Car
{
  public enum State
  {
    Off,
    Starting,
    Moving
  };

  State state = State.Off;

  public State Status
  {
    get { return state ; }
    set { state= value; DoSomething(); }
  }
}

この例のように、「タイプ」という単語を使用したい場所から別の例を取り上げると、次のようになります。

public class DataReader
{
    public enum Type
    {
        Sql,
        Oracle,
        OleDb
    }

    public Type Type { get; set; } // <===== Won't compile =====

}

enumとenumには違いがあることを本当に理解する必要がありますよね?しかし、フレームワークを作成したり、アーキテクチャについて話したりするときは、類似点に焦点を当てる必要があります。それでは、それらを見つけましょう。

何かが状態に設定されると、それは「もの」ステータスとして定義されます

例:車のステータスがRunning状態、Stopped状態などです。

2番目の例で達成したいのは、ややこれです。

myDataReader.Type = DataReader.Database.OleDb

これは、私が他の人に説教してきたことに対して、基準に従う必要があると言っていると思うかもしれません。しかし、あなたは標準に従っています!Sqlケースも特定のケースであるため、いくぶん具体的なソリューションが必要です。

ただし、列挙型はSystem.Dataスペース内で再利用でき、それがパターンのすべてです。

「タイプ」で調べる別のケースは、タイプが種を定義する「動物」です。

public class Animal
    {
        public enum Type
        {
            Mammal,
            Reptile,
            JonSkeet
        }

        public Type Species{ get; set; }

    }

これはパターンに従っており、このためにオブジェクトを「知る」必要は特になく、「AnimalType」または「DataReaderType」を指定していない場合は、選択したネームスペースで列挙型を再利用できます。


1
「ステータス」の名前はほんの一例だと思います。ステータス/状態に依存できない他の状況についてはどうですか?たとえば、タイプ列挙型...
Dan C.

そのシナリオ例を教えていただけますか?その病気に応じて私の答えを拡大しようとする病気:)
Filip Ekberg

2
@Filip:動物タイプのサンプルは、最初のコメントで私が何を意味していたかを正確に指摘しています。つまり、これは列挙型のほとんどの「言い換え」です。enumとプロパティ名の同義語を使用すると、コードがやや混乱します。
Dan C.

1
また、「種」はタイプの言い換えにすぎません(この場合、動物の場合)。
LegendLength 2009年

2
単純に名前を変更することは必ずしもクリーンではありません。たとえば、列挙型のSuitとプロパティSuitを使用したトランプのクラスを考えてください-名前を正確に何に変更しますか?どちらの方法でも不器用。
アナカタ

9

ここでの本当の問題は、列挙型のStatusがクラス内にカプセル化されてCar.Statusいるため、プロパティStatusと列挙型の両方にあいまいであることですStatus

さらに、列挙型をクラスの外に置きます。

public enum Status
{
    Off,
    Starting,
    Moving
}

public class Car
{
    public Status Status
    { ... }
}

更新

以下のコメントのために、上のデザインについて説明します。

私は、列挙型、クラス、またはその他のオブジェクトが別のクラス内に存在する必要があるとは信じていません。たとえば、上記の例を見てみましょう。

public class Car
{
    public enum Status
    {...}
    ...
    public Status CarStatus { get; set;}
}

一部のコメンターは、StatusはCarクラスの範囲外では意味がないと主張しますが、パブリックプロパティを設定しているという事実は、その列挙型使用するプログラムの他の部分があることを意味します。

public Car myCar = new Car();
myCar.CarStatus = Car.Status.Off;

そして私にとってそれはコードのにおいです。私はその状況を見に行くよ場合はCar、私もそれを定義することができますにも。

そのため、おそらく次のように名前を変更します。

public enum CarStatus
{...}

public class Car
{
    ...
    public CarStatus Status { get; set; }
}

ただし、その列挙型が車のクラス内でのみ使用される場合は、そこで列挙型を宣言しても問題ありません


それはステータスをグローバルにするでしょう、あなたはそれを特定のエリアのちょうど中に持ちたいかもしれません。「Human」などの他のタイプの「Status」には「Starting」がない場合があります。ただし、パターンに従う必要があります。
フィリップエクベリ

いいえ彼はスポットを当てています。enumは、99%のケースで、プロパティに使用する同じ単語です。列挙型は、それが(ロジックを含むクラスとは違って)生きて外にはほとんど害を行いますので、ちょうど名前のフラグである
Quibblesome

ジョン、これはまさに私のポイントです。Status列挙型はCarに関してのみ意味があります。まったく異なるタイプのオブジェクトは、まったく異なるステータスになります
セルジュワウティエ2009年

ただし、名前空間は異なるため、問題はありません
Chris S

車の外で見たいという説明は理にかなっています。しかし、私の場合、2つのクラスがORありCRます。どちらにも独自の状態セットがあるため、独自のスコープ外で定義することはできません。
deed02392 2013

4

私の提案が.NETの命名規則に反することは知っていますが、個人的には列挙型に 'E'を、列挙型フラグには 'F'をプレフィックスとして付けます(インターフェイスに 'I'をプレフィックスする方法と同様)。なぜこれが慣習ではないのか、私には本当にわかりません。Enums / Flagsは、インターフェイスのようにタイプを変更しない特別なケースです。プレフィクスは他のほとんどのタイプ/変数/などをフィルターにかけるため、インテリセンスで入力するのは非常に簡単です。また、これらの名前の衝突もありません。

また、WPFの例では、型のインスタンスが事前定義されている列挙型(FontWeightsなど)のような静的クラスを使用するが、検索しないとわからないという別の問題も解決されます。それらに 'E'のプレフィックスを付けただけの場合、これらの特別な静的クラスを見つけるには、文字を入力するだけです。


4

ハンガリー語の表記法とその変形の嫌悪者はのろわれます。列挙型のサフィックスの規約を使用します-それを待つ- Enum。その結果、私はあなたが説明する問題を抱えることは決してなく、それらを何と呼ぶか​​について心配する時間を浪費し、コードは読みやすく、起動時に自己記述的です。

public class Car
{
  public enum StatusEnum
  {
    Off,
    Starting,
    Moving
  };

  public StatusEnum Status { get; set; }

}

9
Microsoftの慣習というかかわらず注意してください列挙型に名前を付けるには:言うX DOではない 列挙型の名前で、「列挙型」の接尾辞を使用しています。
DavidRR 2014年

2
マイクロソフトの慣習が時の試練に耐えることが証明されているので。
nathanchere

2

プロパティの名前を「CurrentStatus」のようなものに変更します。簡単なクイック:)


1

タイプ名(またはビットフラグが含まれている場合はフラグ)に「オプション」を追加することをお勧めします。つまり、タイプはCar.StatusOptionで、プロパティはCar.Statusです。

複数化と比較すると、これにより、通常は列挙ではなくコレクションプロパティを複数化したい、列挙型のコレクションを作成する際の名前の衝突が回避されます。


0

私は通常、列挙型の前に付けます(例:CarStatus)。それはすべて、あなたが作業しているチーム(そのようなものに対するルール/プロセスがある場合)とオブジェクトの使用法に依存すると思います。ちょうど私の2セント(:


1
これは実際には、MyObjectNameがStatusの前にあるネーミング規則を強制終了します。
Filip Ekberg、

とにかく、クラスの名前空間はこれに対処するのに十分でなければなりませ
アナカタ2009年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.