关于纯函数中的“可测试结果”
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 流并且很有可能获得不同的结果。
编辑:纯函数最重要的情况是因为它们是“可测试的”,因此您可以毫无顾虑地进行单元测试,并且不会在代码中产生“副作用”。
在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 流并且很有可能获得不同的结果。
编辑:纯函数最重要的情况是因为它们是“可测试的”,因此您可以毫无顾虑地进行单元测试,并且不会在代码中产生“副作用”。