7

状態 (ON、OFF、READY、...) を表す値のグループがあります。これらの値も int フィールドとして DB に格納されるため、これを列挙型にするか、クラスの const int 型の束にするのがベスト プラクティスかどうか疑問に思っています。

列挙型は人間の読み取り/コーディングに自然に適合するように見えますが、値がどの整数にマップされるかが重要であるという事実を隠しているようです (または、DB から取得された値が誤った状態にインスタンス化されます)。誰かが後で入ってきて、列挙型または何かに新しい値を追加し、すべてを破棄する可能性があります。

より良いアプローチはどれですか?

4

6 に答える 6

12

enumはまだ読みやすさのための最良の選択だと思います。ただし、その値はDBに格納されるため、値を明示的に指定する必要があります。

enum State { On = 1, Off = 2, Ready = 3};
于 2012-05-15T14:10:04.103 に答える
3

誰かが新しい列挙値を新しい定数intとどのように追加するのですか?

列挙型を特定の整数値に設定できることを忘れないでください。

読みやすさを取り入れましょう!

追加のボーナスとして、強いタイピングを使用して、次のようなシェナニガンを防ぐことができるようになりました

Widget.state = 474;

474がデータベースの状態に対応していない場合。

于 2012-05-15T14:10:54.963 に答える
1

私は列挙型を使用し、列挙型がどのテーブルに対応するかが非常によく文書化されていることを確認します。

一連の const int の危険性は、型が有効な値が何であるかを示しておらず、誰かが古い値を非常に簡単に割り当てることができることです。あなたのコードの悪意のあるユーザーはキャストでそれを行うことができますが、一部の人々が自分の足で自分自身を撃つことを止めることはできません...

于 2012-05-15T14:11:38.793 に答える
1

値がめったに変更されない場合、またはコードの編集と再コンパイルに問題がない場合は、それぞれの整数値を明示的に宣言した列挙型を必ず使用してください。それ以外の場合は、データベースから値を取得するオブジェクト ラッパーを作成します (パフォーマンスが心配な場合は、値を少しキャッシュすることもできます)。次に、そのオブジェクト ラッパーを使用してすべての比較を行います。コード内の列挙型を使用してコードを更新せずにデータベース内の値が変更されないことを保証できない限り、揮発性で危険です。あなたが本当に冒険好きで、コードを発行したい場合は、それを使ってかなりクールなことを行うことができます。

于 2012-05-15T14:18:06.793 に答える
0

列挙型の値も自分で決定できます。つまり、次のようになります。

enum STATE {ON=2, OFF=9, READY=14};
于 2012-05-15T14:10:38.137 に答える
0

私は列挙型と言うでしょう。それらは、マシン形式から人間が読める形式へのオプションを提供します。このように非常によく文書化してください

///Summary
/// About State Enum
///Summary
enum State : int
{ 
    ///Summary
    /// About Off Enum Value 
    ///Summary
    Off = 0, 
    ///Summary
    /// About On Enum Value
    ///Summary
    On,
    ///Summary
    /// About Ready Enum Value
    ///Summary
    Ready
};

すべてのメンバーに値を割り当てる必要はありません。0 から開始し、残りは自動的にインクリメントされます。

あなたの列挙型はオン/オフに関するものなので、ブール値で使用できます。0 は偽またはオフを表し、1 は真またはオンを表します。

列挙型を int のように変換することもできます

int value = (int)State.On; // value will have 1 

値を int としてデータベースに保存します。取得中に、このようにすることができます

State st = (State)int.Parse(mydatabasevalue);
于 2012-05-15T14:17:21.960 に答える