纯净和不纯的功能之间的区别?

时间:2014-03-14 02:56:43

标签: java accessor

我假设纯函数必须始终具有返回类型(即,不能是void)并且必须具有相同的输出,而不管对象的状态和Impure函数是否会更改对象的状态或打印对象的状态。

但我使用的教科书指出:

  

访问器通常包含return语句,但是打印有关对象状态的信息的方法也可以被归类为访问者。

我很困惑。哪一个是正确的?

修改

有点澄清,让我问的是这个问题:

最后一个问题是" 给出使用的功能类型"并且那里评论的人声称这是一个不纯的功能,因为它正在打印。

这个功能是纯粹的还是不纯的?

5 个答案:

答案 0 :(得分:26)

内容取自this link

纯粹功能的特征:

  1. 纯函数的返回值完全取决于其参数 因此,如果使用相同的参数集调用纯函数,则始终会获得相同的返回值。

  2. 它们没有任何副作用,如网络或数据库调用

  3. 他们不会修改传递给他们的参数
  4. 不纯函数的特征

    1. 不纯函数的返回值不仅取决于其参数 因此,如果使用相同的参数集调用不纯函数,则可能会获得不同的返回值 例如,Math.random(),Date.now()

    2. 它们可能有任何副作用,如网络或数据库调用

    3. 他们可能会修改传递给他们的参数

    4. function impureFunc(value){
        return Math.random() * value;
      }
      
      function pureFunc(value){
        return value * value;
      }
      
      var impureOutput = [];
      for(var i = 0; i < 5; i++){
         impureOutput.push(impureFunc(5));
      }
      
      var pureOutput = [];
      for(var i = 0; i < 5; i++){
         pureOutput.push(pureFunc(5));
      }
      
      console.log("Impure result: " + impureOutput); // result is inconsistent however input is same. 
      
      console.log("Pure result: " + pureOutput); // result is consistent with same input

答案 1 :(得分:8)

Wikipedia - 如果这两个关于函数的语句都成立,则函数可以被描述为纯函数

  1.     在给定相同参数值的情况下,该函数始终评估相同的结果值。函数结果值不能依赖于程序执行过程中或程序的不同执行之间可能发生变化的任何隐藏信息或状态,也不依赖于I / O设备的任何外部输入。
  2.     对结果的评估不会导致任何语义上可观察的副作用或输出,例如可变对象的突变或输出到I / O设备。
  3. 因此,如果与您的代码相比,任何一个语句都是false,那么它就是不纯的。

答案 2 :(得分:3)

Mu.根据定义,您似乎假设访问者是纯函数。情况不一定 - 访问者(甚至是get - 访问者返回值)可能不纯,例如get LinkedHashMap方法处于访问顺序模式时(它以迭代顺序将请求的条目移动到最后一个位置。)

答案 3 :(得分:2)

两个陈述都是正确的。

当您创建获取值的方法时,这些方法称为 ACCESSOR METHODS

<强> 实施例

public String getName(){
    return this.name;
}

对于设置值,我们使用 VOID 的方法,这些方法称为 MUTATOR METHODS

<强> 实施例

public void setName(String n){
    this.name=n;
}

答案 4 :(得分:1)

Impure Functions或Mutator方法更改对象的状态并修改存储在Instance Variables中的值。