【问题标题】:About ' testable result ' in pure function关于纯函数中的“可测试结果”
【发布时间】:2020-12-27 03:23:57
【问题描述】:

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

【问题讨论】:

    标签: pure-function


    【解决方案1】:

    “可测试的结果”不是 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 流并且很有可能得到不同的结果。

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

    【讨论】:

    • 谢谢@jtwalters。这对我非常有用。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多