enum D6value {
one = 1,
two = 2,
three = 3,
four = 4,
five = 5,
six = 6 };
bool IsCriticalHit(D6value roll);
我喜欢这个,因为它可以更好地记录函数参数。
我不喜欢这个,因为这是我梦寐以求的东西,它让我觉得很聪明 - 这通常是我在后悔之前的感受。
这是不好的风格吗?
答案 0 :(得分:1)
如果调用者可能在调用D6Value
时使用IsCriticalHit
类型的值(无论是硬编码还是运行时变量),那么您可以有效地获得编译时强制执行函数参数的正确性:并不是说你不能破解它并传递超出范围的值,但你不太可能意外地做到这一点。这可能是值得的。
反驳说,来电者有int
他们想要传入的内容,然后他们会将这些信息投放到D6Value
,这无论是否int
都会有效。 }}位于1
到6
范围内。如果IsCriticalHit
由于天真地期望enum
始终强制执行正确性而放弃防御性编码(检查滚动在范围内),那么比您使用int
时更糟糕s和防御性编码实践。对于其他开发人员来说,这也是一个冗长而且额外的事情。
您还应该考虑要对D6Value
个对象执行的操作集:使用您的枚举,某些运算符无法提供(例如+=(D6Value)
)和像+
这样的操作产生的结果可能不在类型隐含的one
.. six
范围内(而且在C ++ 11之前,如果实现选择了一个表示,则可以包装几个位; C ++ 11默认为int
作为基础类型。)