我应该对以整数命名的东西使用枚举吗?

Should I use enums for things that are named after integers?

本文关键字:枚举 整数 我应该      更新时间:2023-10-16
enum D6value {
    one = 1,
    two = 2,
    three = 3,
    four = 4,
    five = 5,
    six = 6 };
bool IsCriticalHit(D6value roll);

我喜欢这个,因为它可以更好地记录函数参数。

我不喜欢这样,因为这是我梦寐以求的东西,它让我觉得很聪明——这通常是我在后悔之前的感觉。

这是不好的作风吗?

如果调用者可能有一个类型D6Value的值(无论是硬编码的还是运行时变量(在调用IsCriticalHit时使用,那么你就可以有效地在编译时强制执行函数参数的正确性:并不是说你不能绕过它并传递一个超出范围的值,但你不太可能意外地做到这一点。 这可能是值得的。

与此相反,它调用者有他们想要传入的int,然后他们将不方便将它们投射到D6Value,无论int是否在16范围内,这都将起作用。 如果IsCriticalHit放弃防御性编码(检查滚动在范围内(,因为天真地期望enum总是强制执行正确性,那么你的情况比你使用int和防御性编码实践更糟糕。 它也很冗长,对于其他开发人员来说,这是一件额外的事情。

您还应该考虑要对D6Value对象执行的操作集:使用枚举时,不会提供某些运算符(例如 +=(D6Value) (和像+这样的操作会产生可能不在类型隐含one中的结果。six范围(和 C++11 之前(如果实现选择位太少的表示形式,则可能会换行;C++11 默认为 int 作为基础类型(。