将验证输入变量的代码块移动到另一个函数的最佳方法

时间:2018-03-28 02:59:37

标签: javascript node.js refactoring

我有这样的代码:

function doSomething (inputVar, callback) {
  // Input variables validation
  if (inputVar === 'malformed input') {
    callback(new Error('malformed input'))
    return // prevent the rest of the function from being executed
  }

  console.log("You shouldn't see this message when something goes wrong with the validation.")
  // do other operations
  callback(null)
}

将验证输入变量的代码移动到另一个函数以使doSomething()看起来更干净,更优雅的最佳方法是什么?

以下代码中的return不会阻止执行console.log('You shouldn\'t see this message when something goes wrong with the validation.')。我无法以这种方式包装验证码。

function inputValidation (inputVar, callback) {
  if (inputVar === 'malformed input') {
    callback(new Error('malformed input'))
    return // This line doesn't prevent the rest of the `doSomething` from being executed
  }
}

function doSomething (inputVar, callback) {
  // Input variables validation
  inputValidation(inputVar, callback)

  console.log("You shouldn't see this message when something goes wrong with the validation.")
  // do other operations
  callback(null)
}

1 个答案:

答案 0 :(得分:0)

要通过@vlaz通过从验证器返回值来进一步详细说明@vlaz的注释,则可以决定要执行的操作。我不完全知道您的应用程序的结构或功能,但总的来说,我尝试使功能具有一个目的,在这种情况下,验证是确定数据是否有效的过程,调用回调不属于该目的。因此,也许可以执行的重构是:

function isInputValid(inputVar) {
  // perform complex validation logic
  const isValid = inputVar === 'malformed input'
  return isValid
}

function doSomething(inputVar, callback) {
  if(!isInputValid(inputVar)) {
    callback(new Error('malformed input'))
    return
  }

  console.log("Input valid")
  // do other operations
  callback(null)
}

doSomething("foobar", msg => {console.log(`logging callback ${msg}`)})
doSomething("malformed input", msg => {console.log(`logging callback ${msg}`)})

对于像这样的简单示例来说,这看起来有点愚蠢,但是当输入验证变得越来越复杂时,您可以将该验证移到一个单独的文件中,并独立于doSomething逻辑来测试验证逻辑。

我还将// do other operations引用的操作移到另一个函数。同样,这将有助于提高可读性和可测试性。