4

これは非常に単純な質問ですが、良い習慣とは何かを知りたいと思っています。

ログサブシステムを含むシステムがあります。ログには、ユーザー ID に関する情報が含まれています。簡略化されたロギングは次のようになります。

log.RegisterEvent(eventType, userID, eventDetails);

一部のイベントはシステム イベントであり、ユーザー ID が関連付けられていません。ユーザー ID は正の整数であるため、0 はイベントがユーザーを参照していないことを意味すると考えます。

log.RegisterEvent(eventType, 0, eventDetails);

しかし、そこに0を置くのは...正しくありません。次のような列挙型を使用することを考えました。

enum UserID
{
    None = 0
}

しかし、値が 1 つしかない列挙型を使用しても問題ないでしょうか? 静的定数を使用する方が良いですか? それとも別のより良い方法ですか?

4

6 に答える 6

8

「ユーザー ID」は、私には自然な種類の列挙型のようには聞こえません。世界中に自然に制限された一連のユーザーが存在するわけではありません。

定数値の方が理にかなっています。

const long UnknownUserId = 0;

単一の値を持つ列挙型が理にかなっている場合もありますが、ほとんどの場合、将来の拡張に使用されます。

于 2012-08-08T09:56:15.860 に答える
5

定数を使用することをお勧めします。それ以外の場合は、API が実際に数値を想定しているため、使用時に列挙値をキャストする必要があります。列挙型は閉じた値のセットであり、ユーザー ID はこのカテゴリに属しません。

于 2012-08-08T09:56:06.220 に答える
3

(UserIDEnum)42列挙型の「定義された」値ではないため、ほとんどの開発者はそれが使用されることを期待しないため、列挙型は好きではありません。

また、「魔法の」定数というアイデアは、私にはあまり魅力的ではありません。

これは、null 許容型、つまりint?( とも呼ばれNullable<int>ます) の明らかなケースのようです。ほとんどの開発者は、int?が null (HasValueが false) の場合はユーザー ID がないことを意味し、42 の場合はそれがユーザー ID であることを理解しています。

したがって、2 番目のパラメーターを type に変更しますint?。呼び出しは次のようになります。

log.RegisterEvent(eventType, null, eventDetails);    // no user ID in this case
log.RegisterEvent(eventType, userID, eventDetails);  // variable userID is automatically "lifted" from int to Nullable<int>
于 2012-08-08T12:16:41.200 に答える
1

ユーザー変数を static const として宣言します。

static const int NoneUserID = 0;
于 2012-08-08T09:56:51.743 に答える
1

ロギング サブシステムを変更して、ユーザー ID を取らないオーバーロードを定義します。

そのオーバーロードでは、使用される唯一の場所であるため、0 をコーディングするだけでかまいません。

于 2012-08-08T09:58:19.007 に答える
0

はい、そこに多様性がない場合、列挙型は何に使用されますか。

于 2012-08-08T09:56:05.043 に答える