这是一个非常简单的问题,但我真的很想知道什么是好的做法。
我有一个包含日志记录子系统的系统。日志包含有关用户ID的信息。简化的日志记录如下:
log.RegisterEvent(eventType, userID, eventDetails);
某些事件是系统事件,但它们没有关联userID。由于用户ID是正整数,我认为0意味着事件不会给用户:
log.RegisterEvent(eventType, 0, eventDetails);
但是把0放在那里只是......不对。我想过使用枚举,比如:
enum UserID
{
None = 0
}
但是只有一个值的枚举可以吗? 最好使用静态常量? 或者它是另一种更好的方式?
答案 0 :(得分:8)
“用户ID”对我来说听起来不像是一种自然的枚举。这并不像全球范围内有一组天生的用户。
恒定值会更有意义:
const long UnknownUserId = 0;
有是的情况,其中具有单个值的枚举是有意义的,但它几乎总是用于未来的扩展。
答案 1 :(得分:5)
最好使用常量 - 否则你必须在使用时强制转换枚举值,因为API确实需要一个数字。枚举用于封闭的值集,用户ID不属于此类别。
答案 2 :(得分:3)
我不喜欢你的枚举,因为大多数开发人员都不会期望使用(UserIDEnum)42
,因为它不是"定义的"枚举类型的值。
还有一个"魔法"常数不是很吸引我。
对于可以为空的类型来说,这似乎是一个明显的例子,即int?
(也称为Nullable<int>
)。大多数开发人员都会理解,如果int?
为空(HasValue
为false),则表示没有用户ID,如果是42,则表示该用户ID。
因此,请将第二个参数更改为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>
答案 3 :(得分:1)
将用户变量声明为static const:
static const int NoneUserID = 0;
答案 4 :(得分:1)
更改日志记录子系统以定义不带用户ID的重载。
在那个重载中你可以只编码0,因为它现在是唯一可以使用的地方。
答案 5 :(得分:0)
是的,当没有多样性时,使用枚举是什么。