我正在编写一个围绕OpenGL的小包装器,以便我可以以面向对象的方式使用它。我创建了一个名为缓冲区的类,在它的构造函数中,我希望它验证它已经针对大量GLenum类型传递的缓冲区类型。以下是代码的相关部分:
function getTimeLeft() {
var seconds_left = end_time - Math.floor(Date.now() / 1000);
if (seconds_left <= 0)
{
seconds_left = 0;
clearInterval(timer);
}
var time_left = new Date(seconds_left * 1000).toISOString().substr(11, 8);
$('#test-time-left').text(time_left);
}
var timer = setInterval(getTimeLeft, 1000);
在此代码中,Buffer::Buffer(GLenum type) {
// Validate 'type'.
switch (type) {
// *** These are the valid values ***
case GL_ARRAY_BUFFER:
case GL_ATOMIC_COUNTER_BUFFER:
case GL_COPY_READ_BUFFER:
case GL_COPY_WRITE_BUFFER:
// *** Lots more valid values here... ***
break; // Jump out of the switch statement.
default:
throw std::logic_error("Invalid GLenum 'type' in Buffer constructor.");
}
type_ = type;
target_ = target;
glGenBuffers(1, &buffer_);
}
语句将介入适当的值,并传递其他有效值,直到它突破switch
语句。所有其他值都将进入switch
子句并抛出异常。但是,我也可以使用default
声明:
if
然而,这使用了if (type != GL_ARRAY_BUFFER &&
type != GL_ATOMIC_COUNTER_BUFFER &&
type != GL_COPY_READ_BUFFER &&
type != GL_COPY_WRITE_BUFFER &&
// *** Lots more valid values here... ***
) {
throw std::logic_error("Invalid GLenum 'type' in Buffer constructor.");
}
// ...
}
的大量重复,并不一定更清楚。在执行此操作时是否存在可接受的约定,代码清晰度和速度?我是否应该验证我的输入,如果不这样做可能导致未定义的行为?
答案 0 :(得分:4)
如果有很多值,我会使用std::set
:
static std::set<int> invalidValues =
{ GL_ARRAY_BUFFER
, GL_ATOMIC_COUNTER_BUFFER
, GL_COPY_READ_BUFFER
, GL_COPY_WRITE_BUFFER
// ...
};
if(invalidValues.find(type) != invalidValues.end()) {
throw std::logic_error("Invalid GLenum 'type' in Buffer constructor.");
}
这将有助于提高速度和提高可读性。
我是否应该验证我的输入,如果不这样做可能导致未定义的行为?
您的程序中永远不需要未定义的行为。你不能依赖它会导致异常(崩溃)等。