代码样式 - 如何针对许多可能的值验证整数?

时间:2017-02-17 16:46:20

标签: c++ validation opengl enums

我正在编写一个围绕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."); } // ... } 的大量重复,并不一定更清楚。在执行此操作时是否存在可接受的约定,代码清晰度速度?我是否应该验证我的输入,如果不这样做可能导致未定义的行为?

1 个答案:

答案 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.");
}

这将有助于提高速度和提高可读性。

  

我是否应该验证我的输入,如果不这样做可能导致未定义的行为?

您的程序中永远不需要未定义的行为。你不能依赖它会导致异常(崩溃)等。