关于纯函数中的“可测试结果”

About ' testable result ' in pure function

JavaScript中有一个概念叫pure function。它的一个特点是它总是returns一个testable result。我对此很困惑。我想知道定义和目标及其原因。

“可测试结果”不是 JS 术语。是一个物理术语。当您说“可测试的结果”时,您进行相同的操作并获得相同的结果。

例如:

  • 如果你在相同的距离扔球,它总是会同时落地
  • 如果您在 1 小时内以 60 公里/小时的速度行驶,您将行驶 60 公里。

因此,在软件中,可测试的结果将是函数,当您传递相同的参数时,您将获得相同的结果。

例如:

  • cos(x) // 总是一样
  • max(a,b,c) // 总是一样
  • uppercase(str) // 总是一样

不可测试的结果:

  • random(from, to) // 差异结果
  • uuid(str) // 差异结果
  • getNowTime(format) // 差异结果

现在,pure-function的概念是:

  • 是一个“可测试的结果” (换句话说:如果你发送相同的参数你会得到相同的结果)
  • 不使用输入或输出流
  • 不使用全局变量(仅局部变量和参数)
  • 不改变局部静态变量
  • 不改变任何参数

在javascript个非纯函数的例子中:

// Is not a testable result 
function notPure(max, min) {
    return Math.random() * (max - min) + min;
}

// Use output stream
function notPure(name) {
    const res = "hi " + name;
    console.log(res);
    return res;
}

// Use global variable [This is a testable result but not pure because global variable]
const globalVar = "jett";
function notPure(lastname) {
    return "hi " + globalVar + " " + lastname;
}

// In JS don't exist "local static variables" so is impossible to replicate this case

// Change an argument
function notPure(obj, key, val) {
    obj[key] = val;
    return obj;
}

一些纯函数的例子是:

function pure(a, b) {
   return a + b;
}

function pure(name, lastname) {
   return "hi " + name + " " + lastname;
}

function pure(obj, key, val) {
   const res = JSON.parse(JSON.stringify(obj));
   res[key] = val;
   return res;
}

在某些示例中,您会看到“如果有 HTTP 请求不是纯函数”,这是因为 HTTP request 使用 I/O 流并且很有可能获得不同的结果。

编辑:纯函数最重要的情况是因为它们是“可测试的”,因此您可以毫无顾虑地进行单元测试,并且不会在代码中产生“副作用”。