正如我一直理解的那样,对程序状态(或与 IO 相关的任何事情)的任何更改都是副作用。更改是发生在全局变量中还是发生在调用该方法的对象的私有字段中都没有关系。因此,所有不返回任何内容的方法要么什么都不做,要么有副作用。
我的困惑来自我们大学的一位讲师(他仍然是学生,因此还不是无所不知的;))告诉我二传手没有副作用。
3 回答
你的导师搞错了。对于没有将整篇文章粘贴到此处的 SO 编辑表示歉意,这就是 Wikipedia 必须说的:
http://en.wikipedia.org/wiki/Side_effect_(computer_science)
金钱报价#1:
在计算机科学中,如果一个函数或表达式除了产生一个值之外,它还修改了某些状态或与调用函数或外部世界有可观察的交互,则称它具有副作用。
金钱报价#2:
在存在副作用的情况下,程序的行为取决于过去的历史;也就是说,评估的顺序很重要。
非 NOP 设置器始终满足该标准。
getter 和 setter 只是 get_ 和 set_ 方法的语法糖。它们绝对会产生副作用(尽管当调用者想要增加一个计数器或其他东西时开始调整大量字段可能是个坏主意)。
首先:我知道与语言无关的标签!“runako”非常正确地回答了这个问题。但通常你想将你的知识应用到现实世界中,所以我想我也很乐意提供一个以更务实的方式解决这个问题的答案。
在处理像 c++、c# 或 java 这样的现实世界语言时,即使是 nop 函数也会有实际的副作用,这可能会导致代码被执行!
想想静态构造函数。尽管规范并不总是指定为类运行静态构造函数的时间,但大多数时候它将是第一次访问该类的方法或成员的时间点。
C# 中的示例:
class NotSoObvious
{
static NotSoObvious()
{
CauseSomeSideEffects();
}
// calling this can cause the constructor to run first!
public static void DoNothing()
{
return;
}
}
更重要的是,即使是根本不被调用的方法也会导致副作用!想想反射(程序查询有关其自身结构的信息的能力)。当一个方法存在但没有被调用时,它仍然可以通过反射检测到。
没有调用的方法肯定会对输出内部方法数量的程序产生副作用!
这一切都归结为:如果您想了解一种方法的实际副作用,您首先必须确定您甚至认为是什么“副作用”。