我听说了故事的两端。一种观点认为,使用数值变量的特殊值来表示特殊状态是一种设计缺陷。但是,我一直遇到这种行为。
一个例子是一个字节无符号整数,其中值 255 表示缺少信息。
这是一个不好的做法吗?如果是这样,在什么特殊情况下是允许/鼓励的?
我听说了故事的两端。一种观点认为,使用数值变量的特殊值来表示特殊状态是一种设计缺陷。但是,我一直遇到这种行为。
一个例子是一个字节无符号整数,其中值 255 表示缺少信息。
这是一个不好的做法吗?如果是这样,在什么特殊情况下是允许/鼓励的?
这在很大程度上取决于情况;一如既往,力求用最简单、最容易理解的方式写东西。希望异常情况处理不会弄乱正常情况的代码(这是异常背后的想法,但它们会造成自己的混乱......)。
选择用于特殊情况的值时要小心。例如,C/Unix 约定使用了很多,但请确保使用“不可能”的值。因此,getchar(3)
返回一个字符代码作为int
,但返回一个非字符EOF
作为文件结尾。类似地,read(2)
返回读取的字符数(如果没有要读取的内容,则可能为 0),或错误时返回 -1。
这绝对不是一个不好的做法,假设您负担得起,即可表示整数的范围有足够的额外值,您永远不需要在现实生活中使用。
例如,如果您需要完整范围的无符号字节,包括 255,那么给 255 赋予“未知”的新含义将是一个问题。如果 255 从未用于“真实”数据,那么您可以随意为其赋予任何您想要的含义。
然而,问题是在整个代码中使用特殊数字而不给它们分配特殊名称。例如,
if (myByte == 255) {
// Process the situation when the value is unknown
}
无疑是坏的。您应该命名所有特殊常量,并在整个代码中仅使用这些名称:
if (myByte == UNKNOWN_VALUE) {
// You can skip the comment about processing an unknown value:
// the name of the constant tells your readers what's going on.
}