5

System.EnumクラスのMSDNドキュメントのベストプラクティスセクションによると、次のようになります。

列挙自体の状態を反映するためだけに列挙値を定義しないでください。たとえば、列挙の終わりを示すだけの列挙定数を定義しないでください。列挙の最後の値を決定する必要がある場合は、その値を明示的に確認してください。さらに、範囲内のすべての値が有効である場合は、最初と最後に列挙された定数の範囲チェックを実行できます。

私が正しく理解していれば、列挙型を次のように宣言するべきではありません。

public enum DrawOrder
{
    VeryBottom = 0,
    Bottom = 1,
    Middle = 2,
    Top = 3,
    Lowest = VeryBottom, //marks a position in the enum
    Highest = Top, //marks a position in the enum
}

なぜこれが悪い習慣と見なされるのですか?

4

4 に答える 4

2

それが悪い習慣であることに同意するかどうかはわかりません。場合によります。

Steve McConnell のCode Completeは、この構造を使用しています。(この本は使われている言語に古さを感じ始めているので、このテクニックは当時の良い習慣だったかもしれません。)

欠点は、列挙リストを更新する場合に覚えておくべき追加のことがあるということです:必要に応じHighestて and/orの値を更新しますLowest。忘れるとバグが入ります。

利点は、ループ用に記述したコードが高速で自己文書化できることです。

于 2012-09-14T18:23:20.033 に答える
2

列挙に追加VeryTop = 4する場合は、更新することを忘れないでくださいHighest

そうしないと、すべての地獄が解き放たれます。しばらく(数か月)経つと、驚くほど簡単に忘れてしまいます。

于 2012-09-14T18:24:01.783 に答える
2

これらの値は時間の経過とともに変化する可能性があるためです。プロパティを(例を使用して)に設定DrawOrder.Highestし、データベース/ドキュメント/その他のデータシンクに保存するとします。

時を経て。

コードの変更。

列挙DrawOrder型がさらにいくつかの値を取得したため、永続化されたデータの値が に等しくなくなりましたDrawOrder.Highest。これDrawOrder.Highestは、データが永続化された時点でマップされていたものと同じだけです。

この状況が問題を引き起こす可能性があると思いますか?

于 2012-09-14T18:24:24.403 に答える
1

列挙型を永続化していて、列挙型が変更される可能性がある場合、それは悪い考えだと思います。永続化していない場合、または列挙型が変更される可能性がない場合は、ほとんどの場合問題ありません。しかし、マーカーの全体的なポイントは、値が変更される可能性があるためです...したがって、実際には意味がありません.

ただし、実際に意図した列挙を使用するような構成を使用する場合は注意が必要です。Top を意味するが、代わりに Highest を使用し、後で SuperTop を追加して Highest をそれに変更する場合、元の意図はバグである可能性があります。

Marker 列挙型は、その値に関係なく、最高値または最低値を使用する場合にのみ使用する必要があります。

特定の値を意図するときにマーカーを使用するのは非常に簡単であるため、多くの人がそれを悪い習慣だと考えています。

于 2012-09-14T18:31:33.390 に答える