正如我一直所理解的那样,对程序状态的任何更改(或与IO有关的任何内容)都是副作用。无论是在全局变量中还是在调用该方法的对象的私有字段中发生更改都无关紧要。因此,所有不返回任何内容的方法都不会做任何事情或者产生副作用。
我的困惑来自我们大学的一名教师(他仍然是学生,因此还不是无所不知;))告诉我安装者没有副作用。
答案 0 :(得分:6)
你的导师错了。向SO编辑道歉,因为没有粘贴整篇文章,这就是维基百科所说的:
http://en.wikipedia.org/wiki/Side_effect_(computer_science)
货币报价#1:
在计算机科学中,如果除了产生一个值之外,它还修改某个状态或者与调用函数或外部世界有可观察的交互,那么函数或表达式就会产生副作用。
货币报价#2:
在存在副作用的情况下,程序的行为取决于过去的历史;也就是说,评估的顺序很重要。
非NOP Setter始终满足该标准。
答案 1 :(得分:0)
getter和setter只是get_和set_方法的语法糖。他们可以绝对有副作用(虽然当所有调用者想要增加一个计数器或其他东西时开始调整很多字段可能是一个坏主意。)
答案 2 :(得分:0)
首先:我知道语言不可知标签!" 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;
}
}
更重要的是,即使是一种根本没有被调用的方法也会导致副作用! 想想反射(程序查询有关其自身结构的信息的能力)。 当一个方法存在但没有被调用时,它仍然可以通过反射来检测。
没有调用它的方法肯定会对输出内部方法数量的程序产生副作用!
这一切归结为:如果你想知道方法的实际副作用,你首先必须确定你甚至认为是副作用"。