我应该对以整数命名的事物使用枚举吗?
Should I use enums for things that are named after integers?
enum D6value {
one = 1,
two = 2,
three = 3,
four = 4,
five = 5,
six = 6 };
bool IsCriticalHit(D6value roll);
我喜欢这个,因为它可以更好地记录函数参数。
我不喜欢这个,因为这是我的梦想,它让我觉得自己很聪明——这通常是我在后悔之前的感觉。
这种风格不好吗?
如果调用者可能有一个 D6Value
类型的值(无论是硬编码的还是 运行-time 变量)在调用 IsCriticalHit
时使用,那么你可以有效地编译- 函数参数正确性的时间强制执行:并不是说你不能绕过它并传递一个超出范围的值,但你不太可能不小心这样做。这可能是值得的。
与此相反,调用者有 int
想要传入,然后他们会很不方便地将它们转换为 D6Value
,无论是否 [=12] =] 在 1
到 6
范围内。如果 IsCriticalHit
由于天真地期望 enum
总是强制执行正确性而放弃防御性编码(检查卷在范围内),那么你的情况比使用 int
更糟并且防御性编码实践。它也很冗长,是其他开发人员需要解决的额外问题。
您还应该考虑要对 D6Value
对象执行的一组操作:对于您的枚举,将不会提供某些运算符(例如 +=(D6Value)
)和类似的操作+
产生的结果可能不在类型隐含的 one
..six
范围内(以及 C++11 之前的版本,如果实现选择的位数太少,可能会换行; C++11 默认为 int
作为基础类型)。
enum D6value {
one = 1,
two = 2,
three = 3,
four = 4,
five = 5,
six = 6 };
bool IsCriticalHit(D6value roll);
我喜欢这个,因为它可以更好地记录函数参数。
我不喜欢这个,因为这是我的梦想,它让我觉得自己很聪明——这通常是我在后悔之前的感觉。
这种风格不好吗?
如果调用者可能有一个 D6Value
类型的值(无论是硬编码的还是 运行-time 变量)在调用 IsCriticalHit
时使用,那么你可以有效地编译- 函数参数正确性的时间强制执行:并不是说你不能绕过它并传递一个超出范围的值,但你不太可能不小心这样做。这可能是值得的。
与此相反,调用者有 int
想要传入,然后他们会很不方便地将它们转换为 D6Value
,无论是否 [=12] =] 在 1
到 6
范围内。如果 IsCriticalHit
由于天真地期望 enum
总是强制执行正确性而放弃防御性编码(检查卷在范围内),那么你的情况比使用 int
更糟并且防御性编码实践。它也很冗长,是其他开发人员需要解决的额外问题。
您还应该考虑要对 D6Value
对象执行的一组操作:对于您的枚举,将不会提供某些运算符(例如 +=(D6Value)
)和类似的操作+
产生的结果可能不在类型隐含的 one
..six
范围内(以及 C++11 之前的版本,如果实现选择的位数太少,可能会换行; C++11 默认为 int
作为基础类型)。