【发布时间】:2010-11-07 14:49:04
【问题描述】:
有人能告诉我下面一行中“副作用”的含义吗?
如果你调用一个不返回任何东西的 EL 函数,那么你调用它只是为了它的副作用。
【问题讨论】:
有人能告诉我下面一行中“副作用”的含义吗?
如果你调用一个不返回任何东西的 EL 函数,那么你调用它只是为了它的副作用。
【问题讨论】:
这意味着您没有调用数学意义上的“真实”函数。这样的函数总是返回一个值,这完全由它的输入参数决定。没有要修改的“状态”,也不会发生其他任何事情。这就是为什么从并行化的角度来看函数式编程很有趣的原因。它更容易证明,例如两个函数调用是独立的,可以并行运行。
有关更多详细信息,请参阅pure functions 上的维基百科条目。
【讨论】:
副作用是方法除了计算和返回值之外所做的任何事情。实例或类字段值的任何更改都是副作用,就像在屏幕上绘图、写入文件或网络连接一样。
严格来说,“函数”被定义为没有副作用——这就是 Java 使用“方法”这个词的原因。没有返回值的真正函数将毫无意义。
显然,没有返回值的方法必须具有某种副作用来证明其存在是合理的。设置方法就是一个例子 - 副作用是改变对象的内部状态。
【讨论】:
副作用是方法调用改变了类的状态。所以
public class SideEffectClass{
private int state = 0;
public doSomething(int arg0){
state += arg0;
}
}
这里,doSomething(int arg0) 有改变状态变量的副作用。
当你想到一个程序时,你可以把它想象成指令 + 状态 + 输入。所以如果一个程序的域是所有可能的输入*状态的范围,并且程序有副作用,你可以看到应用程序可能结果的共域会随着副作用数量的增加而爆炸式增长。这使得程序的可能状态很大,从而导致复杂的测试。函数式编程范式旨在消除副作用。通过使函数成为一等公民,并使所有声明不可变,函数式编程可以防止副作用,这使得函数式编程在并行处理中大放异彩,因为同步问题减少了。
【讨论】:
让我们稍微操作一下上面给定的代码,以便比较清楚。
public class SideEffectClass{
private int state = 0;
public doSomething(...){//Does not matter
state ++;
}
}
【讨论】:
当您使用药物时,它的副作用是通常不希望出现的不良影响。使用它的主要目的是获得它的“需求”效果。在这里,我们从函数的角度来看,一般在调用它们的时候会得到一个计算值并使用。还有其他功能,它们在计算“需求”值时也会改变一些值,所以这里的“改变一些值”是一个副作用。在你的句子描述中,如果一个函数没有返回任何东西,它只用于它的副作用,所以这里的副作用是“改变一些值”。
【讨论】: